客服微信
本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
Oracle 18c 引入了快照轮播的概念,它是 PDB 的一系列时间点副本或快照。
Oracle 12c 允许使用存储快照副本创建 PDB 克隆,但您可以想象它们需要特定的存储功能来支持这些快照。本文讨论的功能与这些快照副本无关,也不依赖于存储快照。
Oracle 12.2 增强了拔出/插入功能,允许创建 PDB 存档文件,这些文件是 PDB 数据文件的压缩副本以及 PDB 描述 XML 文件。
在 Oracle 18c 中,PDB 快照实际上只是一个 PDB 存档文件,如上所述,但数据库在创建期间仍然可用。因此,PDB 快照是 PDB 的时间点副本,可用于恢复目的,或根据该特定时间点生成新的 PDB。这些快照可以手动或自动创建。生成的归档文件放置在与 PDB 数据文件相同的位置,或者如果使用Oracle 管理文件 (OMF),则将它们放置在 DB_CREATE_FILE_DEST 参数指定的位置。
快照轮播是 PDB 快照的集合。收集的最大快照数量由 MAX_PDB_SNAPSHOTS 参数定义,默认值为 8。一旦达到最大快照数量,下一次创建快照将触发删除最旧的快照,使得这些快照看起来像是以循环方式覆盖,因此称为“轮播”。
此功能目前仅限于集成系统(例如 Exadata)上的企业版以及 Oracle 数据库云服务上的企业版或更高版本,如此处所述。有一个通过启用“_exadata_feature_on”初始化参数进行测试的解决方法。
export ORACLE_SID=cdb1 export ORAENV_ASK=NO . oraenv export ORAENV_ASK=YES sqlplus / as sysdba <
如果您使用 Oracle Managed Files (OMF),则无需担心文件名转换。如果您不使用 OMF,则所有PDB 创建语句都需要使用 CREATE PLUGGABLE DATABASE 语句中的 FILE_NAME_CONVERT 或CREATE_FILE_DEST 设置进行文件名转换。
您将需要足够的空间来在磁盘上保存 PDB 的多个副本,因此我不确定这对于大型数据库来说是一个不错的选择。
三、创建PDB存储快照
对 PDB 快照的支持可以在 PDB 创建期间作为 CREATE PLUGGABLE DATABASE 语句的一部分进行定义,或者在 PDB 创建之后使用 ALTER PLUGGABLE DATABASE 语句进行定义。 SNAPSHOTMODE 子句接受以下设置之一。
- NONE: PDB不支持快照。
- MANUAL: PDB支持快照,但只能手动创建快照。
- 每n小时:系统每隔n小时自动创建一个快照。其中n在1到1999之间。
- 每n分钟:系统每隔n分钟自动创建一个快照。其中n在1到2999之间。
以下示例创建一个新的 PDB,它每 24 小时自动拍摄一次快照。创建现有 PDB 的克隆时可以使用相同的方法。
CONN / AS SYSDBA CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdb_admin IDENTIFIED BY Password1 SNAPSHOT MODE EVERY 24 HOURS; ALTER PLUGGABLE DATABASE pdb2 OPEN; ALTER PLUGGABLE DATABASE pdb2 SAVE STATE;
我使用的是 OMF,因此不需要 FILE_NAME_CONVERT 设置。
快照设置使用 CDB_PDBS 视图中的 SNAPSHOT_MODE 和 SNAPSHOT_INTERVAL 列显示。请注意,SNAPSHOT_INTERVAL 值以分钟为单位显示。以下查询作为 pdb_snapshot_mode脚本使用.
COLUMN pdb_name FORMAT A10 COLUMN snapshot_mode FORMAT A15 SELECT p.con_id, p.pdb_name, p.snapshot_mode, p.snapshot_interval FROM cdb_pdbs p ORDER BY 1; CON_ID PDB_NAME SNAPSHOT_MODE SNAPSHOT_INTERVAL ---------- ---------- --------------- ----------------- 2 PDB$SEED MANUAL 3 PDB1 MANUAL 4 PDB2 AUTO 1440
您必须连接到 PDB 才能更改快照设置。如果您尝试从根容器更改快照设置,您将收到以下错误消息。
CONN / AS SYSDBA ALTER PLUGGABLE DATABASE pdb2 SNAPSHOT MODE EVERY 30 MINUTES; * ERROR at line 1: ORA-65118: operation affecting a pluggable database cannot be performed from another pluggable database
在以下示例中,我们使用 ALTER PLUGGABLE DATABASE 命令更改快照设置。
CONN / AS SYSDBA ALTER SESSION SET CONTAINER = pdb2; ALTER PLUGGABLE DATABASE SNAPSHOT MODE EVERY 2999 MINUTES; @pdb_snapshot_mode CON_ID PDB_NAME SNAPSHOT_MODE SNAPSHOT_INTERVAL ---------- ---------- --------------- ----------------- 4 PDB2 AUTO 2999 SQL> ALTER PLUGGABLE DATABASE SNAPSHOT MODE EVERY 1999 HOURS; @pdb_snapshot_mode CON_ID PDB_NAME SNAPSHOT_MODE SNAPSHOT_INTERVAL ---------- ---------- --------------- ----------------- 4 PDB2 AUTO 119940 SQL> ALTER PLUGGABLE DATABASE SNAPSHOT MODE MANUAL; @pdb_snapshot_mode CON_ID PDB_NAME SNAPSHOT_MODE SNAPSHOT_INTERVAL ---------- ---------- --------------- ----------------- 4 PDB2 MANUAL SQL> ALTER PLUGGABLE DATABASE SNAPSHOT MODE NONE; @pdb_snapshot_mode CON_ID PDB_NAME SNAPSHOT_MODE SNAPSHOT_INTERVAL ---------- ---------- --------------- ----------------- 4 PDB2 NONE SQL> ALTER PLUGGABLE DATABASE SNAPSHOT MODE EVERY 24 HOURS; @pdb_snapshot_mode CON_ID PDB_NAME SNAPSHOT_MODE SNAPSHOT_INTERVAL ---------- ---------- --------------- ----------------- 4 PDB2 AUTO 1440
当前 MAX_PDB_SNAPSHOTS 参数值使用 CDB_PROPERTIES 视图显示。以下查询可作为 max_pdb_snapshots.sql 脚本使用。
SET LINESIZE 150 TAB OFF COLUMN property_name FORMAT A20 COLUMN pdb_name FORMAT A10 COLUMN property_value FORMAT A15 COLUMN description FORMAT A50 SELECT pr.con_id, p.pdb_name, pr.property_name, pr.property_value, pr.description FROM cdb_properties pr JOIN cdb_pdbs p ON pr.con_id = p.con_id WHERE pr.property_name = 'MAX_PDB_SNAPSHOTS' ORDER BY pr.property_name; CON_ID PDB_NAME PROPERTY_NAME PROPERTY_VALUE DESCRIPTION ---------- ---------- -------------------- --------------- ------------- ------------------------------------- 4 PDB2 MAX_PDB_SNAPSHOTS 8 maximum number of snapshots for a given PDB
您必须连接到 PDB 才能更改 MAX_PDB_SNAPSHOTS 参数。如果您尝试从根容器更改快照设置,您将收到以下错误消息。
CONN /AS SYSDBA ALTER PLUGGABLE DATABASE pdb2 SET MAX_PDB_SNAPSHOTS=4; * ERROR at line 1: ORA-65046: operation not allowed from outside a pluggable database
连接到 PDB 后,我们可以将 MAX_PDB_SNAPSHOTS 参数设置为 0 到 8 之间的值,其中 0 会导致删除所有现有快照。
CONN /AS SYSDBA ALTER SESSION SET CONTAINER = pdb2; -- Value 0 removes all existing snapshots for the PDB. ALTER PLUGGABLE DATABASE SET MAX_PDB_SNAPSHOTS=0; @max_pdb_snapshots CON_ID PDB_NAME PROPERTY_NAME PROPERTY_VALUE DESCRIPTION ---------- ---------- -------------------- --------------- ------------ -------------------------------------- 4 PDB2 MAX_PDB_SNAPSHOTS 0 maximum number of snapshots for a given PDB SQL> ALTER PLUGGABLE DATABASE SET MAX_PDB_SNAPSHOTS=8; @max_pdb_snapshots CON_ID PDB_NAME PROPERTY_NAME PROPERTY_VALUE DESCRIPTION ---------- ---------- -------------------- --------------- ------------ -------------------------------------- 4 PDB2 MAX_PDB_SNAPSHOTS 8 maximum number of snapshots for a given PDB
四、手工快照
如果 SNAPSHOT_MODE 未设置为 NONE,我们可以在连接到 PDB 时使用 ALTER PLUGGABLE DATABASE SNAPSHOT 命令创建手动快照。从根容器运行命令会导致错误。
CONN / AS SYSDBA ALTER PLUGGABLE DATABASE pdb2 SNAPSHOT; * ERROR at line 1: ORA-65118: operation affecting a pluggable database cannot be performed from another pluggable database
以下示例使用系统生成的名称创建手动快照,以及使用用户定义的快照名称创建手动快照。
-- Connect to the PDB. CONN / AS SYSDBA ALTER SESSION SET CONTAINER = pdb2; -- System generated snapshot name. ALTER PLUGGABLE DATABASE SNAPSHOT; -- User-defined snapshot name. ALTER PLUGGABLE DATABASE SNAPSHOT my_snapshot;
有关可用快照的信息使用 CDB_PDB_SNAPSHOTS 视图显示。以下查询可作为 pdb_snapshots.sql脚本使用。
SET LINESIZE 150 TAB OFF COLUMN con_name FORMAT A10 COLUMN snapshot_name FORMAT A30 COLUMN snapshot_scn FORMAT 9999999 COLUMN full_snapshot_path FORMAT A50 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_688979926_996491289 1764864 /u02/oradata/snap_688979926_1764864.pdb 4 PDB2 MY_SNAPSHOT 1765251 /u02/oradata/snap_688979926_1765251.pdb
下面的示例展示了如何手动删除快照。它同样适用于具有用户定义或系统生成名称的快照。
-- Connect to the PDB. CONN / AS SYSDBA ALTER SESSION SET CONTAINER = pdb2; -- System generated snapshot name. ALTER PLUGGABLE DATABASE DROP SNAPSHOT SNAP_688979926_996491289; -- User-defined snapshot name. ALTER PLUGGABLE DATABASE DROP SNAPSHOT my_snapshot; @pdb_snapshots no rows selected
我们将确保至少有一个快照再次可用。
-- Connect to the PDB. CONN / AS SYSDBA ALTER SESSION SET CONTAINER = pdb2; -- System generated snapshot name. ALTER PLUGGABLE DATABASE SNAPSHOT; @pdb_snapshots CON_ID CON_NAME SNAPSHOT_NAME SNAPSHOT_SCN FULL_SNAPSHOT_PATH ---------- ---------- ------------------------------ ------------ -------------------------------------------------- 4 PDB2 SNAP_688979926_996491631 1765754 /u02/oradata/snap_688979926_1765754.pdb
五、从PDB快照中恢复
一些参考文献建议您可以删除 PDB 并从快照中恢复它,但删除 PDB 时所有快照都会被删除,因此您不能直接执行此操作。但是,您可以从快照创建新的 PDB。
CONN / AS SYSDBA ALTER SYSTEM SET DB_CREATE_FILE_DEST = '/u02/oradata'; CREATE PLUGGABLE DATABASE pdb2_copy FROM pdb2 USING SNAPSHOT SNAP_688979926_996491631 SNAPSHOT MODE EVERY 24 HOURS; ALTER PLUGGABLE DATABASE pdb2_copy OPEN; @pdb_snapshot_mode CON_ID PDB_NAME SNAPSHOT_MODE SNAPSHOT_INTERVAL ---------- ---------- --------------- ----------------- 2 PDB$SEED MANUAL 3 PDB1 MANUAL 4 PDB2 AUTO 1440 7 PDB2_COPY AUTO 1440
请注意,我们不仅从快照创建了新的可插入数据库,而且还将其设置为拥有自己的快照轮播。
让我们删除副本 PDB。
CONN / AS SYSDBA ALTER PLUGGABLE DATABASE pdb2_copy CLOSE; DROP PLUGGABLE DATABASE pdb2_copy INCLUDING DATAFILES;
六、从PDB快照中恢复
PDB快照是PDB在某个时间点的副本。创建快照时,源PDB可以是只读状态,也可以是读写状态。
PDB快照的克隆是完整的,独立的PDB。
CONN / AS SYSDBA CREATE PLUGGABLE DATABASE PDB_sp2 FROM pdb1 USING SNAPSHOT my_snapshot; select name from v$datafile;
七、创建克隆快照副本PDB
我们还可以创建快照副本,但使用限制也比较多
- · 如果存储系统使用Oracle Exadata稀疏磁盘组,则使用Oracle Exadata数据库创建快照副本PDB。但是,源PDB必须在快照副本PDB的生命周期内保持只读。
- · 如果存储系统不使用Oracle Exadata稀疏磁盘组,则其行为如下:
- · 如果CLONEDB=true,则为源PDB文件的底层文件系统可以是任何本地文件系统、网络文件系统(NFS)或集群文件。例如Oracle ACFS。如果使用网络文件系统,请使用Direct NFS应该为CDB启用。文件系统应该支持稀疏文件。大多数UNIX系统都满足这些要求。当CLONEDB=true时,源PDB的打开模式具有以下内容效果:
- · 如果源PDB以只读模式打开,则为Oracle Database使用写时拷贝技术创建快照副本PDB的快照复制PDB包含稀疏文件,而不是完整副本。
- · *如果源PDB不是以读写模式打开,则Oracle数据库发出错误。
- · 如果CLONEDB=false,则Oracle数据库错误。
下面的示例,如果参数clonedb=false
SQL> show parameter CLONEDB NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ clonedb boolean FALSE clonedb_dir string --尝试创建pdb快照副本 CREATE PLUGGABLE DATABASE pdb2_snap_copy FROM pdb2 SNAPSHOT COPY; CREATE PLUGGABLE DATABASE pdb2_snap_copy FROM pdb2 SNAPSHOT COPY * ERROR at line 1: ORA-65169: error encountered while attempting to copy file /u01/app/oracle/oradata/ORCLCDB/ORCLCDB/03D91A1C03B975F8E063814AA8C0584F/datafile/o1_mf_undotbs1_lgnm23fb_.dbf ORA-17525: Database clone using storage snapshot not supported on file /u01/app/oracle/oradata/ORCLCDB/ORCLCDB/03D91A1C03B975F8E063814AA8C0584F/datafile/o1_mf_undotbs1_lgnm23fb_.dbf
修改参数并重启,再次尝试创建快照副本pdb
SQL> alter system set CLONEDB=true scope = spfile; System altered. SQL> SQL> SQL> startup force --需要源pdb是只读状态 CREATE PLUGGABLE DATABASE pdb2_snap_copy FROM pdb2 SNAPSHOT COPY * ERROR at line 1: ORA-65081: database or pluggable database is not open in read only mode --将pdb2置为只读 SQL> alter pluggable database PDB2 close; SQL> alter pluggable database PDB2 open read only; --创建成功快照副本pdb CREATE PLUGGABLE DATABASE pdb2_snap_copy FROM pdb2 SNAPSHOT COPY; alter pluggable database pdb2_snap_copy open; alter session set container=pdb2_snap_copy; select name from v$datafile;
此时无法将pdb2打开为read write状态
SQL> alter pluggable database pdb2 close; Pluggable database altered. SQL> alter pluggable database pdb2 open; alter pluggable database pdb2 open * ERROR at line 1: ORA-01114: IO error writing block to file 81 (block # 1) ORA-01110: data file 81: '/u01/app/oracle/oradata/ORCLCDB/ORCLCDB/03D91A1C03B975F8E063814AA8C0584F/datafile/o1_mf_undotbs1_lgnm23fb_.dbf' ORA-27091: unable to queue I/O ORA-27041: unable to open file Linux-x86_64 Error: 13: Permission denied Additional information: 3
八、物化快照副本PDB
您可以通过运行ALTER PLUGGABLE DATABASE实现快照副本PDB带有MATERIALIZE子句的语句。实现快照副本PDB复制所有数据块。
ALTER PLUGGABLE DATABASE PDB2_SNAP_COPY MATERIALIZE;
实体化快照拷贝PDB将转换快照拷贝PDB,后者使用稀疏一个完整的PDB,它不使用稀疏文件。物化的PDB不再是依赖于源PDB,可以删除或更改为不同的打开模式。
九、PDB快照作业
自动 PDB 快照使用计划作业进行管理,其名称包括 PDB 名称和单词“SNAPSHOT”。我们可以看到
CONN / AS SYSDBA SET LINESIZE 200 COLUMN owner FORMAT A10 COLUMN job_name FORMAT A30 COLUMN repeat_interval FORMAT A50 SELECT owner, job_name, repeat_interval FROM dba_scheduler_jobs WHERE job_name LIKE '%SNAPSHOT' ORDER BY owner, job_name; OWNER JOB_NAME REPEAT_INTERVAL ---------- ------------------------------ -------------------------------------------------- SYS PDB2_688979926_SNAPSHOT FREQ = HOURLY; INTERVAL = 24
我们可以修改时间表以使其更加精确。
BEGIN DBMS_SCHEDULER.set_attribute ( name => 'PDB2_688979926_SNAPSHOT', attribute => 'REPEAT_INTERVAL', value => 'FREQ=HOURLY; INTERVAL=24; BYMINUTE=15;'); END; / SELECT owner, job_name, repeat_interval FROM dba_scheduler_jobs WHERE job_name LIKE '%SNAPSHOT' ORDER BY owner, job_name; OWNER JOB_NAME REPEAT_INTERVAL ---------- ------------------------------ -------------------------------------------------- SYS PDB2_688979926_SNAPSHOT FREQ=HOURLY; INTERVAL=24;BYMINUTE=15;
我们还可以检查作业操作以了解作业实际在做什么。
COLUMN job_action FORMAT A75 SELECT job_action FROM dba_scheduler_jobs WHERE job_name = 'PDB2_688979926_SNAPSHOT'; JOB_ACTION --------------------------------------------------------------------------- declare cur integer := sys.dbms_sql.open_cursor(security_level => 2); begin sys.dbms_sql.parse(c => cur, statement => 'alter pluggable database snapshot', language_flag => sys.dbms_sql.native, container => 'PDB2'); sys.dbms_sql.close_cursor(c=>cur); end;
我们可以看到该作业正在使用 DBMS_SQL.PARSE 在 PDB 本地运行快照命令,就像我们可以手动执行的那样。
十、注意事项
使用快照轮播时需要考虑很多事项。
- · 如前所述,此功能目前仅限于工程系统上的企业版,如Exadata,以及Oracle数据库云服务上的企业版或更高版本,如本文所述。
- · PDB归档文件是PDB数据文件的压缩。您必须考虑运行在数据库服务器上的这些归档操作的影响。如果您的服务器已经处于高负载下,那么将这些操作添加到组合中可能不是一个好主意。
- · 归档文件占用磁盘空间。您需要在计算合适的快照设置时考虑到这一点。
- · PDB档案的位置无法控制。如果使用OMF,则将它们放置在DB_CREATE_FILE_DEST参数指定的位置。否则,它们被放置在与PDB数据文件相同的目录中。如果有单独的位置参数就好了。
- · 没有直接的方法来控制何时调度快照。时间表以快照设置的时间为基础。
- · 此功能可以与应用程序容器下的应用程序pdb一起使用。