RMAN을 사용하여 데이터베이스 백업 및 복원 (10)-손상된 데이터 블록 복구

RMAN을 사용하여 데이터베이스 백업 및 복원 (10)-손상된 데이터 블록 복구

데이터 파일이 정상이지만 데이터 파일의 일부 데이터 블록이 손상된 경우 RMAN을 사용하여 복구 할 수 있습니다.

1. 시뮬레이션 된 데이터 블록 손상

1. 새 테이블 스페이스 data03 생성

파일 크기가 5M 인 새 테이블 스페이스 data03을 작성하십시오.

SQL> create tablespace data03 datafile '/usr/local/oradata/orcl/data03.dbf' size 2m;

Tablespace created.

Elapsed: 00:00:00.40
SQL> select name from v$datafile;

NAME
-----------------------------------------------------------------------------------
/usr/local/oradata/orcl/system01.dbf
/usr/local/oradata/orcl/sysaux01.dbf
/usr/local/oradata/orcl/undotbs01.dbf
/usr/local/oradata/orcl/users01.dbf
/usr/local/oradata/orcl/data01.dbf
/usr/local/oradata/orcl/data02.dbf
/usr/local/oradata/orcl/data03.dbf

2. data03 테이블 스페이스에 테이블 생성

테이블 스페이스에 scott.t_emp 테이블을 만들고 데이터를 추가하여 전체 테이블 스페이스를 채 웁니다.

SQL> create table scott.t_emp tablespace data03 as select * from scott.e02 where rownum<20000;
Table created.

3. RMAN을 사용하여 테이블 공간 백업

RMAN> recover tablespace data03;

Starting recover at 2020-04-12 14:45:55
using channel ORA_DISK_1
using channel ORA_DISK_2

starting media recovery
media recovery complete, elapsed time: 00:00:00

Finished recover at 2020-04-12 14:45:56

RMAN> backup tablespace data03 format '/home/oracle/rmanbak/data03.bak';

Starting backup at 2020-04-12 14:47:50
using channel ORA_DISK_1
using channel ORA_DISK_2
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00007 name=/usr/local/oradata/orcl/data03.dbf
channel ORA_DISK_1: starting piece 1 at 2020-04-12 14:47:51
channel ORA_DISK_1: finished piece 1 at 2020-04-12 14:47:52
piece handle=/home/oracle/rmanbak/data03.bak tag=TAG20200412T144751 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 2020-04-12 14:47:52

4. 테이블 스페이스 data03을 오프라인으로 설정합니다.

SQL> alter tablespace data03 offline;

Tablespace altered.

5. vim으로 data03.dbf 파일을 편집하고 저장합니다.

[oracle@wgx orcl]$ vim -b data03.dbf

6. 테이블 스페이스 data03을 온라인으로 설정합니다.

SQL> alter tablespace data03 online;
Tablespace altered.

둘째, t_emp 테이블의 데이터보기

잘못된 데이터 블록이 있다는 메시지를 표시하면 결과는 다음과 같습니다.

SQL> select count(*) from scott.t_emp;
select count(*) from scott.t_emp
                           *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 7, block # 158)
ORA-01110: data file 7: '/usr/local/oradata/orcl/data03.dbf'

셋째, RMAN을 사용하여 손상된 데이터 블록 복구

1. 손상된 데이터 블록의 정보보기

보시다시피 두 개의 데이터 블록이 손상되었습니다.

SQL> select file#,block# from v$database_block_corruption;

     FILE#     BLOCK#
---------- ----------
	 7	  163
	 7	  158

Elapsed: 00:00:00.04

2. RMAN을 사용하여 손상된 데이터 블록 복구

RMAN> blockrecover corruption list;

Starting recover at 2020-04-12 14:53:35
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=9 device type=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: SID=133 device type=DISK

channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00007
channel ORA_DISK_1: reading from backup piece /home/oracle/rmanbak/data03.bak
channel ORA_DISK_1: piece handle=/home/oracle/rmanbak/data03.bak tag=TAG20200412T144751
channel ORA_DISK_1: restored block(s) from backup piece 1
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:01

starting media recovery
media recovery complete, elapsed time: 00:00:03

Finished recover at 2020-04-12 14:53:40

네, t_emp 테이블의 데이터보기

SQL> select count(*) from scott.t_emp;

  COUNT(*)
----------
     19999

다섯, 손상된 데이터 블록의 정보보기

SQL> select file#,block# from v$database_block_corruption;

no rows selected

수리가 성공했습니다!

추천

출처blog.csdn.net/weixin_44377973/article/details/105474057