调查和解决问题
问题:
数据库中的任一严重的错误定义为一个问题,一般来说,这些错误包括大家熟悉的ORA-600错误和ORA-04031(共享池超出)错误,涉及数据库问题的所有元数据都存储在ADR中,每个问题分配一个问题键(problem key),它帮助标示和描述该问题,问题键包含oracle错误编码和错误参数值,下面给出一个例子(来自adrci工具中show incident命令的部分输出):
INCIDENT_ID PROBLEM_KEY CREATE_TIME
---------------- ------------------ ------------------
8801 ORA 600 [4899] 27-MAR-07
意外事件:
意外事件是指某个特定问题的一次出现,因此,如果相同问题出现多次,则用一个问题和多个意外事件来标示该问题的多次出现,一个经常发生的问题由大量意外事件标示,每个意外事件有自己的意外事件ID
当出现一个特定的意外事件时,数据库完成以下三件事:
1. 为该意外事件建立一个警告并给该警告赋予适当的严重级别
2. 在预警日志中(alert log)构造一条关于该意外事件的条目
3. 在ADR的适当子目录中收集和存储该意外事件的相关诊断数据
意外事件打包:
如果系统出现了异常需要取得Oracle技术支持人员协助处理时,以往通常需要手工准备很多的报告文件然后手工打包后发给Oracle support,从11g开始这个过程将大大的简化,可以使用ADRCI命令打包数据库中出现的异常事件,然后将打包后的文件发送到Oracle Support,由Oracle的支持人员做进一步的分析和处理
IPS
是Incident Packaging Service的缩写,事件打包服务是FDI(Fault Diagnosability Infrastructure)故障诊断基础架构中的一项技术,可以对同一次错误或故障相关的数据进行打包,如traces,dumps,health check reports等
使用Oracle在11g版本中提供的ADRCI工具可以非常便利的提供IPS,在之前的版本中如果要完成这个工具基本上是通过手工的方式来完成的
具体操作过程:
1.使用“ips create package”创建一个新的逻辑包
1)进入到adrci命令行界面
2)尝试创建逻辑包
adrci> ips create package;
DIA-48448: This command does not support multiple ADR homes
3)处理报错
错误提示创建逻辑包命令不支持多个ADR HOME,修改正确的ADR HOME
(1)查看当前有的homes情况
adrci> show homes
(2)这里我们选择diag/rdbms/orcl/orcl
adrci> set homepath diag/rdbms/orcl/orcl
(3)确认只有一个home
adrci> show homes
ADR Homes:
diag/rdbms/orcl/orcl
4)再次尝试创建逻辑包,成功。
adrci> ips create package;
Created package 1 without any contents, correlation level typical
2.将诊断数据添加到刚刚创建的逻辑包中
将系统中出现的53475 事件添加到逻辑包1中,在系统中可以使用show incident命令获得incident号
adrci> ips add incident 53475 package 1;
Added incident 53475 to package 1
3.生成物理包
adrci> ips generate package 1 in /export/home/oracle
Generated package 1 in file /export/home/oracle/IPSPKG_20110201110631_COM_1.zip, mode complete
还可以追加文件到PACKAGE 1:
adrci> ips add new incidents package 1
4.简单查看一下解压后的文件目录。可见Oracle在压缩包中自动采集了很多相关信息
unzip IPSPKG_20110201110631_COM_1.zip
可以利用adrci工具配置意外事件的元数据保留期等,执行ips show configuration命令可以查看可用的所有配置参数,如:
adrci>ips show configuration
实验:
对数据库备份:
rman target /
backup database format='/u01/backup/rmanbk/%d_%s.dbf';
将undo表空间数据文件删除:
cd $ORACLE_BASE/oradata/orcl11g/
rm -rf undotbs01.dbf
sqlplus / as sysdba
alter system flush buffer_cache;
conn scott/tiger ----报错
[oracle11g@nylg orcl11g]$ adrci
adrci> show problem
adrci> show incident
adrci> ips create package
Created package 1 without any contents, correlation level typical
adrci> ips add incident 18033 package 1;
Added incident 18033 to package 1
adrci> ips generate package 1 in /u02/adrpac
Generated package 1 in file /u02/adrpac/IPSPKG_20121025092301_COM_1.zip, mode complete
adrci> ips add new incidents package 1;
Added new incidents to package 1
[oracle11g@nylg ~]$ cd /u02/adrpac/
[oracle11g@nylg adrpac]$ ls
IPSPKG_20121025092301_COM_1.zip
[oracle11g@nylg adrpac]$ unzip IPSPKG_20121025092301_COM_1.zip
[oracle11g@nylg adrpac]$ ls
diag IPSPKG_20121025092301_COM_1.zip metadata.xml
cd /u02/adrpac/diag/rdbms/orcl11g/orcl11g
[oracle11g@nylg orcl11g]$ ls
alert hm incident incpkg trace
主动检查各数据库组件可帮助避免潜在的问题
Oracle Database 11g提供了新的监控框架,称为Health Monitor,它对文件系统、内存以及事务处理完整性等数据库组件进行诊断检查,每次检查生成一个包含查找结果以及处理问题的建议等的报告,任何时候只要存在数据库错误,Health Monitor都将自动检查数据库各组件状态
根据数据库中的错误自动进行检查的目的是:在危险严重伤害数据库之前捕捉它们,这些危险包括文件讹误、物理和逻辑块讹误以及数据字典讹误等,这些检查产生一个数据库错误报告,多数情况下含有处理问题的建议,作为DBA还可以选择利用与数据库所进行的自动检查相同的机制,进行主动数据库健康检查
任何时候,只要数据库中存在严重错误,数据库都将自动运行Health Monitor以诊断问题
Health Monitor在ADR中记录所有查找结果,Data Recovery Advisor可以访问其中的结果以便生成报告或处理问题也可以在数据库出问题之后或作为常规的DBA活动,通过Database Control或在Oracle提供的程序包DBMS_HM的帮助下手动运行Health Monitor
health monitor是10g中主动维护的升级版,可以通过Database Control或在Oracle提供的程序包DBMS_HM的帮助下手动运行Health Monitor
检查(check,也称为检查器或健康检查):是用新的Health Monitor登记的诊断操作或过程它帮助估计数据库或其他Oracle组件的健康状况,如果数据库检查发现一个数据库故障(failure)Oracle将把该故障映射为一个数据库修复(repair)
在Oracle Database 11g中,数据库将执行自动激活检查(reactive check),每当出现某种错误时数据库将自动调用一个数据库检查器搜索与该错误有关的故障,之所以称为激活检查,是因为它是对数据库中一个事件作出的反应,不过,Oracle建议在数据库使用较少的时段中进行定期主动检查可利用RMAN或Database Control/Grid Control进行主动数据库检查,如果自动激活检查显示的是特定数据库组件的问题,最好是用受影响数据库组件的主动检查进一步调查问题
故障:代表诊断出来的问题,是指被数据库检查器查出的持续数据讹误,如Redo Check检查器检查重做日志的完整性,如果ADR中记录有故障,可以利用新Data Recovery Advisor得出关于这些故障及处理的建议
可以进行各种类型的Health Monitor检查,包括:检查数据文件讹误、重做检查和检验核心数据库字典对象(如tab$和col$)的完整性等。V$HM_CHECK视图,描述所有可用的Health Monitor检查类型,如下所示:
col name for a40
col description for a50
set pagesize 100
set linesize 100
select name,description from v$hm_check;
可以用两种方式执行健康检查,分别是DB-online(数据库处于打开或安装状态)和DB-offline(数据库处于nomount方式,仅实例启动)即使在数据库脱机的情况下也可以执行大多数Health Monitor检查V$HM_CHECK视图中的列offline_capable示出特定类型的检查是否可以脱机进行
select name,offline_capable,description from v$hm_check;
如前所述,虽然数据库能通过自动执行检查器检测故障,但是此过程只在数据库遇到数据讹误等问题时才启动借助手动执行各种检查,可以在故障导致大范围的损害前捕捉到它们
虽然数据库自动进行激活检查,但最好是定期主动运行检查器,检测至今尚未影响数据库的潜在故障激活检查只在故障影响数据库时才执行,比如说在用户试图从某个讹误数据块中检索数据时才执行激活检查,但是,如果用户没有在数据块讹误后访问它,则该讹误的数据块不会自动导致数据库的故障预警,手动检查有助于捕捉这种可能在某个繁忙时间发作,潜在地降低数据库可用性的隐蔽故障
可使用Database Control或PL/SQL程序包DBMS_HM来进行手动数据库检查,此外,还可以用新的RMAN命令validate进行数据库讹误检查
1.用DBMS_HM程序包进行手动检查
Oracle通过DBMS_HM程序包来进行Health Monitor,使用DBMS_HM程序包的run_check过程进行主动健康检查
desc DBMS_HM
下面列出run_check过程的不同参数所代表的含义
CHECKNAME:数据库检查名,这是一个必需的参数,而且一定要与V$HM_CHECK视图中的检查名匹配
RUNNAME:这是一个可选的参数,它允许指定检查运行名
TIMEOUT:可选,可以用检查能运行的时间长度设置限制
PARAMS:这是一个输入参数,控制检查的运行,可查询V$HM_CHECK_PARM视图查看各种类型的输入
实验:使用dbms_hm来进行数据文件完整性的检查:
1. 使用rman对数据库进行备份:
rman target /
backup database format='/u02/backup/rmanbk/%d_%s.dbf';
2. 删除users01.dbf:
cd $ORACLE_BASE/oradata/orcl11g
rm -rf users01.dbf
3. 使用dbms_hm进行检测:
exec dbms_hm.run_check('DB Structure Integrity Check','testrun1');
Health Monitor在此数据库实例的ADR主目录中保存其所有数据库检查的报告,show hm_run命令显示ADR中登记的所有检查器运行的摘要,它们是可以从V$HM_RUN视图看到的相同的检查器运行,给出show hm_run命令的样例结果:
adrci> show hm_run
可使用adrci命令show report查看Health Monitor执行的一个特定检查的详细报告:
adrci> show report hm_run testrun1
以上例子中给出的Health Monitor报告显示了datafile 4已经丢失
所有Health Monitor报告都存储在V$HM_RUN视图中,使用DBMS_HM程序包首先生成报告:
var v_output clob
begin
:v_output := dbms_hm.get_run_report('testrun1');
end;
/
打印报告:
set long 100000
set pages 0
print :v_output
可以直接查询V$HM_RUN视图获得检查的信息:
select name,check_name,run_mode,status from v$hm_run;
2.使用Database Control进行手动检查
可以按照下面的步骤通过Database Control进行Health Monitor检查:
(1) 单击Database主页上的Advisor Central(顾问中心);
(2) 单击Checkers(检查器)转到Checkers子页;
(3) 单击你想运行的检查器;
(4) 为检查器运行输入每个参数的值;
(5) 单击Run(运行),在确认你的选择后,再次单击Run开始检查
3.用RMAN命令validate进行手动检查
在以前的Oracle数据库版本中,可以使用backup … validate命令检验备份,本质上,这条命令帮助检查数据文件中的逻辑和物理块内讹误(intrablock corruption),同时还检查数据文件是否可以被RMAN备份,这条命令并不执行实际的备份,它只是检验数据库文件,使你在用RMAN备份这些数据文件时保证具有可用的合法的备份
Oracle Database 11g有一条名为validate的新命令,它在语义上与旧的backup … validate命令具有类似的选项,但可以进行更细粒度的检验backup … validate命令只能在数据库层次上使用,而validate命令可以在备份集、表空间、数据文件的层次上完成相同的工作,甚至可以在数据块层次上使用,甚至可以用它来检查闪回恢复区或所有恢复文件的完整性
可以使用RMAN中的Data Recovery Advisor的list failure、advise failure和repair failure命令查看故障并处理它们
实验:
rman target /
RMAN> validate database;
RMAN> list failure;
RMAN> advise failure ;
RMAN> repair failure;