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.
2つ目は、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'
3、RMANを使用して破損したデータブロックを修復する
1.破損したデータブロックの情報を表示する
ご覧のとおり、2つのデータブロックが破損しています。
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
4、t_empテーブルのデータを表示する
SQL> select count(*) from scott.t_emp;
COUNT(*)
----------
19999
5、破損したデータブロックの情報を表示する
SQL> select file#,block# from v$database_block_corruption;
no rows selected