参考:
- Oracle 12C 新特性之 PDB热克隆: https://blog.csdn.net/zhang123456456/article/details/72377623
- Oracle 19C热克隆应用避坑指南:https://cloud.tencent.com/developer/news/661665
一、简介与要求
1.1. 简介
12cR1版本中克隆一份PDB源库需要打开在read only只读模式 , 在12cR2版本中引入了local undo mode, 源PDB在 read/write 读写模式也可以克隆。local undo mode 也是oracle推崇的模式。
local undo mode 的好处:
- 1、 减少undo表空间的争用,同时方便拔插.
- 2、 只有使用local undo才支持下面的新特性: Refresh PDB, Flashback PDB ,(Hot Clone, Relocate PDB in open read/write mode).
- 3、 point-in-time recovery PDB(根据时间点来恢复PDB).
1.2. 要求
- 1、 Archive Log Enabled(归档模式)
- 2、 Local Undo Enabled(本地undo模式)
- 3、 destination CDB must have a public database link to the source CDB,have sufficient privileges to use the database link.
二、克隆本地PDB
数据库环境:Oracle 18c
2.1. 修改数据库为归档模式
--在SQLPlus下执行如下命令
--在数据库启动状态下修改参数:log_archive_dest_1
ALTER SYSTEM SET log_archive_dest_1='LOCATION=/dbBak1/OracleBak103/archivelog/';
shu immediate;
startup mount;
alter database archivelog;
alter database open;
archive log list;
show parameter log_archive_format;
show parameter log_archive_max_processes;
alter system switch logfile;
2.2. 检查是否开户 local undo
--在SQLPlus下执行如下命令
SET LINES 300 PAGES 999
COL PROPERTY_NAME FOR a25;
COL PROPERTY_VALUE FOR a25;
SELECT PROPERTY_NAME,PROPERTY_VALUE
FROM database_properties
WHERE property_name = 'LOCAL_UNDO_ENABLED';
2.3. 查看PDB数据库
--在SQLPlus下执行如下命令
SHOW PDBS;
2.4. 设置 pdb_file_name_convert
--在SQLPlus下执行如下命令
alter session set pdb_file_name_convert='ETDB2','ETDB1130';
--注意这里 pdb_file_name_convert 参数生效级别设置的是 session
--如果克隆多个PDB可以设置为:'ETDB2','ETDB0930,ETDB1130';
2.5. 克隆数据库(一)
create pluggable database ETDB1130 from ETDB2;
--直接使用该命令报错了。ORA-65005: 文件缺少文件名模式或其文件名模式无效。
2.6. 克隆数据库(二)
alter session set container=etdb2;
show con_name;
select file_name from dba_data_files;
select file_name from dba_temp_files;
alter session set container=cdb$root;
create pluggable database ETDB1130 from ETDB2 file_name_convert=('/u01/app/oracle/oradata/YKT/etdb2/','/home/oracle/oradata/YKT/etdb1130/');
alter pluggable database etdb1130 open;
alter pluggable database etdb1130 save state;