数据库恢复顾问
Data Recovery Advisor的命令行选项
1. 启动 RMAN 进程并连接到目标
$ rman target=/
2. 假设发生了某个错误,希望找出原因,使用 list failure 命令:
RMAN> list failure;
如果没有错误,该命令将返回以下消息:
no failures found that match specification
如果有错误,将显示如下更具说明性的消息:
142 HIGH OPEN 15-JUL-07 One or more non-system datafiles are missing
该消息表明某些数据文件已丢失,由于这些数据文件属于 SYSTEM 以外的表空间,该表空间脱机。该错误相当严重,因此优先级设为 HIGH,每个故障都有一个故障 ID,以方便各个故障的识别和解决,例如,可以发出以下命令来了解故障 142 的详细信息:
RMAN> list failure 142 detail;
该命令将向您显示错误的确切原因
3. 向Data Recovery Advisor 寻求帮助:
RMAN> advise failure;
以上命令的响应将对错误进行详细的解释,并说明如何纠正该错误:
首先,该 Advisor 对错误进行了分析,在以上的例子中,错误很明显数据文件丢失,接下来,Advisor 建议了一个策略在该案例中,这也是相当简单的:还原和恢复文件(V$IR_MANUAL_CHECKLIST 也显示了该信息)
4. 预览修复任务将执行的操作:
RMAN> repair failure preview;
5. 发出以下命令来执行实际的修复:
RMAN> repair failure;
Do you really want to execute the above repair (enter YES or NO)?
输入YES,操作将继续执行:
如果不希望提示;而是希望继续进行并修复,没有任何提示,在RMAN 提示符下使用 repair failure noprompt 即可
RMAN> repair failure noprompt;
处理坏块
1. 安装bbed
11g安装OracleDatabase 11g中缺省的未提供BBED库文件,但是可以用10g的文件编译出来
需要先从10g中复制如下文件到相应目录然后再执行连接命令:
复制Oracle 10g库文件
cp $ORA10g_HOME/rdbms/lib/ssbbded.o $ORA11g_HOME/rdbms/lib
cp $ORA10g_HOME/rdbms/lib/sbbdpt.o $ORA11g_HOME/rdbms/lib cp $ORA10g_HOME/rdbms/mesg/bbedus.msb to $ORA11g_HOME/rdbms/mesg
cp $ORA10g_HOME/rdbms/mesg/bbedus.msg to $ORA11g_HOME/rdbms/mesg su - oracle11g
cd $ORACLE_HOME/rdbms/lib
chown oracle11g:oinstall ssbbded.o
chown oracle11g:oinstall sbbdpt.o
chmod ssbbded.o
chmod sbbdpt.o cd $ORACLE_HOME/rdbms/mesg
chown oracle11g:oinstall bbedus.msb
chown oracle11g:oinstall bbedus.msg
chmod bbedus.msb
chmod bbedus.msg
编译安装bbed
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
做个链接到oracle二进制命令目录里:
ln ./bbed $ORACLE_HOME/bin/bbed
2. 模拟坏块
SQL> create tablespace test01 datafile '/u02/app/oracle11g/oradata/orcl11g/test01.dbf' size 1m;
SQL> create table test(id number,name varchar2(30)) tablespace test01;
SQL> insert into test select rownum,object_name from dba_objects where rownum<10000;
SQL> insert into test select rownum,object_name from dba_objects where rownum<10000;
SQL> commit; SQL> select count(*) from test;
SQL> select segment_name,file_id,block_id from dba_extents where segment_name='TEST';
使用rman对其进行备份:
rman target / RMAN> backup tablespace test01 format='/u01/app/oracle/backup/rmanbk/%d_%s.dbf';
RMNA> shutdown immediate
然后使用bbed工具编辑数据文件,修改里面的部分内容
查看test01.dbf的大小:
ls -l /u01/app/oracle/oradata/orcl/test01.dbf
vi /u01/app/oracle/temptest/filelist.txt
加入以下内容:
/u01/app/oracle/oradata/orcl/test01.dbf
vi /u01/app/oracle/temptest/par.bbd
加入以下内容:
blocksize=
listfile=/u01/app/oracle/temptest/filelist.txt
mode=edit
bbed parfile=/u01/app/oracle/temptest/par.bbd
Password:
BBED: Release 2.0.0.0.0 - Limited Production on Sat Nov 27 23:34:25 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> set file 1
BBED> show
BBED> modify 1000 file 1 block 17-----------------破坏块
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
BBED> verify
BBED> quit
查看破坏结果:
SQL>startup
SQL>select count(*) from test; --error
主动的运行状况检查
在 Oracle 数据库 11g 中,RMAN 中的一个新命令VALIDATE DATABASE 检查数据库块中的物理损坏操作,如果检测到损坏,将记录到自动诊断信息库中,然后,RMAN 将生成输出:
RMAN> validate database;
vi /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_7885.trc
发现17号块发生损坏
3. 使用rman进行恢复:
RMAN> list failure;
RMAN> advise failure;
RMAN> repair failure preview;
RMAN> repair failure noprompt; sqlplus / as sysdba
SQL> select count(*) from test;
还可以验证特定的表空间,数据文件,以及数据文件中的一个块:
RMAN> validate tablespace users;
RMAN> validate datafile 1;
RMAN> validate datafile 4 block 56;
VALIDATE 命令的验证范围远远不只是数据文件,您可以验证 spfile、controlfilecopy、恢复文件快速恢复区,等等
ADR:自动诊断资料库
1. ADR目录设置:通过参数diagnostic_dest设置
如果设置了ORACLE_BASE,diagnostic_dest设置为ORACLE_BASE的值
如果没有设置ORACLE_BASE,diagnostic_dest默认设置为$ORACLE_HOME/log
SQL> show parameter diagnostic_dest;
2. ADR目录结构:
ADR_BASE/diag/product_type/product_id/instance_id
3. ADR中的子目录:
alert:包含实例的预警日志(XML格式)
cdump:包含核心文件
hm:包含Health Monitor报表
incident:包含每个意外事件的子目录,每个意外事件的子目录中还包含该意外事件的所有跟踪转出
incpkg:包含你为传到Oracle Support而创建的意外事件包
ir:包含为每个实例创建的意外事件报表
trace:存储用户会话跟踪文件
通过查询V$DIAG_INFO视图,找出所有与ADR有关的位置:
SQL> select name, value from v$diag_info;
4. 如何查看和解决ADR中的问题
可以通过命令行工具adrci和database control中的support workbench来访问ADR中的数据
adrci:通过adrci工具可以查看数据库的诊断数据,还可以把意外事件和问题信息打包成ZIP文件发送给Oracle Support,诊断数据包括跟踪和转储文件,预警日志文件以及oracle database 11g的新Health Monitor报表等数据,可以使用交互式和脚本方式使用adrci
以命令行方式使用adrci:
[root@oracle ~]# su - oracle
[oracle@oracle ~]$ adrci
输入help可以查看帮助
在命令行中执行adrci命令:
为了在命令行中执行adrci命令,可以使用参数exec,调用adrci时,必须在脚本中使用以下的语法:
adrci exec="command[;command]...."
例如,如果想要在一个命令行中使用两条adrci命令:show homes和show incident,可以使用以下的语法:
adrci exec="show homes; show incident"
例如,使用命令行功能查看告警日志:
adrci exec="set homepath diag/rdbms/orcl/orcl; set editor vi; show alert -V"
使用脚本:
adrci<<eof
set homepath diag/rdbms/orcl/orcl
show alert -p "message text like '%ORA-%'"
eof
设置homepath
当我们在adrci发出命令时,这些命令都将在ADR的根目录下运行,show base命令可以查看ADR的根目录的位置:
adrci> show base
如果没有明确设置homepath(根目录路径),则ADR根目录下的所有ADR主目录都是当前的,ADR命令总是在当前ADR主目录中的诊断数据上运行,因此,如果执行一条命令,如show tracefile,adrci将显示当前的每个ADR目录中的所有跟踪文件,show homes显示所有可用的ADR主目录
设置ADR主目录的路径:
adrci> set homepath diag/rdbms/orcl/orcl;
adrci> show homepath;
当有多个当前主目录的情况下执行ips命令(创建一个意外事件包)将报错,所以必须用set homepath命令设置单个ADR主目录路径,才能用ips命令创建意外事件包
查看命令列表
可以在adrci命令行上输入help命令查看可以使用那些adrci命令
查看预警日志
在11G中,预警日志文件以文本格式和XML格式的文件存储,分别在ADR的主目录下,和trace目录下,可以使用adrci命令来查看XML格式的告警日志如
adrci> show alert;
adrci将当前的日志文件的完整内容传输到/tmp目录中,可以使用-tail选项的show alert命令查看预警日志文件的20到30条消息,如
adrci> show alert -tail 100
查看告警日志中是否存在ORA-600错误:
adrci> show alert -p "MESSAGE TEXT LIKE %ORA-600%"
adrci中可以使用spool例如:
adrci> spool /u01/app/oracle/temptest/strip_alert.log
adrci> show alert
adrci> spool off
列出跟踪文件以及查看意外事件:
adrci> show tracefile
adrci> show incident
adrci> show incident -mode detail -p "incident_id=113769"
show incident命令有两个选项,分别是谓词串-p和方式-mode,可以使用谓词串来指定各字段名,可在谓词中使用的所有的字段名的列表通过describe incident来显示:
sdrci> describe incident
主动的运行状况检查
虽然数据库自动进行激活检查,但最好是定期主动运行检查器,检测至今尚未影响数据库的潜在故障激活检查只在故障影响数据库时才执行,比如说在用户试图从某个讹误数据块中检索数据时才执行激活检查,但是,如果用户没有在数据块讹误后访问它,则该讹误的数据块不会自动导致数据库的故障预警,手动检查有助于捕捉这种可能在某个繁忙时间发作,潜在地降低数据库可用性的隐蔽故障
可使用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过程的不同参数所代表的含义
check_name:数据库检查名,这是一个必需的参数,而且一定要与v$hm_check视图中的检查名匹配
run_name:这是一个可选的参数,它允许指定检查运行名
timeout:可选,可以用检查能运行的时间长度设置限制
input_params:这是一个输入参数,控制检查的运行,可查询v$hm_check_param视图查看各种类型的输入
实验:使用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报告都存储在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;