Oracle数据库中的PDB snapshot 与 snapshot copy PDB

概述

这两个概念容易混淆,简单来说:

  • snapshot copy PDB是12c新增的功能,依赖于底层存储快照
  • PDB snapshot是18c的功能,不必依赖底层存储快照
  • 他们的区别,也可以认为是snapshot和snapshot copy的区别

snapshot copy PDB

按照文档的的说法:

A snapshot copy PDB does not include a complete copy of the source data files. Rather, Oracle Database creates a storage-level snapshot of the underlying file system, and then creates the clone PDB from the snapshot.

也就是说:

  • snapshot copy PDB要求底层文件系统支持快照技术,例如ACFS
  • snapshot copy PDB包含的是稀疏文件,只有修改的数据库才会被存储

示例如下,但由于我底层文件系统不支持存储快照,因此失败:

sql 复制代码
SQL> create pluggable database orclpdb2_snapshot from orclpdb2 snapshot copy;
create pluggable database orclpdb2_snapshot from orclpdb2 snapshot copy
*
ERROR at line 1:
ORA-65169: error encountered while attempting to copy file
/u01/app/oracle/oradata/ORCL2/orclpdb2/users01.dbf
ORA-17525: Database clone using storage snapshot not supported on file
/u01/app/oracle/oradata/ORCL2/orclpdb2/users01.dbf


SQL> !oerr ora 17525
17525, 00000, "Database clone using storage snapshot not supported on file %s"
// *Cause:  Cloning a database using storage level snapshot is not supported
//          on the underlying storage.
// *Action: Use storage product that has snapshot based cloning support
//          for Oracle.

PDB snapshot

PDB snapshot是支持PDB Snapshot Carousel的底层技术。

按照文档的说法:

A PDB snapshot is a point-in-time copy of a PDB. The source PDB can be open read-only or read/write while the snapshot is created. You can create snapshots manually using the SNAPSHOT clause of CREATE PLUGGABLE DATABASE (or ALTER PLUGGABLE DATABASE), or automatically using the EVERY interval clause. If the storage system supports sparse clones, then the preceding command creates a sparse copy. Otherwise, the command creates a full copy.

也就是说,创建PDB snapshot时:

  • 源PDB可以是只读或读写状态,
  • 可以手工或自动创建
  • 生成的PDB可以是完全拷贝或稀疏拷贝,后者需要底层存储系统支持。

PDB snapshot主要有2个作用:

  1. 克隆PDB以用于开发测试
  2. 用于时间点恢复

PDB snapshot是Exadata的特性,如果不是Exadata,则会报错:

sql 复制代码
SQL> ALTER PLUGGABLE DATABASE SNAPSHOT;
ALTER PLUGGABLE DATABASE SNAPSHOT
*
ERROR at line 1:
ORA-12754: Feature PDB SNAPSHOT CAROUSEL is disabled due to missing capability

如果确实不是Exadata,也可以设置隐含参数以模拟Exadata。

sql 复制代码
connect / as sysdba
alter system set "_exadata_feature_on"=true scope=spfile;
shutdown immediate;
startup;

如果SNAPSHOT_MODE不是NONE,则可以手工创建PDB snapshot。

sql 复制代码
SET LINESIZE 150 TAB OFF

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
---------- ---------- --------------- -----------------
         3 ORCLPDB1   MANUAL

手工创建PDB snapshot:

sql 复制代码
SQL> ALTER PLUGGABLE DATABASE SNAPSHOT;

Pluggable database altered.

查询PDB snapshot:

sql 复制代码
SET LINESIZE 150
COL CON_NAME FORMAT a9
COL ID FORMAT 99
COL SNAPSHOT_NAME FORMAT a17
COL SNAP_SCN FORMAT 9999999
COL FULL_SNAPSHOT_PATH FORMAT a61

SELECT CON_ID AS ID, CON_NAME, SNAPSHOT_NAME, 
       SNAPSHOT_SCN AS snap_scn, FULL_SNAPSHOT_PATH 
FROM   DBA_PDB_SNAPSHOTS
ORDER BY SNAP_SCN;

 ID CON_NAME  SNAPSHOT_NAME     SNAP_SCN FULL_SNAPSHOT_PATH
--- --------- ----------------- -------- -------------------------------------------------------------
  3 ORCLPDB2  SNAP_1677908289_1  3229763 /u01/app/oracle/oradata/ORCL2/orclpdb2/snap_1677908289_322976
              154256623                  3.pdb
sql 复制代码
SET LINESIZE 200
SET PAGESIZE 50000

COL ID FORMAT 99
COL CON_NAME FORMAT a10
COL SNAPSHOT_NAME FORMAT a26
COL SNAPSHOT_SCN FORMAT 9999999999
COL FULL_SNAPSHOT_PATH FORMAT a70

SELECT CON_ID AS ID, CON_NAME, SNAPSHOT_NAME, 
       SNAPSHOT_SCN, FULL_SNAPSHOT_PATH 
FROM   DBA_PDB_SNAPSHOTS;

 ID CON_NAME   SNAPSHOT_NAME               SNAPSHOT_SCN FULL_SNAPSHOT_PATH
--- ---------- -------------------------- ------------- ----------------------------------------------------------------------
  3 ORCLPDB2   SNAP_1677908289_1154256623       3229763 /u01/app/oracle/oradata/ORCL2/orclpdb2/snap_1677908289_3229763.pdb

pdb的后缀说明这时一个完全拷贝,而非稀疏拷贝。

下面的输出为0,也可以说明是完全拷贝。因为只有是稀疏拷贝时,DBA_PDB_SNAPSHOTFILE表才有行:

sql 复制代码
SQL> SELECT COUNT(*) FROM DBA_PDB_SNAPSHOTFILE;

  COUNT(*)
----------
         0

删除PDB snapshot:

sql 复制代码
SQL> ALTER PLUGGABLE DATABASE DROP SNAPSHOT SNAP_1677908289_1154256623;

Pluggable database altered.

参考

相关推荐
库库的数据库笔记1 小时前
金融核心交易系统的数据库国产信创改造该如何做?
大数据·数据库·分布式·mysql·oracle·金融·数据库架构
码士集团小青4 小时前
Google 开源了啥,让 AI Agent 碰数据库不再是定时炸弹
数据库·oracle
Zenova EdgeOS7 小时前
工业网关数据全链路加密实战:从传输、静态数据到密钥轮
数据库·oracle·边缘计算·工业网关
betazhou8 小时前
Apache Seatunnel 抽取SQL server实时同步到Oracle(四)
数据库·oracle·apache·sql server·seatunnel
LMT流氓兔1 天前
第四单元——第17课:让回答边生成、边显示
服务器·数据库·人工智能·python·oracle·langchain
kyle~1 天前
DTO --- 数据封装
数据库·oracle·前后端
Lethehong2 天前
Oracle 加个字段,目标库就报错?KFS 用“先拆后组“打通异构 DDL
数据库·oracle
Web极客码2 天前
锁定真正的磁盘卡顿:我用 OpenCode 配合 eBPF 诊断 NVMe 队列深度延迟与 I/O 写放大
数据库·oracle
猫咪很可爱2 天前
Oracle RAC 启动失败排查:私网通信与内核参数优化实战
运维·数据库·oracle
张洛闻Eren2 天前
Ansible【第三课】:管理变量和事实
数据库·oracle