OCP-08:PDB 快照

PDB 的快照创建和管理,以及通过快照创建 PDB。

PDB Snapshot Carousel 提供了 PDB 手动或自动生成快照,为开发测试用例提供了便捷。
CDB 为 local undo 和归档模式下,指定 max_pdb_snapshots 控制 PDB 最多生成的快照数量,当快照超过最大数量时,会覆盖最旧的快照。

pdb1_prod 为生产 PDB,然后创建 refres PDB pdb1_test_master,让其每天生成快照,当需要测试用例时,可以指定 snapshot 创建 PDB。

PDB Snapshot Carousel 如何工作的?

数据库按需或自动创建 carousel 中的连续副本。当达到快照限制时(最多8个),数据库将覆盖旧的快照,类似于 Linux 中日志轮转一样。
PDB 快照的文件存放在文件系统上的物理文件中,其不包含数据库归档文件 archive log,默认存储在 PDB 的数据文件相同的目录中。
系统自动生成的 snapshot 以 snap_ 名称开始,唯一标识结尾的命名规则,包含了快照当前的 SCN,并且扩展名为 .PDB

设置 PDB 快照的最大数量

使用 max_pdb_snapshots 参数设置 PDB 快照最大数量。
通过视图 cdb_properties 查询当前 max_pdb_snapshots 值,可以使用 alter pluggable database 更改 max_pdb_snapshots 值。

SQL> set linesize 1500
SQL> col con_id format 99999
SQL> col propery_name format a17
SQL> col pdb_name format a9
SQL> col value format a12
SQL> select r.con_id, p.pdb_name, property_name,property_value as value, description FROM cdb_properties r,cdb_pdbs p where r.con_id = p.con_id and property_name LIKE 'MAX_PDB%' order by property_name;

默认快照最大数量为 8

将当前 PDB 的快照数量设置为 7

SQL> alter session set container=PDB;
SQL> alter pluggable database set max_pdb_snapshots=7;

删除所有的快照:

SQL> alter pluggable database set max_pdb_snapshots=0;

配置自动生成 PDB 快照

默认都是手动生成快照,可以使用 snapshot mode every 子句自动产生 PDB 快照。

SQL> select snapshot_mode "s_mode" , snapshot_interval/60 "snap_int_hrs" FROM dba_pdbs;

s_mode snap_int_hrs
------ ------------
MANUAL

进入 PDB,更改自动创建模式为每 24 小时自动生成 PDB 快照:

SQL> alter session set container=PDB;
SQL> alter pluggable database snapshot mode every 24 hours;
alter pluggable database snapshot mode every 24 hours
*
ERROR at line 1:
ORA-12754: Feature PDB SNAPSHOT CAROUSEL is disabled due to missing capability
.

报错解决方法:

SQL> alter session set container=cdb$root;
SQL> alter system set "_exadata_feature_on"=true scope=spfile;
SQL> shutdown immediate;
SQL> startup

SQL> alter pluggable database PDB open;
SQL> alter session set container=PDB;
SQL> alter pluggable database snapshot mode every 24 hours;

确认自动生成快照的时间间隔:

SQL> select snapshot_mode "s_mode", snapshot_interval/60 "snap_int_hrs" from dba_pdbs;

s_mode snap_int_hrs
------ ------------
AUTO             24

登录 CDB,从 PDB 创建 PDB2 并配置为每 2 小时自动创建快照:

conn / as sysdba;
SQL> create pluggable database PDB2 from PDB file_name_convert=('PDB','PDB2') snapshot mode every 120 minutes;
SQL> alter pluggable database PDB2 open;
SQL> alter pluggable database PDB2 save state;

查看创建的快照:

SQL> select p.con_id, p.pdb_name,p.snapshot_mode,p.snapshot_interval from cdb_pdbs p order by 1;

更改快照设置:

SQL> alter session set container=PDB2;
SQL> alter pluggable database PDB2 snapshot mode every 30 minutes;
SQL> select p.con_id, p.pdb_name,p.snapshot_mode,p.snapshot_interval from cdb_pdbs p order by 1;

    CON_ID
----------
PDB_NAME
-------------------------------------------------------------------
SNAPSH SNAPSHOT_INTERVAL
------ -----------------
         4
PDB2
AUTO                  30

更改为小时:

SQL>  alter pluggable database PDB2 snapshot mode every 1 hours;
SQL> select p.con_id, p.pdb_name,p.snapshot_mode,p.snapshot_interval from cdb_pdbs p order by 1;

    CON_ID
----------
PDB_NAME
----------------------------------------------------------------------------
SNAPSH SNAPSHOT_INTERVAL
------ -----------------
         4
PDB2
AUTO                  60

将快照模式设置为手动:

SQL> alter pluggable database snapshot mode manual;
SQL> select p.con_id, p.pdb_name,p.snapshot_mode,p.snapshot_interval from cdb_pdbs p order by 1;

    CON_ID
----------
PDB_NAME
--------------------------------------------------------------------------------
SNAPSH SNAPSHOT_INTERVAL
------ -----------------
         4
PDB2
MANUAL

关闭快照:

SQL> alter pluggable database snapshot mode none;
SQL> select p.con_id, p.pdb_name,p.snapshot_mode,p.snapshot_interval from cdb_pdbs p order by 1;

    CON_ID
----------
PDB_NAME
--------------------------------------------------------------------------------
SNAPSH SNAPSHOT_INTERVAL
------ -----------------
         4
PDB2
NONE

手动创建快照

显示快照信息:

SQL> select con_id,con_name,snapshot_name,snapshot_scn,full_snapshot_path FROM cdb_pdb_snapshots order by con_id,snapshot_scn;

no rows selected

没有任何信息,现在生成快照,一个系统,一个自定义快照:

SQL> show con_name;

CON_NAME
------------------------------
PDB2

SQL> show user;
USER is "SYS"

SQL> alter pluggable database snapshot;
alter pluggable database snapshot
*
ERROR at line 1:
ORA-65363: pluggable database PDB2 not enabled for snapshots


SQL> alter pluggable database snapshot test_snapshot;
alter pluggable database snapshot test_snapshot
*
ERROR at line 1:
ORA-65363: pluggable database PDB2 not enabled for snapshots

CDB 必须时 LOCAL UNDO 模式,用户必须有权限创建和删除 PDB。
如果不指定快照名,系统自动生成唯一名称的快照:

SQL> alter pluggable database snapshot mode manual;
SQL> alter pluggable database snapshot test_snapshot;
alter pluggable database snapshot test_snapshot
*
ERROR at line 1:
ORA-64762: cannot create snapshot

此时失败的原因是快照最大数设置成了 0

[oracle@oel7-host1 ~]$ oerr ORA 64762
64762, 0000, "cannot create snapshot"
// *Cause:    An attempt was made to create a snapshot while 'max_pdb_snapshots'
//            was set to 0.
// *Action:   max_pdb_snapshots should be set greater than 0 to take pdb snapshots.

修改设置并创建快照:

SQL> alter session set container=PDB2;
SQL> alter pluggable database set max_pdb_snapshots=8;

SQL> alter pluggable database snapshot;
SQL> alter pluggable database snapshot test_snapshot;

查看生成的快照:

SQL> col snapshot_name format a30
SQL> col full_snapshot_path format a80
SQL> select con_id,con_name,snapshot_name,snapshot_scn,full_snapshot_path FROM cdb_pdb_snapshots order by con_id,snapshot_scn;

    CON_ID
----------
CON_NAME
--------------------------------------------------------------------------------
SNAPSHOT_NAME                  SNAPSHOT_SCN
------------------------------ ------------
FULL_SNAPSHOT_PATH
--------------------------------------------------------------------------------
         4
PDB2
SNAP_3318643222_1190547411          2433997
/u01/app/oracle/oradata/ORCL/PDB2/snap_3318643222_2433997.pdb


    CON_ID
----------
CON_NAME
--------------------------------------------------------------------------------
SNAPSHOT_NAME                  SNAPSHOT_SCN
------------------------------ ------------
FULL_SNAPSHOT_PATH
--------------------------------------------------------------------------------
         4
PDB2
TEST_SNAPSHOT                       2434524
/u01/app/oracle/oradata/ORCL/PDB2/snap_3318643222_2434524.pdb

删除快照

可以将 max_pdb_snapshots 设置为 0 ,即删除所有 PDB 快照,同时也关闭快照功能。
也可以使用 alter pluggable database 删除当前的快照:

SQL> alter pluggable database drop snapshot SNAP_3318643222_1190547411;

SQL> select con_id,con_name,snapshot_name,snapshot_scn,full_snapshot_path FROM cdb_pdb_snapshots order by con_id,snapshot_scn;

    CON_ID
----------
CON_NAME
--------------------------------------------------------------------------------
SNAPSHOT_NAME                  SNAPSHOT_SCN
------------------------------ ------------
FULL_SNAPSHOT_PATH
--------------------------------------------------------------------------------
         4
PDB2
TEST_SNAPSHOT                       2434524
/u01/app/oracle/oradata/ORCL/PDB2/snap_3318643222_2434524.pdb

从 snapshot 创建 PDB

首先需要在系统中创建 PDB 目录:

[oracle@oel7-host1 ~]$ mkdir /u01/app/oracle/oradata/ORCL/PDB_snap_test

基于快照创建 PDB:

SQL> show con_name;

CON_NAME
------------------------------
CDB$ROOT

SQL> alter system set db_create_file_dest='/u01/app/oracle/oradata/ORCL/PDB_snap_test';

SQL> create pluggable database PDB_snap_test from PDB2 using snapshot test_snapshot;

SQL> alter pluggable database PDB_SNAP_TEST open;
SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB                            READ WRITE NO
         4 PDB2                           READ WRITE NO
         5 PDB_SNAP_TEST                  READ WRITE NO

SQL> alter pluggable database PDB_SNAP_TEST close;
SQL> drop pluggable database PDB_SNAP_TEST including datafiles;

基于 SCN 或时间点来创建 PDB:

SQL> select con_id,con_name,snapshot_name,snapshot_scn,full_snapshot_path FROM cdb_pdb_snapshots order by con_id,snapshot_scn;

    CON_ID
----------
CON_NAME
--------------------------------------------------------------------------------
SNAPSHOT_NAME
--------------------------------------------------------------------------------
SNAPSHOT_SCN
------------
FULL_SNAPSHOT_PATH
--------------------------------------------------------------------------------
         4
PDB2
TEST_SNAPSHOT

    CON_ID
----------
CON_NAME
--------------------------------------------------------------------------------
SNAPSHOT_NAME
--------------------------------------------------------------------------------
SNAPSHOT_SCN
------------
FULL_SNAPSHOT_PATH
--------------------------------------------------------------------------------
     2434524
/u01/app/oracle/oradata/ORCL/PDB2/snap_3318643222_2434524.pdb

根据返回的 2434524 SCN 点来创建 PDB:

SQL> show con_name;

CON_NAME
------------------------------
CDB$ROOT

SQL> create pluggable database PDB_snap_test from PDB2 using snapshot at SCN 2434524;
SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB                            READ WRITE NO
         4 PDB2                           READ WRITE NO
         6 PDB_SNAP_TEST                  MOUNTED

注意:在生成 Snapshot 与通过 Snapshot 创建 PDB 过程中,消耗的时间和占据物理资源会很大。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

滚动至顶部