a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 134|回复: 2

[考试辅导] Oracle技术:如何对Oracle进行安全健康检查

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
通过健康检查让你的Oracle数据库远离损坏。
$ G, F# T+ s! O% \+ T5 E  俗话说,解决一件事往往能有100种办法....那么我们如何按照这些方法去做?+ O- |6 W& h8 d  V2 c
  甲骨文公司发布Oracle 11g时,在被称作为健康监控器的框架下推出了数据库健康检查功能。在这个框架内健康检查运行目的是诊断检查你的Oracle数据库。它将监测数据库的各个不同组成部分—主要是检查损坏,包括物理和逻辑上的。虽然没有100种方式... ,但甲骨文有的是,正如我们在过去关于自动诊断库(Automatic Diagnostic Repository-ADR)的文章上看到的那些,还试图通过ADR执行和接入到健康检查。然而,正如我们将看到,它也许不是最好的办法做到这一点。
! J9 y( p. U% {0 j4 U% e6 D  所以,在你的数据库中有数据文件,块,撤消,重做,字典,或坐标系损坏吗?你实际上可能运行得很好,因此甚至我们不知道这些损坏的存在。正如我们将看到,在下面的例子中,我有一个新安装的Oracle并且有些损坏在其中。我真正地希望搜寻那些错误; 但那是在另一天。当运行健康检查,你作为一个数据库管理员,可以决定是使用临时模式还是使用完全反应模式运行,当以完全反应模式运行时会有人会抱怨错误讯息或你可能会看到一个Oracle警报警告运行健康检查所出现的错误。你还可以通过使用DBMS_HM PL/SQL软件包进行健康检查操作。依赖于这些是如何运行在你的系统上,他们将花费多久,你如何频繁看到损坏信息,你可能要安排这些作为一个任务。不过,请注意,这是一个新功能,并附带所有其他的新功能,你应该100 %相信他们不会造成损坏或锁定你的系统。只要适当低测试和监视那些操作。同样值得注意的是,这些健康检查可以运行在在线和现有的据库上,或者当数据库是离线( NOMOUNT )时 。由于有多种类型的健康检查,因此有些健康检查,只能运行在离线数据库的上。举例来说,重做完整性检查只能是脱机运行,当仔细想想就能明白这其中的奥秘。不用进行各个不同的损坏/完整性检查,你可以使用下列SQL查看他们。它可以让你知道那些检查是可以在线进行的,那些检查是要在脱机的情况下进行的。
$ L1 Z! [/ M! w" n+ `8 H% y  SQL> SELECT name,internal_check,offline_capable,description FROM v$hm_check;
  M! s8 }# ?9 Z- c" J. N  NAME I O DESCRIPTION% C- c% C$ D3 k: Y
  HM Test Check Y Y Check for HM Functionality
) Q9 \5 o& B1 \+ p: w  DB Structure Integrity Check N Y Checks integrity of all database files4 S/ o6 X' _1 B/ E3 }1 |- z
  Data Block Integrity Check N Y Checks integrity of a datafile block
# V; v2 E' s# x6 w. X  Redo Integrity Check N Y Checks integrity of redo log content6 p0 |8 V: F0 w- J. n
  Logical Block Check Y N Checks logical content of a block
+ Q, {7 [: p% l6 a/ `3 y  Transaction Integrity Check N N Checks a transaction for corruptions
* ]! {' h: B+ V% \* Y% }  Undo Segment Integrity Check N N Checks integrity of an undo segment
9 F9 y' T3 v% A) U; M  All Control Files Check Y Y Checks all control files in the database# F+ L; L& R% W( L4 L% A
  CF Member Check Y Y Checks a multiplexed copy of the control file- p7 p7 \" ?: x0 W/ F* c' U
  All Datafiles Check Y Y Check for all datafiles in the database
0 q3 w6 {* R' y# D  Single Datafile Check Y Y Checks a datafile
, Q" h$ @+ N4 [  u) V4 o  Log Group Check Y Y Checks all members of a log group
) Z; ^, K5 }2 t; e$ k7 j  Log Group Member Check Y Y Checks a particular member of a log group
% D- x: o1 P" x  Archived Log Check Y Y Checks an archived log
9 ]# I  I# Q+ T- q+ e8 l  Redo Revalidation Check Y Y Checks redo log content. S, |3 G0 y7 ?! K$ B* f7 _
  IO Revalidation Check Y Y Checks file accessability8 b% \1 o0 Y$ A# c2 I) S7 U
  Block IO Revalidation Check Y Y Checks file accessability3 _+ A% b* R" n# x5 _
  Txn Revalidation Check Y N Revalidate corrupted txn
7 {& t2 a+ A% C* X! b) [; a) Q  Failure Simulation Check Y Y Creates dummy failures
% E( d: r+ R/ z6 Z& s+ C( s: Q  Dictionary Integrity Check N N Checks dictionary integrity
, P/ |# E3 C. b* Q  由于一些健康检查需要额外的输入参数,为了简便起见,我决定只演示那里有不需要输入参数的检查。如果你想要看看那些需要输入参数的检查,你可以执行下列SQL中,我在Oracle文件中发现的:0 S; v5 u; d4 `4 ^8 c) ^% ?( _
  SELECT c.name check_name, p.name parameter_name,3 A, O) A7 I( m) x
  p.type, p.default_value, p.description
& p0 P' A% e6 z% B& U  FROM v$hm_check_param p, v$hm_check c
' l# |% o$ V/ J9 K  WHERE p.check_id = c.id and c.internal_check = 'N'
2 P, V: C8 Y/ D8 ~& `  ORDER BY c.name;
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle技术:如何对Oracle进行安全健康检查

  我不知道我已经遭遇多少次字典问题-从字典表的错误信息到锁定问题-所以我对字典完整性检查比较兴奋。字典完整性检查将检查字典的核心对象完整性,包括:tab$, clu$, fet$, uet$, seg$, undo$, ts$, file$, obj$, ind$, icol$, col$, user$, con$, cdef$, ccol$, bootstrap$, objauth$, ugroup$, tsq$, syn$, view$, typed_view$, superobj$, seq$, lob$, coltype$, subcoltype$, ntab$, refcon$, opqtype$, dependency$, access$, viewcon$, icoldep$, dual$, sysauth$, objpriv$, defrole$, 和 ecol$。这是我很关心的一个很好很长的列表,以及检查应该看看字典的条目内容,制约因素和参照完整性。
8 Y+ Q# i- x$ v( j  v  通过手动运行字典完整性检查,我们需要分配下列DBMS_HM.RUN_CHECK PL/SQL软件包—给予该操作额外的名称。在这个例子中,我将命名我的操作为DICTIONARY_CHECK_11032008。8 f& ~1 F+ v; q, b# N& v0 J4 U
  BEGIN: o6 o7 u0 B5 O& @: R& v7 G
  DBMS_HM.RUN_CHECK('Dictionary Integrity Check',2 d( D' h) S, `4 M
  'DICTIONARY_CHECK_11032008');
% k2 Y1 a; ?5 x2 A, T% m  END;
7 Q1 _8 k! C+ ?& j  /
; L9 P* |: ^5 w$ h/ u6 L  现在,这是它得到一些有趣的。DBMS_HM.RUN_CHECK在ADR存贮其相关信息,因此使用DBMS_HM PL/SQL软件包或ADRCI功能生成的报告。对我来说,当DBMS_HM PL/SQL软件包将以HTML , XML或文本格式输出报告时,我们已经没有多少选择。 因为ADRCI功能只以XML的形式输出报告 。然而,我们通过对比这两种方法能使我们看到ADR存在的不足以及知道ADR和DBMS_HM在什么地方功能有重叠。
+ {! o5 g: W" C3 I. m  由于DBMS_HM.RUN_CHECK将其信息存储在ADR中,我们可以很容易地看到HM_RUN ,通过输入下列ADRCI命令。
* |+ O6 W% x" N3 s$ J8 U! h  adrci> show hm_run
% R0 J0 `$ j! M0 n) p; s# c  ADR Home = /opt/app/oracle/diag/rdbms/db11fs/db11FS:# A/ B4 h- N! b) z$ g! @
  HM RUN RECORD 3
7 r1 w7 k  Z8 \3 A0 D' b; y  RUN_ID 412 r- N) |! C$ L% k8 W4 w$ P$ f
  RUN_NAME DICTIONARY_CHECK_11032008
- x. ~6 e" b" Y) f  CHECK_NAME Dictionary Integrity Check
- C0 b6 G6 {7 b, y& S% j2 f  NAME_ID 247 T  p9 l6 G- F: |
  MODE 0( O- o4 n1 v6 u" Y* J/ ^9 D
  START_TIME 2008-11-03 18:32:10.819805 -07:00
0 E2 r) f4 @( c9 X  RESUME_TIME
/ j% u% G3 H8 \6 r$ [  END_TIME 2008-11-03 18:32:18.827387 -07:00
6 w# l5 [8 u9 G7 S/ y  MODIFIED_TIME 2008-11-03 18:32:18.827387 -07:00
3 I9 U3 p7 Y3 o( W  TIMEOUT 0
3 D. g" P0 n5 [- m$ }  FLAGS 0" ]) w9 m0 n' c8 f1 }: c
  STATUS 54 \* x0 Y, P) Y- J4 R
  SRC_INCIDENT_ID 0
9 e8 l1 i) ]2 Z$ @& y  NUM_INCIDENTS 0
8 z* d- b) ^) B' ]  r  ERR_NUMBER 0
5 w1 S( L; o% @; j) `  REPORT_FILE
; W& c) g7 T: c! e8 A  这最显著的信息,或缺失信息,是REPORT_FILE为 。此栏只有当报告生成时才能被填充。建立一个报告可以通过DBMS_HM包或通过ADRCI的 CREATE REPORT命令。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:21 | 显示全部楼层

Oracle技术:如何对Oracle进行安全健康检查

使用DBMS_HM包
0 ^- D; w+ |: n0 S" m0 b  SET LONG 100000  J3 O( L6 j: v" s, c& p
  SET LONGCHUNKSIZE 10003 h9 w7 _9 {% Q% k# b, O
  SET PAGESIZE 1000& L) o' R) p' m0 Q4 ~- r
  SET LINESIZE 512/ S% v" h1 ]! ?# H) f
  SELECT DBMS_HM.GET_RUN_REPORT('DICTIONARY_CHECK_11032008') FROM DUAL;
3 s3 Z  w# Z  e* \: {9 O- L. P  使用ADRCI CREATE REPORT命令
5 U' A6 B8 E* Y) q4 n  CREATE REPORT hm_run DICTIONARY_CHECK_110320087 V4 v7 o6 V- Q0 b( F2 B( _
  When using the DBMS_HM package the output looks like:* l% ], Z8 Z  H% S: z( x) Z( @, B# ^( n
  当使用DBMS_HM包时输出结果如下:+ ~; Y; _5 V  @* e+ \2 w# w
  DBMS_HM.GET_RUN_REPORT('DICTIONARY_CHECK_11032008')
0 q( n! V! j% D$ H5 S  Basic Run Information
  J- P  ?  B- Z% F" r$ ?; D  Run Name : DICTIONARY_CHECK_11032008
$ p4 N' c& m: ^4 J  Run Id : 41& Y/ X' O) W3 |9 O. Y4 k
  Check Name : Dictionary Integrity Check
$ E! z9 Y+ w2 T1 f! h: J4 S( u  Mode : MANUAL5 A3 x. r, e% R
  Status : COMPLETED, J. f1 n) g# B* K. I
  Start Time : 2008-11-03 18:32:10.819805 -07:00
5 W0 m- ^& r1 z. h( o4 h/ T1 ]  End Time : 2008-11-03 18:32:18.827387 -07:00
3 Z( N1 u2 n: w7 r. Z  Error Encountered : 0
8 a- S6 o7 H/ j4 c$ H; ]  Source Incident Id : 0& v, q+ _0 Y0 j/ r$ d$ s
  Number of Incidents Created : 0- F3 y! ]* K, a1 T4 S* _5 v
  Input Paramters for the Run* I. U& [# T/ T' s" E5 u- }
  TABLE_NAME=ALL_CORE_TABLES, v' d! Y9 e( s2 d+ S/ U: E
  CHECK_MASK=ALL
& z2 w+ J$ }* X  o5 u$ @  Run Findings And Recommendations
" J1 X* F4 j! S, |  Finding& y" [* D# D  N5 M* r$ s
  Finding Name : Dictionary Inconsistency
8 i( q0 y6 }0 |' v  Finding ID : 42- P% ~. x! n/ h* {9 `' _
  Type : FAILURE9 R0 Q3 ^6 r1 _
  Status : OPEN
. r% d( u$ U9 h  Priority : CRITICAL7 \8 V& D3 G* ~
  Message : SQL dictionary health check: file$ pk 42 on object FILE$) M$ |0 U9 v& i0 P
  failed/ Z, \  J8 t7 C8 e6 q: o
  Message : Damaged rowid is AAAAARAABAAAAByAAF - description: No further$ R  r% w- g" K
  damage description available
4 [9 Q8 d# c* ]# D1 C0 ~  Finding/ v5 t$ X1 z, H! W- k7 n4 E' c
  Finding Name : Dictionary Inconsistency
) V1 i0 W+ ]( b. N1 ^  Finding ID : 45; l' a) N& z% j# Y& i& ^
  Type : FAILURE! `' R5 r+ n3 h9 U$ g, c" J6 B
  Status : OPEN
2 ?9 ^% I# [: x7 n  E  Priority : CRITICAL
% E! z4 t( f5 ]: y' A- n! ~  Message : SQL dictionary health check: dependency$.dobj# fk 126 on6 y) ~/ R; T! K- I2 P5 M, Y% Z- ^
  object DEPENDENCY$ failed+ r2 V1 N. \) l
  Message : Damaged rowid is AAAABnAABAAAOiHABI - description: No further
7 M" f, L# H# N+ I0 d! D  damage description available# e; b' N0 n! k
  Finding
  V/ g' w& u/ t0 Z0 R$ p. j  Finding Name : Dictionary Inconsistency
$ B  |9 ?6 l& h  Finding ID : 48
7 G" a* d$ Z5 C" y# v6 W, C5 I  Type : FAILURE* R. b$ p; b* A1 {
  Status : OPEN
% d  b0 l: ?9 O* u7 X( j  Priority : CRITICAL
% n2 B% R( v0 F8 j8 C! S, u  Message : SQL dictionary health check: dependency$.dobj# fk 126 on, S8 w% C/ p$ i7 O
  object DEPENDENCY$ failed7 ]5 y& b% G/ ?4 Z
  Message : Damaged rowid is AAAABnAABAAAQXqAA6 - description: No further
4 c$ h8 ?9 ?# G3 B- t  damage description available0 V0 [. C% Q3 M% v! S1 h4 s  }
  运行后DBMS_HM包或ADRCI 的CREATE REPORT命令后,我们可以重新输入ADRCI显示hm_run命令,现在可以看到REPORT_FILE信息被填充了。3 G4 w+ g& l  {
  REPORT_FILE /opt/app/oracle/diag/rdbms/db11fs/db11FS/hm/HMREPORT_DICTIONARY_CHECK_11032008.hm( e  I. }2 _( T: E3 L
  当使用ADRCI功能,你必须先运行生成报告文件的命令,如果该文件不存在,那么运行另一个命令,以显示其内容。你还可以查看该报告通过ADRCI输入以下命令。因为输出的结果在XML文档中,因此它不会在这里显示。
! \1 E; T% M3 g. J. }0 O# ~  show report hm_run DICTIONARY_CHECK_11032008
" s% A: U  s) H- p  不管用什么方法,这些检查结果对调查Oracle数据库的损坏将是一个重要的信息。虽然我还没有进行任何详细的测试,包括时机,锁定,或性能等问题,对此应该谨慎使用。任何时候执行损坏检查,必须有某种形式的对象锁定。这将只需要时间来观看这些程序在一个数据库上操作的步骤和实际效果。其实我知道事情会是怎样,如果你有问题,你不希望找到他们吗?这对DBA来说只不过是另一个值得骄傲的成就。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-5 23:14 , Processed in 0.192501 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表