使用RMAN備份與恢復數據庫(4)——數據文件的備份與恢復
備份數據文件可以使用copy和backup命令,兩者的區別在於:使用copy命令備份時,備份數據文件中的所有數據塊(包括空白塊),而backup命令,則備份高水位以下的塊(忽略空白塊)。
一、使用copy命令備份數據文件
1、備份數據文件
RMAN> copy datafile 5 to '/home/oracle/rmanbak/data01.dbf';
Starting backup at 2020-04-09 17:54:49
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00005 name=/usr/local/oradata/orcl/data01.dbf
output file name=/home/oracle/rmanbak/data01.dbf tag=TAG20200409T175449 RECID=8 STAMP=1037296490
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
Finished backup at 2020-04-09 17:54:52
2、查看數據文件備份信息
RMAN> list copy of datafile 5;
List of Datafile Copies
=======================
Key File S Completion Time Ckp SCN Ckp Time
------- ---- - ------------------- ---------- -------------------
8 5 A 2020-04-09 17:54:50 1634429 2020-04-09 17:54:49
Name: /home/oracle/rmanbak/data01.dbf
Tag: TAG20200409T175449
二、恢復數據文件
1、修改數據庫中的數據
連接soctt用戶,往t1表中添加一條記錄:
SQL> select * from t1;
ID NAME
---------- --------------------
1 Jack
2 Tome
Elapsed: 00:00:00.01
SQL> insert into t1 values(333,'Jerry');
1 row created.
Elapsed: 00:00:00.00
SQL> commit;
Commit complete.
Elapsed: 00:00:00.04
SQL> select * from t1;
ID NAME
---------- --------------------
1 Jack
333 Jerry
2 Tome
2、查看並刪除數據文件
連接sys用戶,查看數據文件信息,然後刪除5號數據文件,命令如下:
SQL> select file_id,file_name from dba_data_files order by 1;
FILE_ID FILE_NAME
---------- --------------------------------------------------
1 /usr/local/oradata/orcl/system01.dbf
2 /usr/local/oradata/orcl/sysaux01.dbf
3 /usr/local/oradata/orcl/undotbs01.dbf
4 /usr/local/oradata/orcl/users01.dbf
5 /usr/local/oradata/orcl/data01.dbf
SQL> host rm /usr/local/oradata/orcl/data01.dbf
3、重啓數據庫
由於缺少數據文件,數據庫只能啓動到mount狀態。
SQL> startup force;
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2220200 bytes
Variable Size 482348888 bytes
Database Buffers 578813952 bytes
Redo Buffers 5554176 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
ORA-01110: data file 5: '/usr/local/oradata/orcl/data01.dbf'
SQL> select status from v$instance;
STATUS
------------
MOUNTED
Elapsed: 00:00:00.01
4、使用RMAN還原數據文件
RMAN> restore datafile 5;
Starting restore at 2020-04-09 18:07:17
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=10 device type=DISK
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00005 to /usr/local/oradata/orcl/data01.dbf
channel ORA_DISK_1: reading from backup piece /home/oracle/rmanbak/data01_backup.dbf
channel ORA_DISK_1: piece handle=/home/oracle/rmanbak/data01_backup.dbf tag=TAG20200409T175540
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
Finished restore at 2020-04-09 18:07:21
5、使用RMAN恢復數據文件
RMAN> recover datafile 5;
Starting recover at 2020-04-09 18:07:52
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:00
Finished recover at 2020-04-09 18:07:52
6、打開數據庫
RMAN> alter database open;
database opened
8、查看數據
登錄scott,查看t1表中的數據:
SQL> select * from t1;
ID NAME
---------- --------------------
1 Jack
333 Jerry
2 Tome
三、使用backup命令備份數據文件
1、查看數據庫信息
RMAN> report schema;
Report of database schema for database with db_unique_name ORCL
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 780 SYSTEM *** /usr/local/oradata/orcl/system01.dbf
2 520 SYSAUX *** /usr/local/oradata/orcl/sysaux01.dbf
3 225 UNDOTBS1 *** /usr/local/oradata/orcl/undotbs01.dbf
4 15 USERS *** /usr/local/oradata/orcl/users01.dbf
5 50 DATA01 *** /usr/local/oradata/orcl/data01.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 38 TEMP 32767 /usr/local/oradata/orcl/temp01.dbf
2、備份數據文件data01
RMAN> backup datafile 5 format '/home/oracle/rmanbak/data_%d_%s_%p_%T';
Starting backup at 2020-04-09 18:17:18
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00005 name=/usr/local/oradata/orcl/data01.dbf
channel ORA_DISK_1: starting piece 1 at 2020-04-09 18:17:18
channel ORA_DISK_1: finished piece 1 at 2020-04-09 18:17:19
piece handle=/home/oracle/rmanbak/data_ORCL_67_1_20200409 tag=TAG20200409T181718 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 2020-04-09 18:17:19
查看備份信息:
RMAN> list backup of datafile 5;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
44 Full 17.80M DISK 00:00:01 2020-04-09 18:17:19
BP Key: 73 Status: AVAILABLE Compressed: NO Tag: TAG20200409T181718
Piece Name: /home/oracle/rmanbak/data_ORCL_67_1_20200409
List of Datafiles in backup set 44
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- ------------------- ----
5 Full 1655355 2020-04-09 18:17:18 /usr/local/oradata/orcl/data01.dbf
備份時限制備份片的大小:
RMAN>
run {
allocate channel c1 type disk format '/home/oracle/rmanbak/%d_data_%s_%p_%T'
maxpiecesize=5m;
backup datafile 5;
}
released channel: ORA_DISK_1
allocated channel: c1
channel c1: SID=10 device type=DISK
Starting backup at 2020-04-09 18:22:03
channel c1: starting full datafile backup set
channel c1: specifying datafile(s) in backup set
input datafile file number=00005 name=/usr/local/oradata/orcl/data01.dbf
channel c1: starting piece 1 at 2020-04-09 18:22:03
channel c1: finished piece 1 at 2020-04-09 18:22:04
piece handle=/home/oracle/rmanbak/ORCL_data_68_1_20200409 tag=TAG20200409T182203 comment=NONE
channel c1: starting piece 2 at 2020-04-09 18:22:04
channel c1: finished piece 2 at 2020-04-09 18:22:05
piece handle=/home/oracle/rmanbak/ORCL_data_68_2_20200409 tag=TAG20200409T182203 comment=NONE
channel c1: starting piece 3 at 2020-04-09 18:22:05
channel c1: finished piece 3 at 2020-04-09 18:22:06
piece handle=/home/oracle/rmanbak/ORCL_data_68_3_20200409 tag=TAG20200409T182203 comment=NONE
channel c1: starting piece 4 at 2020-04-09 18:22:06
channel c1: finished piece 4 at 2020-04-09 18:22:07
piece handle=/home/oracle/rmanbak/ORCL_data_68_4_20200409 tag=TAG20200409T182203 comment=NONE
channel c1: backup set complete, elapsed time: 00:00:04
Finished backup at 2020-04-09 18:22:07
released channel: c1
查看備份信息:
RMAN> list backup of datafile 5;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
44 Full 17.80M DISK 00:00:01 2020-04-09 18:17:19
BP Key: 73 Status: AVAILABLE Compressed: NO Tag: TAG20200409T181718
Piece Name: /home/oracle/rmanbak/data_ORCL_67_1_20200409
List of Datafiles in backup set 44
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- ------------------- ----
5 Full 1655355 2020-04-09 18:17:18 /usr/local/oradata/orcl/data01.dbf
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
45 Full 17.88M DISK 00:00:03 2020-04-09 18:22:06
List of Datafiles in backup set 45
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- ------------------- ----
5 Full 1655504 2020-04-09 18:22:03 /usr/local/oradata/orcl/data01.dbf
Backup Set Copy #1 of backup set 45
Device Type Elapsed Time Completion Time Compressed Tag
----------- ------------ ------------------- ---------- ---
DISK 00:00:03 2020-04-09 18:22:06 NO TAG20200409T182203
List of Backup Pieces for backup set 45 Copy #1
BP Key Pc# Status Piece Name
------- --- ----------- ----------
74 1 AVAILABLE /home/oracle/rmanbak/ORCL_data_68_1_20200409
75 2 AVAILABLE /home/oracle/rmanbak/ORCL_data_68_2_20200409
76 3 AVAILABLE /home/oracle/rmanbak/ORCL_data_68_3_20200409
77 4 AVAILABLE /home/oracle/rmanbak/ORCL_data_68_4_20200409
備份時壓縮備份集:
RMAN> backup as compressed backupset datafile 5 format='/home/oracle/rmanbak/data01_compress.dbf';
Starting backup at 2020-04-09 18:27:23
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=10 device type=DISK
channel ORA_DISK_1: starting compressed full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00005 name=/usr/local/oradata/orcl/data01.dbf
channel ORA_DISK_1: starting piece 1 at 2020-04-09 18:27:23
channel ORA_DISK_1: finished piece 1 at 2020-04-09 18:27:24
piece handle=/home/oracle/rmanbak/data01_compress.dbf tag=TAG20200409T182723 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 2020-04-09 18:27:24
查看備份信息:
RMAN> list backup of datafile 5;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
44 Full 17.80M DISK 00:00:01 2020-04-09 18:17:19
BP Key: 73 Status: AVAILABLE Compressed: NO Tag: TAG20200409T181718
Piece Name: /home/oracle/rmanbak/data_ORCL_67_1_20200409
List of Datafiles in backup set 44
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- ------------------- ----
5 Full 1655355 2020-04-09 18:17:18 /usr/local/oradata/orcl/data01.dbf
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
45 Full 17.88M DISK 00:00:03 2020-04-09 18:22:06
List of Datafiles in backup set 45
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- ------------------- ----
5 Full 1655504 2020-04-09 18:22:03 /usr/local/oradata/orcl/data01.dbf
Backup Set Copy #1 of backup set 45
Device Type Elapsed Time Completion Time Compressed Tag
----------- ------------ ------------------- ---------- ---
DISK 00:00:03 2020-04-09 18:22:06 NO TAG20200409T182203
List of Backup Pieces for backup set 45 Copy #1
BP Key Pc# Status Piece Name
------- --- ----------- ----------
74 1 AVAILABLE /home/oracle/rmanbak/ORCL_data_68_1_20200409
75 2 AVAILABLE /home/oracle/rmanbak/ORCL_data_68_2_20200409
76 3 AVAILABLE /home/oracle/rmanbak/ORCL_data_68_3_20200409
77 4 AVAILABLE /home/oracle/rmanbak/ORCL_data_68_4_20200409
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
46 Full 3.26M DISK 00:00:01 2020-04-09 18:27:24
BP Key: 78 Status: AVAILABLE Compressed: YES Tag: TAG20200409T182723
Piece Name: /home/oracle/rmanbak/data01_compress.dbf
List of Datafiles in backup set 46
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- ------------------- ----
5 Full 1655643 2020-04-09 18:27:23 /usr/local/oradata/orcl/data01.dbf
四、恢復數據文件
如果有多個備份集,默認使用最新的備份集恢復數據。
1、修改數據庫中的數據
連接soctt用戶,往t1表中添加一條記錄:
SQL> select * from t1;
ID NAME
---------- --------------------
1 Jack
333 Jerry
2 Tome
Elapsed: 00:00:00.00
SQL> insert into t1 values(444,'John');
1 row created.
Elapsed: 00:00:00.02
SQL> commit;
Commit complete.
Elapsed: 00:00:00.02
SQL> select * from t1;
ID NAME
---------- --------------------
1 Jack
333 Jerry
444 John
2 Tome
2、查看並刪除數據文件
連接sys用戶,查看數據文件信息,然後刪除5號數據文件,命令如下:
SQL> select file_id,file_name from dba_data_files order by 1;
FILE_ID FILE_NAME
---------- --------------------------------------------------
1 /usr/local/oradata/orcl/system01.dbf
2 /usr/local/oradata/orcl/sysaux01.dbf
3 /usr/local/oradata/orcl/undotbs01.dbf
4 /usr/local/oradata/orcl/users01.dbf
5 /usr/local/oradata/orcl/data01.dbf
SQL> host rm /usr/local/oradata/orcl/data01.dbf
3、重啓數據庫
由於缺少數據文件,數據庫只能啓動到mount狀態。
SQL> startup force;
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2220200 bytes
Variable Size 482348888 bytes
Database Buffers 578813952 bytes
Redo Buffers 5554176 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
ORA-01110: data file 5: '/usr/local/oradata/orcl/data01.dbf'
SQL> select status from v$instance;
STATUS
------------
MOUNTED
Elapsed: 00:00:00.01
4、使用RMAN還原數據文件、恢復數據文件、打開數據庫
RMAN>
run {
restore datafile 5;
recover datafile 5;
alter database open;
5> }
Starting restore at 2020-04-09 18:34:09
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=133 device type=DISK
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00005 to /usr/local/oradata/orcl/data01.dbf
channel ORA_DISK_1: reading from backup piece /home/oracle/rmanbak/data01_compress.dbf
channel ORA_DISK_1: piece handle=/home/oracle/rmanbak/data01_compress.dbf tag=TAG20200409T182723
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
Finished restore at 2020-04-09 18:34:13
Starting recover at 2020-04-09 18:34:13
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:00
Finished recover at 2020-04-09 18:34:13
database opened
5、查看數據
登錄scott,查看t1表中的數據:
SQL> connect scott/tiger;
Connected.
SQL> select * from t1;
ID NAME
---------- --------------------
1 Jack
333 Jerry
444 John
2 Tome
五、恢復數據文件時改變數據文件的位置
默認情況下,數據文件恢復到原來的位置。也可以改變數據文件恢復之後的位置,步驟如下:
1、查看數據文件
RMAN> report schema;
Report of database schema for database with db_unique_name ORCL
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 780 SYSTEM *** /usr/local/oradata/orcl/system01.dbf
2 530 SYSAUX *** /usr/local/oradata/orcl/sysaux01.dbf
3 225 UNDOTBS1 *** /usr/local/oradata/orcl/undotbs01.dbf
4 15 USERS *** /usr/local/oradata/orcl/users01.dbf
5 50 DATA01 *** /usr/local/oradata/orcl/data01.dbf
6 10 DATA02 *** /home/oracle/data02.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 20 TEMP 32767 /usr/local/oradata/orcl/temp01.dbf
2、備份數據文件data02
RMAN> backup datafile 6 format '/home/oracle/rmanbak/data02.dbf';
Starting backup at 2020-04-10 11:24:07
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=00006 name=/home/oracle/data02.dbf
channel ORA_DISK_1: starting piece 1 at 2020-04-10 11:24:07
channel ORA_DISK_1: finished piece 1 at 2020-04-10 11:24:08
piece handle=/home/oracle/rmanbak/data02.dbf tag=TAG20200410T112407 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 2020-04-10 11:24:08
3、恢復數據文件data02並且改變位置
把數據文件data02.dbf保存到/usr/local/oradata/orcl目錄下。
run {
set newname for datafile 6 to '/usr/local/oradata/orcl/data02.dbf';
restore datafile 6;
switch datafile all;
recover datafile 6;
alter database open;
7> }
executing command: SET NEWNAME
Starting restore at 2020-04-10 11:48:46
using channel ORA_DISK_1
using channel ORA_DISK_2
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00006 to /usr/local/oradata/orcl/data02.dbf
channel ORA_DISK_1: reading from backup piece /home/oracle/rmanbak/data02.dbf
channel ORA_DISK_1: piece handle=/home/oracle/rmanbak/data02.dbf tag=TAG20200410T112407
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 2020-04-10 11:48:47
datafile 6 switched to datafile copy
input datafile copy RECID=17 STAMP=1037360927 file name=/usr/local/oradata/orcl/data02.dbf
Starting recover at 2020-04-10 11:48:48
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-10 11:48:48
database opened
說明:以上命令如果是第二次執行,可能會報以下錯誤:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of switch command at 04/10/2020 11:38:30
ORA-19625: error identifying file /usr/local/oradata/orcl/data02.dbf
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
說明:產生以上錯誤的原因是:rman在setnewname之後的restore過程,是將現有的數據文件做一份副本,而該副本的信息保存在rman知識庫中,當再一次進行restore時,rman試圖尋找最新的備份(也就是數據文件副本),而該數據文件副本已經被刪除,於是報錯。解決的方法是執行以下兩條命令,以清除rman知識庫中中的副本信息:
RMAN> list copy of datafile 6;
RMAN> delete copy of datafile 6;
4、查看數據文件信息
可以發現,數據文件data02的位置已經發生了變化。
RMAN> report schema;
Report of database schema for database with db_unique_name ORCL
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 780 SYSTEM *** /usr/local/oradata/orcl/system01.dbf
2 530 SYSAUX *** /usr/local/oradata/orcl/sysaux01.dbf
3 225 UNDOTBS1 *** /usr/local/oradata/orcl/undotbs01.dbf
4 15 USERS *** /usr/local/oradata/orcl/users01.dbf
5 50 DATA01 *** /usr/local/oradata/orcl/data01.dbf
6 10 DATA02 *** /usr/local/oradata/orcl/data02.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 20 TEMP 32767 /usr/local/oradata/orcl/temp01.dbf