zftang
作者zftang·2020-04-15 11:03
其它·小白一枚

Oracle12c-CDB和PDB备份、恢复与闪回手册

字数 7098阅读 1530评论 0赞 0

1. 多租户环境中的备份和恢复介绍

CDB 和 PDB 有多个备份和恢复选项,使用 archivelog 模式将增强数据的恢复能力,但在多租户环境中,仅能在 CDB 级别启用 archivelog 模式,因为重做日志文件仅处于 CDB 级别。否则,仍可以像在非 CDB 环境中那样备份数据库。可备份整个 CDB 、单个 PDB 、表空间、数据文件及至容器任何位置中的单个块。

2. CDB 和 PDB 的数据库备份

2.1 备份 CDB 和 PDB

对于多租户数据库,已修改了 RMAN 语法,添加了新子句。在 OS 级别,环境变量 ORACLE_SID 之前在实例级别设置,但现在, CDB 中的所有数据库都在相同数据库实例上运行,你可以使用服务名(而非实例名),通过 RAMN 连接到单个 PDB 。下面是一个实例:

与旧版本一样,可使用自己熟悉的语法,通过 RMAN 连接到 CDB :

但注意,两种情况下,目标数据库都显示为 ORCL ,可通过 report schema 命令来区分:连接到 CDB 会显示所有表空间,包括种子数据库和根容器中的表空间。连接到单个 PDB 将只返回本数据库的表空间。

连接到 CDB 的截图如下:

连接到 PDB 的截图如下:

RAMN BACKUP , RESTORE 和 RECOVER 命令已得到增强,当运行于一个或多个 PDB 时,增加了 PLUGGABLE 关键字:

另外,可使用 PDB 名来限定表空间备份,从而备份 PDB 中的一个特定表空间:

如果未加限定,当连接到 CDB 时,所有 RMAN 命令将运行于根容器和所有 PDB 。要仅备份根容器,使用名称 CDB$ROOT, CDB$ROOT 是 CDB 根容器的名称。

2.2 备份 CDB

如上所述,可备份整个 CDB (作为一次全面备份)、 CDB 中的一个 PDB 乃至任何 PDB 或根容器中的单独表空间。要运行 RMAN 并备份一个容器,用户必须拥有公共账户,该账户拥有根容器中的 SYSDBA 或 SYSBACKUP 权限。为分离职责, Oracle 建议,如果一个数据库用户仅负责数据库备份和恢复,应只为该用户分配 SYSBACKUP 权限。

由于 CDB 类似于 12c 之前的数据库(非 CDB ),备份看起来类似于在 Oracle Database 11G 中创建的 Rman 备份。可创建备份集或映像副本,以及控制文件、 SPFILE 以及可选的归档重做日志文件。

如果需要执行部分 CDB 备份,使用 RMAN 连接到容器( CDB ),使用 PLUGGABLE DATABASE 子句,在一条命令中备份一个或多个容器以及根容器,如下例所述:

2.3 备份 PDB

备份 PDB 也类似于备份 Oracle 12C 或旧版本中的非 CDB 。注意,备份 PDB 等同于备份一部分 CDB ,但不含根容器( CDB$ROOT )。为分离职责,只有一个 PDB 中包含拥有 SYSBACKUP 权限的用户。用户将连接到 PDB ,对其进行备份,就像在非 CDB 中那样。本例子中显示了完整备份 pdb1 :

3. CDB 和 PDB 数据恢复

恢复丢失的 PDB 数据文件与非 CDB 数据库一样, PDB 和 CDB 都可能遇到实例故障或者介质故障,需要执行某种恢复操作。可在 CDB 级别, PDB 级别, PDB 中的表空间、数据文件甚至单个块上执行恢复。一个重要区别在于实例恢复:由于所有 PDB 和 CDB 共享一个实例,如果 CDB 停机,所有 PDB 都会停机,因此实例的崩溃恢复仅发生在 CDB 级别。与此类似,存在与 CDB 级别的任意全局对象,如控制文件、重做日志文件或根容器的 SYSTEM 或者 UNDO 表空间的数据文件仅需要 CDB 级别的介质恢复。

下面介绍介质故障类型以及恢复方式。多数场景的恢复方案与非 CDB 相同,对于当个 PDB 而言,一个 PDB 的恢复对同时打开的其他 PDB 几乎没有干扰。

3.1 恢复临时文件

由上可知, CDB 级别存在一个临时表空间,临时表空间中包含一个或多个临时文件,但是,如果应用程序具有不同的需求,每个 PDB 将有各自的临时表空间。如果 PDB 的 DML 或 select 语句需要 CDB 级别的 TEMP 表空间,但由于介质故障, TEMP 表空间突然丢失,本例子中,模拟 CDB 的临时文件丢失:

一个解决该问题的简单粗暴方式是重新启动整个 CDB 。相反,你可以仅向 TEMP 表空间添加另一个临时文件,并删除那个不存在的临时文件:

3.2 恢复丢失的控制文件

丢失一个或所有控制文件的严重程度与在非 CDB 中丢失控制文件相同。 Oracle 建议最好保留控制文件的三个副本,如果丢失了控制文件的所有副本,可从最新的 Rman 自动备份中获取。在本例子中,模拟丢失控制文件, CDB 将无法启动(因此, PDB 都无法启动):

以上手动删除控制文件,数据库启动报错 ORA-00205 。接下来使用 RAMN 对控制文件进行恢复,如下:

宕机情况下找出数据库的 DBID

数据库已正常启动,可启动所有 PDB 数据库

3.3 PDB 数据库恢复

因为所有 PDB 都独立运行,像是非 CDB 一样,所以一个 PDB 上出现故障或丢失数据文件不影响根容器或其他 PDB 。

3.4 使用 DRA 修复数据库

DRA ( Data Recovery Advisor, 数据恢复顾问)可主动和被动的分析故障。这两种情况下,它不会自动修复所找到的问题,而是提供一个或多个可能的修复选项和命令。从 Oracle 12c 第一版( 12.1.0.1 )开始,仅支持非 CDB 和单实例 CDB (非 RAC 环境)。

在以前的 Oracle RMAN 版本中,你可以使用 VALIDATA 命令,前瞻性地检查数据文件。在 CDB 环境中,增强了 VALIDATE 命令,来分析各个 PDB 或整个 CDB 。

例子:以下模拟 CDB 数据库 PDB1 中 system 表空间丢失情况

生成建议的修复脚本: /u01/app/oracle/diag/rdbms/orcl/orcl/hm/reco_2828574702.hm

执行建议的修复脚本

如上使用 list failure detail,change failure XXX closed, advise failure XXX ,继续修复数据库。

4. 闪回特性

本节测试撤销表空间支持的闪回特性 Flashback Query( 闪回查询 ) 、 Flashback Table( 闪回表 ) 、 Flashback Version Query( 闪回版本查询 ) 以及 Flashback Transaction Query( 闪回事物查询 ) ,以及 Flashback Drop( 闪回删除 ) 。

4.1 Flashback Query( 闪回查询 )

受限制参数 undo_retention 默认时间 900S 。即 15 分钟。

例子:

首先创建测试表 t_test

create table t_test as SELECT * FROM dba_data_files;

然后使用 delete 删除部分数据

delete t_test t where t.file_id in ('33','34');

commit;

使用闪回查询将 5 分钟之前删除的数据检索出来,放入 t_test_arc

create table t_test_arc as

SELECT * FROM t_test as of timestamp systimestamp - interval '5' minute

where t_test.file_id not in (

SELECT file_id from t_test

)

至此 5 分钟之前删除的数据已恢复。

4.2 Flashback Table( 闪回表 )

Flashback Table 特性不仅能还原表中行在过去某个时间点的状态,也能还原表的索引、触发器和约束,同时数据库保持联机,从而提高数据库整体的可用性。可以将表还原到时间戳或 SCN 。如果用户错误的范围较小,只局限于一个或非常少的几个表中, Flashback Table 就由于其他闪回方法。如果知道需要无条件地将表还原到过去某个时间点,则使用 Flashback Table 也是最简单的办法。对于恢复大量表的状态,闪回数据库可能是比较好的选择。

要想在一个表或多个表上使用 Flashback Table ,必须在执行闪回操作之前在表上启用行移动,虽然行移动不需要在用户错误发生时有效。也需要行移动来支持 Oracle 的段收缩功能,因为行移动将改变表行的 ROWID ,如果应用程序是基于与给定的 ROWID 相同的 ROWID ,则不要启动行移动,知道删除改行,如果应用程序没有通过 ROWID 引用表,则可进行移动模式。

create table t_test3 as SELECT * FROM dba_users;

delete from t_test3;

commit;

alter table t_test3 enable row movement;

select * from t_test3 as of timestamp systimestamp - interval '8' minute;

flashback table t_test3 to timestamp systimestamp - interval '8' minute;

4.3 Flashback Version Query( 闪回版本查询 )

Flashback Version Query( 闪回版本查询 ) 是另一个依赖于撤销数据的闪回特性,它比 as of 查询提供的信息更详细。到现在为止,介绍的闪回方法都是恢复特定时间点的行或者表,而 Flashback Version query 则返回两个 SCN 或者时间戳之间给定完整历史记录。

语法
select column_name 【 , column_name,…. 】
from table_name
versions
between 【 scn|timestamp 】【 expr| minvalue 】
and 【 expr| maxvalue 】 as of 【 scn | timestamp 】 expr;

说明:

column name :列名。
table_ name :表名。
between…and : 时间段。
scn :系统改变号。
timestamp :时间戳。
as of :表示恢复单个版本。
maxvalue :最大值。
minvalue :最小值。
expr :指定一个值或表达式。

create table sct3( id number(4), name varchar2(20) );

insert into sct3 values(1,'lili');

commit;

insert into sct3 values(2,'lilic');

commit;

update sct3 set name='yuyuanshang' where id=2;

commit;

insert into sct3 values(3,'lilid');

commit;

select id, name,versions_operation,versions_starttime,versions_endtime

from sct3

versions between timestamp minvalue and maxvalue

order by id,versions_endtime;

select id, name,versions_operation,versions_starttime,versions_endtime

from sct3

versions

between timestamp to_date('2018-10-09 12:24:26','yyyy-mm-dd hh24:mi:ss') and to_date('2018-10-09 12:28:26','yyyy-mm-dd hh24:mi:ss')

order by id,versions_endtime;

4.4 Flashback Transaction Query( 闪回事物查询 )

闪回事务查询是闪回版本查询的一个扩充、闪回事务查询可以审计某个事务或者撤销一个已经提交的事务

create table sct4(

id number(4),

name varchar2(20)

);

insert into sct4 values(1,'lili');

commit;

insert into sct4 values(2,'lilic');

commit;

delete sct4 where id=1;

commit;

select id, name,versions_xid,versions_operation,versions_starttime,versions_endtime

from sct4

versions between timestamp minvalue and maxvalue

order by id,versions_endtime;

SELECT xid, start_scn, commit_scn, operation, logon_user, undo_sql

FROM flashback_transaction_query WHERE xid ='07000B00E4010000';

4.5 闪回删除表 drop

当删除一个表及其相关的索引、约束和嵌套表时, Oracle 并不会立即释放该表的磁盘空间供表空间中的其他对象使用,相反,对象任维护在回收站中,直到对象被其他所有者清除,或者有新的对象需要一删除对象所占用的空间。 注意 Flashback 不支持 sys 用户, system 表空间下面的对象,也不能从回收站里拿到。故使用 sys 或是 system 用户登录时, show recyclebin 为空。

create table sct5(

id number(4),

name varchar2(20)

);

insert into sct5 values(1,'lili');

commit;

insert into sct5 values(2,'lilic');

commit;

drop table sct5;

commit;

select object_name,original_name,partition_name,type,ts_name,createtime,droptime from dba_recyclebin;

flashback table sct5 to before drop;

5. RMAN 新特性 Recover table 恢复表

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

  1. 恢复小表时。也可以使用 TSPITR 的方法,但该方法效率很低 , 因为需要移动表空间中的所有对象。
  2. 恢复有逻辑损坏或者被删除的表。
  3. Flashback Table 不可用,比如 undo 数据已经被覆盖。
  4. DDL 操作后需要恢复数据。 Flashback Table 不支持表结构发生改变后的回退。 比如 truncate table 。

SQL> alter session set container=pdb1;
Session altered.
SQL> create table t_recovertable as select * from dba_tables;
Table created.

备份数据库
RMAN> backup database format '/backup/full_ORCL_%T_%u';

查询当前数据库的 scn 号
SQL> select current_scn from v$database;

SQL> drop table t_recovertable;

创建临时恢复目录

[oracle@oracle12c ~]$ mkdir /backup/abc

RMAN> recover table t_recovertable of pluggable database pdb1 until scn XXXXX auxiliary destination '/backup/abc'

基于时间点恢复:

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

recover table lotus.cndba of pluggable database pdb1

until time "to_date('2018-09-17 10:20:49','yyyy-mm-dd hh24:mi:ss')"

auxiliary destination ' /backup/abc '

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广