12c RMAN新特性之recover table(表级别恢复)

0    368    1

Tags:

👉 本文共约20135个字,系统预计阅读时间或需76分钟。

12c中的RECOVER TABLE

在RMAN中提供了表级别恢复(RECOVER TABLE)。在Oracle 12c中,在发生drop或truncate的情况下,可以从RMAN备份种将一个特定的表或分区恢复到某个时间点、SCN或归档序列号,并且可以有下面的选择:

l 使用REMAP选项将表恢复为一个新表或者分区中,也可以恢复到其他用户中。

l 只生成一个需要被恢复表的expdp格式的dump文件,选择后期再进行恢复。

Oracle 12c的Recover Table新特性是利用创建辅助临时实例加数据泵工具来实现的。通常在进行Recover Table之前应该准备好两个目录(AUXILIARY DESTINATION和DATAPUMP DESTINATION),AUXILIARY DESTINATION用来临时存放辅助实例的数据文件,DATAPUMP DESTINATION用来临时存放数据泵导出的文件。

只要之前创建了RMAN备份,那么就可以根据指定的的时间来进行表级和表分区级的恢复操作,而且不影响其他的数据库对象。RMAN的表级和表分区级恢复可以使用在如下场景:

① 在恢复小表或数据库中的某几张表时,但发现使用Restore Database或Tablespace的代价很高而且效率很低。也可以使用TSPITR(表空间基于时间点的恢复)的方法,但该方法效率很低,因为需要移动表空间中的所有对象。

② 恢复有逻辑损坏或者被删除的表。

③ Flashback Table不可用,例如Undo数据已经被覆盖的情况。

④ DDL操作后需要恢复数据。Flashback Table不支持表结构发生改变后的回退,例如TRUNCATE TABLE。

RMAN从备份中自动处理恢复表或者表分区时会执行如下步骤:

1.判断哪些备份包含需要恢复的表或表分区,然后根据指定的时间来进行恢复。

2.判断目标主机上是否有足够的空间来创建auxiliary instance,该实例用于处理表或分区的恢复。如果需要的空间不足,那么RMAN会报错并退出恢复操作。

3.创建auxiliary database,并根据指定的时间来恢复指定的表或表分区到auxiliary database中。辅助数据库的数据文件位置可以在命令中指定。

4.创建包含恢复表或表分区的数据泵文件(expdp dump file)。数据泵的名称和位置也可以在命令中指定。

5.(可选操作)将上一步生产的数据泵文件导入到目标实例中。当然也可以选择不导入,如果选择不导入就必须使用impdp手工导入。

6.(可选操作)在目标数据库中rename恢复表或表分区。

关于RECOVER TABLE需要注意的几个问题:

l 目标数据库必须被置于读写模式。

l 目标数据库必须被置于归档模式。

l 如果要恢复表或者分区,你必须拥有这些表或者分区存在后的时间的备份。

l 想要恢复单个表分区,COMPATIBLE初始化参数所在的目标库必须设置为11.1.0或以上。

l SYS用户下的表或分区无法恢复。

l 存储于SYSAUX和SYSTEM表空间下的表和分区无法恢复。

l Standby数据库上的表或表分区不能进行恢复。

l 在使用REMAP的情况下,有NOT NULL 约束的表不能进行恢复。

l 确保对于辅助数据库在文件系统下有足够的可用空间,同时对数据泵文件也有同样保证。

l 必须要存在一份完整的数据库备份,至少要有SYSTEM、UNDO、SYSAUX和表所在表空间相关的备份。表误操作可以在数据库备份之前也可以在数据库备份之后。如果恢复的表在PDB中,那么需要备份Root Container的SYSTEM,SYSAUX、UNDO和PDB的SYSTEM、SYSAUX以及包含了要恢复的表的表空间。

l 在存在CDB的情况下,在执行RECOVER TABLE时必须使用sys用户登录,而不能使用“rman target /”进行登录。

在执行“RECOVER TABLE”命令时,可以根据需要在以下三种级别指定时间:

(1)SCN号

(2)Sequence number(日志序列号)

(3)Time:根据NLS_LANG和NLS_DATE_FORMAT环境变量中的格式来指定时间,也可以用SYSDATE,比如"SYSDATE-30"、"to_date('2018-04-09:13:51:48','yyyy-mm-dd hh24:mi:ss')"

“RECOVER TABLE”命令的一般格式为:

示例1:在PDB中恢复表HR.PDB_EMP,恢复后的表命名为EMP_RECVR

示例2:从RMAN备份中恢复表SCOTT.EMP,SCOTT.DEPT,并以数据泵格式导出emp_dept_exp_dump.dat,并不进行表的导入

示例3:恢复表的两个分区,恢复后表分区重新命名并且放置于SALES_PRE_2000_TS表空间

Oracle 12c 新特性:RMAN Recover Table 详解

1. Recover Table 和 Table Partitions概述

Oracle 从12c开始支持在RMAN 中进行表级的恢复操作,即对单表进行recover。官方文档链接如下:

http://docs.oracle.com/database/122/BRADV/rman-recovering-tables-partitions.htm

RMAN的表级和表分区级恢复可以使用在如下场景:

\1. 恢复小表时。也可以使用TSPITR 的方法,但该方法效率很低,因为需要移动表空间中的所有对象。

\2. 恢复有逻辑损坏或者被删除的表。

\3. Flashback Table 不可用,比如undo 数据已经被覆盖。

\4. DDL 操作后需要恢复数据。Flashback Table 不支持表结构发生改变后的回退。 比如truncate table。

只要之前创建了RMAN 备份,就可以根据指定的的时间来进行表级和表分区级的恢复操作,而且不影响其他的数据库对象。

可以根据在以下三种级别指定时间:

(1) SCN

(2) Sequence number

(3) Time:根据 NLS_LANG 和 NLS_DATE_FORMAT 环境变量中的格式来指定时间,也可以用SYSDATE,比如 SYSDATE-30.

为了恢复表或者表分区, 需要备份undo,SYSTEM,SYSAUX和包含表或者表分区的表空间。

如果恢复的表在PDB中,那么需要备份如下内容:

\1. Root的SYSTEM,SYSAUX 和undo 表空间,SEED,以及包含表的PDB。

\2. 包含表或分区的表空间

当然恢复表或者表分区也有限制条件,以下情况不能使用:

\1. SYS 用户的表或表分区不能进行恢复

\2. SYSTEM 和SYSAUX 表空间中的表或表分区不能进行恢复。

\3. Standby 数据库上的表或表分区不能进行恢复。

\4. 在使用REMAP 的情况下,有NOT NULL 约束的表不能进行恢复。

RMAN从备份中自动处理恢复表或者表分区时会执行如下步骤:

1.判断哪些备份包含需要恢复的表或表分区,然后根据指定的时间来进行恢复。

2.判断目标主机上是否有足够的空间来创建auxiliary instance,该实例用于处理表或分区的恢复。 如果需要的空间不足,那么RMAN 会报错并退出恢复操作。

3.创建auxiliary database,并根据指定的时间来恢复指定的表或表分区到auxiliary database中。 辅助数据库的数据文件位置可以在命令中指定。

4.创建包含恢复表或表分区的数据泵文件(expdp dump file)。 数据泵的名称和位置也可以在命令中指定。

\5. (可选操作)将上一步生产的数据泵文件导入到目标实例中。当然也可以选择不导入,如果选择不导入就必须使用impdp 手工导入。

\6. (可选操作)在目标数据库中rename 恢复表或表分区。

2 PDB操作示例

2.1 准备测试环境

因为特性不支持系统用户和表,所以需要先创建独立的用户和表空间:

2.2 RMAN 备份CDB

--使用如下命令备份CDB的组建:ROOT,SEED,PDBS:

RMAN> backup database plus archivelog;

具体过程省略,第一小节已有说明,在PDB 中必须备份ROOT,SEED,和所有的PDBS.

2.3 恢复数据

现在drop cndba 表,然后执行恢复操作:

注意这里只能是drop,truncate不能recover。 如果是truncate,那么就不能执行导入操作。

注意在链接RMAN 时需要连接到root,并且具有SYSDBA 或 SYSBACKUP 权限。

可以使用rman target sys 或 rman target /(The connection is established as the SYS user with SYSDBA privilege)

恢复过程:还原system,undo,sysaux表空间,然后read only数据库,然后重启数据库还原表所在表空间,然后expdp导出表,根据需要决定是否导入表到原PDB数据库中,最后删除辅助数据库。 整个过程对原PDB没有影响。

恢复命令如下:

大致过程:

Creating automatic instance, with SID='ajrg' -----这里开始创建auxiliary instance

Starting restore at 17-APR-17 -----先restore database

Starting recover at 17-APR-17 ----再recover

# create directory for datapump import -----使用数据泵导出相关数据

Performing import of tables... -------向target database导入数据

Removing automatic instance

Automatic instance removed ------删除环境

完整log:

3 注意事项

3.1 说明1:PDB操作恢复的数据还在原PDB中生成

上面的示例是在PDB中演示的。 操作对象是单表,实际上对分区表中的单个分区也可以进行类似操作。

3.2 说明2: RMAN-05112: table "LOTUS"."CNDBA" already exists

在PDB测试中 , 最开始的操作的时候,是对cndba表进行truncate 操作的。 但是执行recover时报错。 提示表已经存在,尝试remap,并未成功。 后来drop 掉表后成功recovoer。

当然也使用导出,添加notableimport参数不执行导入操作,然后在手工处理。

3.3 说明3:ORA-01516: nonexistent log file 问题

第一次模拟的时候,recover 时报了数据文件不存在的问题。 实际上这个数据文件是我自己创建的。 后来换了个环境,重新备份后正常。 推测之前其他的rman 备份导致的异常。

3.4 说明4:non-CDB与PDB的区别

官网文档里还有另外一种写法,就是不带PDB 名称的。在CDB架构中测试的时候,会一直报RMAN-05057的错误:

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复