使用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