通过健康检查让你的Oracle数据库远离损坏
俗话说解决一件事往往能有种办法那么我们如何按照这些方法去做?
甲骨文公司发布Oracle g时在被称作为健康监控器的框架下推出了数据库健康检查功能在这个框架内健康检查运行目的是诊断检查你的Oracle数据库它将监测数据库的各个不同组成部分—主要是检查损坏包括物理和逻辑上的虽然没有种方式 但甲骨文有的是正如我们在过去关于自动诊断库(Automatic Diagnostic RepositoryADR)的文章上看到的那些还试图通过ADR执行和接入到健康检查然而正如我们将看到它也许不是最好的办法做到这一点
所以在你的数据库中有数据文件块撤消重做字典或坐标系损坏吗?你实际上可能运行得很好因此甚至我们不知道这些损坏的存在正如我们将看到在下面的例子中我有一个新安装的Oracle并且有些损坏在其中我真正地希望搜寻那些错误; 但那是在另一天当运行健康检查你作为一个数据库管理员可以决定是使用临时模式还是使用完全反应模式运行当以完全反应模式运行时会有人会抱怨错误讯息或你可能会看到一个Oracle警报警告运行健康检查所出现的错误你还可以通过使用DBMS_HM PL/SQL软件包进行健康检查操作依赖于这些是如何运行在你的系统上他们将花费多久你如何频繁看到损坏信息你可能要安排这些作为一个任务不过请注意这是一个新功能并附带所有其他的新功能你应该 %相信他们不会造成损坏或锁定你的系统只要适当低测试和监视那些操作同样值得注意的是这些健康检查可以运行在在线和现有的据库上或者当数据库是离线( NOMOUNT )时 由于有多种类型的健康检查因此有些健康检查只能运行在离线数据库的上举例来说重做完整性检查只能是脱机运行当仔细想想就能明白这其中的奥秘不用进行各个不同的损坏/完整性检查你可以使用下列SQL查看他们它可以让你知道那些检查是可以在线进行的那些检查是要在脱机的情况下进行的
SQL> SELECT nameinternal_checkoffline_capabledescription FROM v$hm_check;
NAME I O DESCRIPTION
HM Test Check Y Y Check for HM Functionality
DB Structure Integrity Check N Y Checks integrity of all database files
Data Block Integrity Check N Y Checks integrity of a datafile block
Redo Integrity Check N Y Checks integrity of redo log content
Logical Block Check Y N Checks logical content of a block
Transaction Integrity Check N N Checks a transaction for corruptions
Undo Segment Integrity Check N N Checks integrity of an undo segment
All Control Files Check Y Y Checks all control files in the database
CF Member Check Y Y Checks a multiplexed copy of the control file
All Datafiles Check Y Y Check for all datafiles in the database
Single Datafile Check Y Y Checks a datafile
Log Group Check Y Y Checks all members of a log group
Log Group Member Check Y Y Checks a particular member of a log group
Archived Log Check Y Y Checks an archived log
Redo Revalidation Check Y Y Checks redo log content
IO Revalidation Check Y Y Checks file accessability
Block IO Revalidation Check Y Y Checks file accessability
Txn Revalidation Check Y N Revalidate corrupted txn
Failure Simulation Check Y Y Creates dummy failures
Dictionary Integrity Check N N Checks dictionary integrity
由于一些健康检查需要额外的输入参数为了简便起见我决定只演示那里有不需要输入参数的检查如果你想要看看那些需要输入参数的检查你可以执行下列SQL中我在Oracle文件中发现的
SELECT cname check_name pname parameter_name
ptype pdefault_value pdescription
FROM v$hm_check_param p v$hm_check c
WHERE pcheck_id = cid and cinternal_check = N
ORDER BY cname;
我不知道我已经遭遇多少次字典问题从字典表的错误信息到锁定问题所以我对字典完整性检查比较兴奋字典完整性检查将检查字典的核心对象完整性包括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$这是我很关心的一个很好很长的列表以及检查应该看看字典的条目内容制约因素和参照完整性
通过手动运行字典完整性检查我们需要分配下列DBMS_HMRUN_CHECK PL/SQL软件包—给予该操作额外的名称在这个例子中我将命名我的操作为DICTIONARY_CHECK_
BEGIN
DBMS_HMRUN_CHECK(Dictionary Integrity Check
DICTIONARY_CHECK_);
END;
/
现在这是它得到一些有趣的DBMS_HMRUN_CHECK在ADR存贮其相关信息因此使用DBMS_HM PL/SQL软件包或ADRCI功能生成的报告对我来说当DBMS_HM PL/SQL软件包将以HTML XML或文本格式输出报告时我们已经没有多少选择 因为ADRCI功能只以XML的形式输出报告 然而我们通过对比这两种方法能使我们看到ADR存在的不足以及知道ADR和DBMS_HM在什么地方功能有重叠
由于DBMS_HMRUN_CHECK将其信息存储在ADR中我们可以很容易地看到HM_RUN 通过输入下列ADRCI命令
adrci> show hm_run
ADR Home = /opt/app/oracle/diag/rdbms/dbfs/dbFS:
*****************************************************
**********************************************************
HM RUN RECORD
**********************************************************
RUN_ID
RUN_NAME DICTIONARY_CHECK_
CHECK_NAME Dictionary Integrity Check
NAME_ID
MODE
START_TIME :: :
RESUME_TIME
END_TIME :: :
MODIFIED_TIME :: :
TIMEOUT
FLAGS
STATUS
SRC_INCIDENT_ID
NUM_INCIDENTS
ERR_NUMBER
REPORT_FILE
这最显着的信息或缺失信息是REPORT_FILE为 此栏只有当报告生成时才能被填充建立一个报告可以通过DBMS_HM包或通过ADRCI的 CREATE REPORT命令
使用DBMS_HM包
SET LONG
SET LONGCHUNKSIZE
SET PAGESIZE
SET LINESIZE
SELECT DBMS_HMGET_RUN_REPORT(DICTIONARY_CHECK_) FROM DUAL;
使用ADRCI CREATE REPORT命令
CREATE REPORT hm_run DICTIONARY_CHECK_
When using the DBMS_HM package the output looks like:
当使用DBMS_HM包时输出结果如下
DBMS_HMGET_RUN_REPORT(DICTIONARY_CHECK_)
Basic Run Information
Run Name : DICTIONARY_CHECK_
Run Id :
Check Name : Dictionary Integrity Check
Mode : MANUAL
Status : COMPLETED
Start Time : :: :
End Time : :: :
Error Encountered :
Source Incident Id :
Number of Incidents Created :
Input Paramters for the Run
TABLE_NAME=ALL_CORE_TABLES
CHECK_MASK=ALL
Run Findings And Recommendations
Finding
Finding Name : Dictionary Inconsistency
Finding ID :
Type : FAILURE
Status : OPEN
Priority : CRITICAL
Message : SQL dictionary health check: file$ pk on object FILE$
failed
Message : Damaged rowid is AAAAARAABAAAAByAAF description: No further
damage description available
Finding
Finding Name : Dictionary Inconsistency
Finding ID :
Type : FAILURE
Status : OPEN
Priority : CRITICAL
Message : SQL dictionary health check: dependency$dobj# fk on
object DEPENDENCY$ failed
Message : Damaged rowid is AAAABnAABAAAOiHABI description: No further
damage description available
Finding
Finding Name : Dictionary Inconsistency
Finding ID :
Type : FAILURE
Status : OPEN
Priority : CRITICAL
Message : SQL dictionary health check: dependency$dobj# fk on
object DEPENDENCY$ failed
Message : Damaged rowid is AAAABnAABAAAQXqAA description: No further
damage description available
运行后DBMS_HM包或ADRCI 的CREATE REPORT命令后我们可以重新输入ADRCI显示hm_run命令现在可以看到REPORT_FILE信息被填充了
REPORT_FILE /opt/app/oracle/diag/rdbms/dbfs/dbFS/hm/HMREPORT_DICTIONARY_CHECK_hm
当使用ADRCI功能你必须先运行生成报告文件的命令如果该文件不存在那么运行另一个命令以显示其内容你还可以查看该报告通过ADRCI输入以下命令因为输出的结果在XML文档中因此它不会在这里显示
show report hm_run DICTIONARY_CHECK_
不管用什么方法这些检查结果对调查Oracle数据库的损坏将是一个重要的信息虽然我还没有进行任何详细的测试包括时机锁定或性能等问题对此应该谨慎使用任何时候执行损坏检查必须有某种形式的对象锁定这将只需要时间来观看这些程序在一个数据库上操作的步骤和实际效果其实我知道事情会是怎样如果你有问题你不希望找到他们吗?这对DBA来说只不过是另一个值得骄傲的成就