Oracle version:19.3.0.0.0
目录:
一、功能简介
二、适用场景
三、使用限制
四、恢复的前提条件
五、恢复示例
六、参考文档
一、功能简介
Oracle 11g版本中,对于误删的数据或者表,可以通过undo或者回收站闪回的方式恢复,但是不能通过以上两种方式恢复的数据,则需要通过RMAN还原整个备份或者某个表空间或者impdp还原表(只能保证数据恢复到expdp备份的时刻)的方式来恢复,都不能高效的还原。
Oracle 12.1.0.1 开始RMAN新增单独恢复表及表分区功能,可以不用恢复整个数据库或者整个表空间来达到恢复表的目的,且能让数据恢复到误删的那一刻前。
Oracle 12.2.0.1 版本中RMAN又增强了两个方面:1.恢复前RMAN 会检查目标主机上是否有足够的空间来创建辅助实例。2.还可以将表和表分区恢复到新的schema中。
二、适用场景
- 恢复非常少量的表。这种情况下,TSPITR 不是最有效的解决方案,因为它将表空间中的所有对象全部恢复。
- 恢复逻辑上已损坏或已删除且从回收站清空的表。
- 恢复不能通过undo闪回的表(undo已过期被覆盖)。
- 恢复在 DDL 操作修改表结构后丢失的数据。
三、使用限制
- SYS用户下的表或者表分区不能被恢复。
- SYSTEM 和SYSAUX表空间下的表或者表分区不能被恢复。
- 备库上的表或者表分区不能被恢复。
- 使用了REMAP参数后不能恢复有NOT NULL约束的表。
四、恢复的前提条件
- 数据库必须处于读写模式。
- 数据库必须处于归档模式。
- 你必须有包含你想要恢复表或分区的时间点的RMAN备份。
- 恢复单个表分区时,目标数据库的COMPATIBLE初始化参数必须设置为11.1.0或以上。
五、恢复示例
- 准备数据
## 建表并写入数据
CREATE TABLE LZH_USER.TEST_RMAN ( ID NUMBER , NAME VARCHAR(100), dtime DATE) ;
INSERT INTO LZH_USER.TEST_RMAN SELECT LEVEL , 'mark-'||LEVEL ,SYSDATE FROM dual CONNECT BY LEVEL < 10 ;
COMMIT ;
- 执行RMAN备份
run {
allocate channel CH1 type disk;
allocate channel CH2 type disk;
backup tag t_SPFILE spfile format '/u01/app/dbbackup/%d_%T_%s_%p_SPFILE';
backup AS COMPRESSED BACKUPSET full database tag t_FULL format '/u01/app/dbbackup/%d_%T_%s_%p_FULL' ;
sql 'alter system archive log current';
backup tag t_ARCHIVE AS COMPRESSED BACKUPSET archivelog all format '/u01/app/dbbackup/%d_%T_%s_%p_ARCHIVE' ;
backup tag t_CONTROL current controlfile format '/u01/app/dbbackup/%d_%T_%s_%p_CONTROL';
release channel CH1;
release channel CH2;
}
- 继续插入数据
INSERT INTO LZH_USER.TEST_RMAN VALUES (10, 'after rman backup',SYSDATE) ;
COMMIT ;
SELECT a.* FROM LZH_USER.TEST_RMAN a ;
ID NAME DTIME
-- ---------------------------------------
1 mark-1 2022-07-25 13:35:38
2 mark-2 2022-07-25 13:35:38
3 mark-3 2022-07-25 13:35:38
4 mark-4 2022-07-25 13:35:38
5 mark-5 2022-07-25 13:35:38
6 mark-6 2022-07-25 13:35:38
7 mark-7 2022-07-25 13:35:38
8 mark-8 2022-07-25 13:35:38
9 mark-9 2022-07-25 13:35:38
10 after rman backup 2022-07-25 13:49:56
- 等待一会后(2022-07-25 13:50:15)删除表 LZH_USER.TEST_RMAN(同时从回收站删除)
drop table LZH_USER.TEST_RMAN purge ;
- 恢复表到数据删除前(2022-07-25 13:50:13)
先创建好下面用到的文件夹
[root@localhost ~]# su - oracle
[oracle@localhost ~]$ mkdir /tmp/oracle/recover -p
[oracle@localhost ~]$ mkdir /tmp/recover/dumpfiles -p
- 情形一:恢复到expdp文件,后续自行导入数据库中
RECOVER TABLE LZH_USER.TEST_RMAN
UNTIL TIME "to_date('2022-07-25 13:50:13','yyyy-mm-dd hh24:mi:ss')"
AUXILIARY DESTINATION '/tmp/oracle/recover'
DATAPUMP DESTINATION '/tmp/recover/dumpfiles'
DUMP FILE 'TEST_RMAN.dat'
NOTABLEIMPORT;
- 情形二:恢复到目标数据库的新表 TEST_RMAN_REC 中
RECOVER TABLE LZH_USER.TEST_RMAN
UNTIL TIME "to_date('2022-07-25 13:50:13','yyyy-mm-dd hh24:mi:ss')"
AUXILIARY DESTINATION '/tmp/oracle/recover'
REMAP TABLE LZH_USER.TEST_RMAN:TEST_RMAN_REC;
SELECT * FROM LZH_USER.TEST_RMAN_REC ;
ID NAME DTIME
-- ---------------------------------------
1 mark-1 2022-07-25 13:35:38
2 mark-2 2022-07-25 13:35:38
3 mark-3 2022-07-25 13:35:38
4 mark-4 2022-07-25 13:35:38
5 mark-5 2022-07-25 13:35:38
6 mark-6 2022-07-25 13:35:38
7 mark-7 2022-07-25 13:35:38
8 mark-8 2022-07-25 13:35:38
9 mark-9 2022-07-25 13:35:38
10 after rman backup 2022-07-25 13:49:56
有个细节需要注意,如果REMAP是按官方文档这么写的:
REMAP TABLE 'LZH_USER'.'TEST_RMAN':'TEST_RMAN_REC';
则查询表的时候表上需要加 "" 号,即:SELECT * FROM LZH_USER."TEST_RMAN_REC" ;
另外,还可以通过指定SCN和日志号来恢复,这里就不做演示了。
- 恢复分区表,可参考下面的命令
将表LZH_USER.TEST_RMAN_PARTITION的两个分区PATITION1和PATITION2恢复到新表PATITION1_REC和PATITION2_REC中,同时映射到新的表空间。
RECOVER TABLE LZH_USER.TEST_RMAN_PARTITION:PATITION1,LZH_USER.TEST_RMAN_PARTITION:PATITION12
UNTIL TIME "to_date('2022-07-25 13:50:13','yyyy-mm-dd hh24:mi:ss')"
AUXILIARY DESTINATION '/tmp/oracle/recover'
REMAP TABLE 'LZH_USER'.'TEST_RMAN_PARTITION':'PATITION1':'PATITION1_REC',
'LZH_USER'.'TEST_RMAN_PARTITION':'PATITION2':'PATITION2_REC',
REMAP TABLESPACE 'USER_TS':'USER_TS_REC';
- 恢复pdb中的表,可以参考下面的命令
RECOVER TABLE LZH_USER.TEST_RMAN OF PLUGGABLE DATABASE TEST_PDB
UNTIL TIME "to_date('2022-07-25 13:50:13','yyyy-mm-dd hh24:mi:ss')"
AUXILIARY DESTINATION '/tmp/oracle/recover'
REMAP TABLE 'LZH_USER'.'TEST_RMAN':'TEST_RMAN_REC';
- 恢复到新的schema中(从 LZH_USER --> LZH_USER_REC)(12.2.0.1增强功能),恢复到的时间点 2022-07-25 13:50:13 ,此刻 LZH_USER_REC 必须存在!不能新建一个schema,然后往里面恢复,会报用户不存在。
RECOVER TABLE LZH_USER.TEST_RMAN
UNTIL TIME "to_date('2022-07-25 13:50:13','yyyy-mm-dd hh24:mi:ss')"
AUXILIARY DESTINATION '/tmp/oracle/recover'
REMAP TABLE LZH_USER.TEST_RMAN:LZH_USER_REC.TEST_RMAN_REC;
六、参考文档
Oracle 12.1.0.1 官方文档:
https://docs.oracle.com/database/121/BRADV/rcmresind.htm#BRADV686
Oracle 12.2.0.1 官方文档:
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/bradv/rman-recovering-tables-partitions.html#GUID-87B7F772-335F-4179-81C9-91678D026D01