陈老师:1415968548 郑老师:2735197625 乐老师:354331153
客服热线:
19941464235/19906632509(微信同号)

客服微信

【Oracle OCP】Oracle 19c之PDB快照

作者:炎燚小寶
发布时间:2023-12-19 09:17
浏览量:504

本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

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一起使用。