数据库恢复顾问

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;

OCP读书笔记(9) - 诊断数据库的更多相关文章

  1. OCP读书笔记(14) - 管理数据库性能

    搜集统计信息 1. dbms_stats gather_schema_stats 1)option:有四个选项: a.gather empty:只分析目前还没有搜集过统计信息的表 SQL> co ...

  2. OCP读书笔记(20) - 复制数据库

    没有连接到target的复制 将orcl数据库的备份复制为orcl1 一.创建orcl的备份: run{ backup database plus archivelog;} 二.复制数据库为orcl1 ...

  3. OCP读书笔记(12) - 执行闪回数据库

    闪回数据库使用的是闪回日志,闪回日志存在于闪回目录(也就是快速闪回区中)闪回日志:就是数据块修改之前的镜像,简称前像 1.查看闪回目录的位置:show parameter recovery 如果闪回目 ...

  4. OCP读书笔记(19) - 数据库空间管理

    传输表空间:将linux下的数据库中的test表空间传输到windows平台下的数据库 在传输表空间前,先确定一下源库与目标数据库字符集一致: select * from nls_database_p ...

  5. OCA读书笔记(7) - 管理数据库存储结构

    7.Managing Database Storage Structures 逻辑结构 数据库的存储结构有物理结构和逻辑结构组成的 物理结构:物理上,oracle是由一些操作系统文件组成的 SQL&g ...

  6. 《SQL Server企业级平台管理实践》读书笔记——SQL Server数据库文件分配方式

    1.文件分配方式以及文件空间检查方法 最常用的检查数据文件和表大小的命令就是:sp_spaceused 此命令有三个缺陷:1.无法直观的看出每个数据文件和日志文件的使用情况.2.这个存储过程依赖SQL ...

  7. OCA读书笔记(4) - 管理数据库实例

    Objectives: •Start and stop the Oracle database and components •Use Oracle Enterprise Manager •Acces ...

  8. OCP读书笔记(16) - 管理资源

    使用者组 创建资源用户组OLTP_GRP,将用户HR,OE加入此组: BEGIN dbms_resource_manager.clear_pending_area(); dbms_resource_m ...

  9. OCP读书笔记(15) - 管理SQL性能调优

    SQL Tuning Advisor(STA): 使用oracle提供的程序包进行sql优化 SQL> conn scott/tiger SQL), name )); SQL> inser ...

随机推荐

  1. NEC协议

    注意: 用示波器在接收头抓的电平看起来和NEC协议刚好相反, 那是因为:HS0038B 这个红外一体化接收头,当收到有载波的信号的时候,会输出一个低电平,空闲的时候会输出高电平. 具体情况,具体分析. ...

  2. BZOJ 3446: [Usaco2014 Feb]Cow Decathlon( 状压dp )

    水状压dp. dp(x, s) = max{ dp( x - 1, s - {h} ) } + 奖励(假如拿到的) (h∈s). 时间复杂度O(n * 2^n) ------------------- ...

  3. WebStorm开发Nodejs环境搭建,包括破解最新的WebStom11破解

    先放上链接:http://pan.baidu.com/s/1eQUJZGm 文件内包含注册码和WebStom11安装包,希望能够帮助到大家,少些周折

  4. 使用最新的log4cplus(1.1.1)隔离不同的 log 文件输出

    部分参考了博客. http://www.cppblog.com/tx7do/articles/11719.html 基于脚本配置来过滤log信息 除了通过程序实现对log环境的配置之外,log4cpl ...

  5. ubunut在系统恢复模式下无法改动rootpassword的分析和解决

    前些日子本猫的ubuntu 14.10貌似出了点问题,想改动下rootpassword,可是无奈原系统有错正常情况下无法改动啊.这是逼我重装的节奏吗? 在ubuntu开机后马上按住left_shift ...

  6. 求助(VC++) 隐藏Console窗体无效

    [逝去的100~~ 2014/10/07 20: 20] 程序想要实现控制台窗体的隐藏,可是窗体每次执行总会弹出来.为什么呢? 代码例如以下: // Mini.cpp : 定义控制台应用程序的入口点. ...

  7. VS2010+QT4.8.5 +FastReport教程

    如需转载请标明出处:http://blog.csdn.net/itas109 採用QT 的QAxObject方式执行FastReport特别麻烦,并且无法在编译的时候知道代码是否正确,并且大部分的函数 ...

  8. Unknown database 'DB_NAME'

    Cannot create PoolableConnectionFactory (Unknown database 'DB_NAME'): com.mysql.jdbc.exceptions.jdbc ...

  9. Swift编程语言学习1.4——数值型字面量、数值类型转换

    数值型字面量 整数字面量能够被写作: 一个十进制数,没有前缀 一个二进制数,前缀是0b 一个八进制数,前缀是0o 一个十六进制数,前缀是0x 以下的全部整数字面量的十进制值都是17: let deci ...

  10. Net基础恶补

    一 自定义事件 1 之前一直都是使用事件调用来触发事件,看代码 // 定义一个事件 public event EventHandler; //触发事件 public void OnEvent(){ i ...