ITPub博客

首页 > 数据库 > Oracle > Backup And Recovery User's Guide-从RMAN开始-恢复单个的数据块

Backup And Recovery User's Guide-从RMAN开始-恢复单个的数据块

原创 Oracle 作者:LuiseDalian 时间:2014-02-14 09:12:24 0 删除 编辑

RMAN可以恢复单个的损坏的数据块。

RMAN为了备份而对文件执行完全扫描之后,任何损坏的数据块都会列在V$DATABASE_BLOCK__CORRUPTION中。

损坏也会在预警日志、跟踪文件、SQL查询的结果中报告。

练习:恢复数据块步骤

--1. 获得损坏的数据块的块号,首先获得预警日志文件、跟踪文件的位置

sys@TESTDB11>select * from v$diag_info;

NAME                           VALUE

------------------------- ----------------------------------------------------------------------

Diag Enabled                 TRUE

ADR Base                      /u01/app/oracle

ADR Home                      /u01/app/oracle/diag/rdbms/testdb12/TestDB12

Diag Trace                   /u01/app/oracle/diag/rdbms/testdb12/TestDB12/trace

Diag Alert                   /u01/app/oracle/diag/rdbms/testdb12/TestDB12/alert

Diag Incident               /u01/app/oracle/diag/rdbms/testdb12/TestDB12/incident

Diag Cdump                  /u01/app/oracle/diag/rdbms/testdb12/TestDB12/cdump

Health Monitor             /u01/app/oracle/diag/rdbms/testdb12/TestDB12/hm

Default Trace File        /u01/app/oracle/diag/rdbms/testdb12/TestDB12/trace/TestDB12_ora_5852.trc

Active Problem Count      0

Active Incident Count     0

11 rows selected.

--2. 开启RMAN连接到目标数据库

--3. 执行RECOVER命令,恢复数据块

--3.1 恢复所有损坏的数据块

RMAN> RECOVER CORRUPTION LIST;

--3.2 恢复单个的数据块

RMAN> RECOVER DATAFILE 1 BLOCK 233, 235 DATAFILE 2 BLOCK 100 TO 200;

 

# 1. 先对数据库进行备份

# 2. /home/oracle目录下创建文件damage_datafile.sh

sqlplus -s system/system <

set echo off

set heading off

set feed off

set verify off

spool rowid.sh

select min(dbms_rowid.rowid_block_number(rowid)) from scott.emp;

spool off

spool blksize.sh

select value from v\$parameter where name ='db_block_size';

spool off

spool file.sh

select file_name from dba_data_files

 where tablespace_name = (select tablespace_name from dba_tables

 where table_name = 'EMP'

 and owner = 'SCOTT');

spool off

exit

stop

FILE=`cat file.sh`

BLKSIZ=`cat blksize.sh`

START1=`cat rowid.sh`;

START2=`expr ${START1} + 1`

dd if=`echo ${FILE}` of=tab1 bs=`echo ${BLKSIZ}` count=`echo ${START1}`

dd if=`echo ${FILE}` of=tab2 bs=`echo ${BLKSIZ}` count=1

dd if=`echo ${FILE}` of=tab3 bs=`echo ${BLKSIZ}` skip=${START2}

cat tab1 > file

cat tab2 >> file

cat tab3 >> file

cp file ${FILE}

# 3. 修改脚本文件的权限并执行它,对数据文件进行破坏

oracle@Redhat55.cuug.net:/home/oracle> chmod u+x damage_datafile.sh

oracle@Redhat55.cuug.net:/home/oracle> ./damage_datafile.sh

                                      151

8192

/u01/app/oracle/oradata/TestDB12/users001.dbf

151+0 records in

151+0 records out

1236992 bytes (1.2 MB) copied, 0.022293 seconds, 55.5 MB/s

1+0 records in

1+0 records out

8192 bytes (8.2 kB) copied, 3.3e-05 seconds, 248 MB/s

489+0 records in

489+0 records out

4005888 bytes (4.0 MB) copied, 0.044283 seconds, 90.5 MB/s

# 4. 再次查看emp,会提示数据文件有坏块

sys@TESTDB12>select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

# 4.1 感觉好像没有影响,因为数据来自于database buffer cache,所以对buffer cache清空

sys@TESTDB12>alter system flush buffer_cache;

System altered.

# 4.2 提示有坏块

sys@TESTDB12>select * from scott.emp

*

ERROR at line 1:


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1081183/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5642793