Oracle PDB Snapshot Carousel(快照轮播)

Oracle PDB Snapshot Carousel(快照轮播)

适用版本:Oracle Database 12.2 / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

PDB Snapshot Carousel 是 12.2 引入的特性[1],自动为 PDB 创建多个快照,支持快速回滚到历史版本:

核心特性

  • 自动定时创建快照
  • 最多保留 8 个快照(默认)
  • 支持快照克隆
  • 支持快照恢复

2.1 设置快照数量

-- 设置最多保留 8 个快照
ALTER SYSTEM SET max_pdb_snapshots=8 SCOPE=BOTH;

-- 关闭快照
ALTER SYSTEM SET max_pdb_snapshots=0 SCOPE=BOTH;

2.2 PDB 级别设置

-- 切换到 PDB
ALTER SESSION SET CONTAINER = hrpdb;

-- 设置 PDB 级别
ALTER SYSTEM SET max_pdb_snapshots=8 SCOPE=BOTH;

3. 手动创建快照

3.1 创建快照

-- 在 CDB$ROOT 或 PDB 中
ALTER SESSION SET CONTAINER = hrpdb;

-- 创建快照
ALTER PLUGGABLE DATABASE SNAPSHOT;

-- 命名快照
ALTER PLUGGABLE DATABASE SNAPSHOT snap_20260721;

-- 每隔 N 分钟自动快照
ALTER PLUGGABLE DATABASE SNAPSHOT MODE EVERY 60 MINUTES;

3.2 停止自动快照

ALTER PLUGGABLE DATABASE SNAPSHOT MODE NONE;

4. 查看快照

4.1 PDB 快照列表

SELECT 
  con_id,
  snapshot_name,
  snapshot_scn,
  snapshot_time,
  full_snapshot_path
FROM dba_pdb_snapshots
ORDER BY snapshot_time DESC;

4.2 当前模式

SELECT 
  con_id,
  snapshot_mode,
  snapshot_interval
FROM v$pdbs;

5. 从快照克隆 PDB

5.1 创建克隆 PDB

-- 从快照创建 PDB
CREATE PLUGGABLE DATABASE hrpdb_test 
  FROM hrpdb 
  SNAPSHOT snap_20260721;

-- 打开
ALTER PLUGGABLE DATABASE hrpdb_test OPEN;

5.2 用途

  • 测试环境快速搭建
  • 数据回溯分析
  • Bug 复现

6. 从快照恢复 PDB

6.1 完全恢复

-- 关闭 PDB
ALTER PLUGGABLE DATABASE hrpdb CLOSE;

-- 从快照恢复
ALTER PLUGGABLE DATABASE hrpdb 
  SNAPSHOT RECOVER snap_20260721;

-- 打开
ALTER PLUGGABLE DATABASE hrpdb OPEN;

6.2 注意事项

  • 仅支持 19c+
  • 快照之后的数据丢失
  • 需关闭 PDB

7. 删除快照

7.1 删除指定快照

ALTER PLUGGABLE DATABASE hrpdb 
  SNAPSHOT DELETE snap_20260721;

7.2 删除所有快照

-- 关闭快照功能
ALTER PLUGGABLE DATABASE hrpdb SNAPSHOT MODE NONE;

-- 设置保留数为 0
ALTER SYSTEM SET max_pdb_snapshots=0 SCOPE=BOTH;

8. 存储管理

8.1 快照存储位置

-- 默认位置
-- $ORACLE_BASE/oradata/<db_unique_name>/<pdb_name>/snapshot/

-- 自定义位置
ALTER SYSTEM SET pdb_snapshot_dir='/u01/snapshots' SCOPE=BOTH;

8.2 快照大小

-- 查看快照文件
SELECT 
  snapshot_name,
  full_snapshot_path,
  bytes/1024/1024 AS size_mb
FROM dba_pdb_snapshots;

9.1 轮转机制

创建顺序:snap1 → snap2 → snap3 → ... → snap8 → snap9

保留 8 个:
snap1 snap2 snap3 snap4 snap5 snap6 snap7 snap8

创建 snap9 时:
snap2 snap3 snap4 snap5 snap6 snap7 snap8 snap9
(删除 snap1)

9.2 增量存储

  • 第一个快照:完整 PDB 副本
  • 后续快照:增量(仅变化块)

10. 监控快照

10.1 快照统计

SELECT 
  con_id,
  count(*) AS snapshot_count,
  max(snapshot_time) AS last_snapshot
FROM dba_pdb_snapshots
GROUP BY con_id;

10.2 空间使用

SELECT 
  p.name,
  sum(d.bytes)/1024/1024/1024 AS size_gb
FROM v$datafile d, v$pdbs p
WHERE d.con_id = p.con_id
  AND d.name LIKE '%snapshot%'
GROUP BY p.name;

11. 常见坑与排错

11.1 ORA-65114: 超过最大快照数

现象:无法创建新快照。

修复

-- 1. 增加 max_pdb_snapshots
ALTER SYSTEM SET max_pdb_snapshots=16 SCOPE=BOTH;

-- 2. 或删除旧快照
ALTER PLUGGABLE DATABASE hrpdb SNAPSHOT DELETE snap_old;

11.2 快照创建失败

现象:ORA-65115。

修复

-- 1. 检查存储空间
! df -h

-- 2. 检查 PDB 状态
SELECT name, open_mode FROM v$pdbs WHERE name='HRPDB';

-- 3. PDB 必须处于 READ WRITE

11.3 快照恢复失败

现象:ORA-65160。

修复

-- 1. 检查 PDB 是否关闭
SELECT name, open_mode FROM v$pdbs WHERE name='HRPDB';
-- 必须 MOUNT

-- 2. 检查快照是否存在
SELECT snapshot_name FROM dba_pdb_snapshots;

11.4 快照路径错误

现象:找不到快照文件。

修复

-- 1. 检查路径
SELECT full_snapshot_path FROM dba_pdb_snapshots;

-- 2. 检查文件
! ls -l /u01/oradata/orcl/hrpdb/snapshot/

12. 最佳实践

  1. 关键业务启用快照:快速回滚
  2. 合理设置间隔:60-240 分钟
  3. 监控快照空间:dba_pdb_snapshots
  4. 快照数 8 个:平衡空间与历史
  5. 测试环境用快照克隆:快速搭建
  6. 快照恢复谨慎:数据会丢失
  7. 生产用 19c+:特性完善
  8. 快照存储独立磁盘:避免争用
  9. 定期审查快照:清理无用
  10. 快照替代部分备份:快速恢复

13. 参考资料

[1] Oracle Multitenant Administrator’s Guide 19c, “PDB Snapshot Carousel” https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/pdb-snapshot-carousel.html