非容器数据库(non-CDB)迁移为可插拔数据库(PDB)步骤
非容器数据库(non-CDB)迁移为可插拔数据库(PDB)步骤
1. 源库 noncdb1 预处理
(1) 检查兼容性(在 noncdb1 执行)
SELECT name, value FROM v$parameter
WHERE name IN ('compatible', 'enable_pluggable_database');
- 确保 compatible 参数版本与目标 CDB 兼容。
- 确认 enable_pluggable_database 为 TRUE。
(2) 验证字符集(必须与目标 CDB 一致)
SELECT * FROM v$database_parameters
WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
- 确保字符集与目标 CDB 一致,否则需调整。
(3) 开启归档模式(如果未启用)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
- 验证归档模式是否成功启用:
SELECT log_mode FROM v$database;
- 应显示 ARCHIVELOG。
2. 生成 PDB 元数据
(1) 生成 XML 描述文件(需要 SYSDBA 权限)
BEGINDBMS_PDB.DESCRIBE(pdb_descr_file => '/tmp/noncdb1.xml');
END;
/
- 该文件将描述 noncdb1 的元数据。
(2) 关闭数据库
这里可以在关库的状态下dump,也可以在read only模式下,不过总体来说这里还是有限制的
目的是为了保持数据的一致性。
SHUTDOWN IMMEDIATE;
3. 数据传输准备
(1) 获取数据文件和日志文件列表(在 noncdb1 执行)
SELECT name FROM v$datafile;
SELECT member FROM v$logfile;
- 记录所有数据文件和重做日志文件路径。
(2) 打包关键文件
包括生成的pdb xml文件还有所有的数据文件和redolog文件
tar czvf noncdb1_files.tar.gz \/tmp/noncdb1.xml \/oradata/noncdb1/oradata/*.dbf \/oradata/noncdb1/redolog/*.log
- 根据实际情况调整文件路径。
(3) 传输到目标 CDB 主机
scp noncdb1_files.tar.gz oracle@<cdb_host>:/oracle/pdb_transfer/
- 将打包文件传输到目标 CDB 主机(<cdb_host> 替换为实际目标主机地址)。
4. 目标 CDB 操作(pdb1)
(1) 将文件放置到与源库相同的路径
- 解压文件到目标路径:
tar xzvf /oracle/pdb_transfer/noncdb1_files.tar.gz -C /oradata/
- 确保数据文件和日志文件路径与源库一致,例如 /oradata/noncdb1/oradata/*.dbf。
- 关键点:需要在目标库创建和源库一样的文件路径,并将数据库文件和redo log恢复到和源库一致的路径
- 如果不一致 就会报错,这点非常关键。
(2) 创建 PDB(SYSDBA 执行)
CREATE PLUGGABLE DATABASE pdb1
USING '/oracle/pdb_transfer/noncdb1.xml'
FILE_NAME_CONVERT=('/oradata/noncdb1/','/oradata/pdb1/'
);
- 将源库文件路径 /oradata/noncdb1/ 转换为目标路径 /oradata/pdb1/。
(3) 检查状态
SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB1';
- 确保状态为 MOUNTED。
(4) 同步 PDB(关键步骤)
这是将non-cdb转化为cdb的关键步骤
ALTER PLUGGABLE DATABASE pdb1 OPEN UPGRADE;
ALTER SESSION SET CONTAINER = pdb1;
@?/rdbms/admin/noncdb_to_pdb.sql
- 执行 noncdb_to_pdb.sql 脚本以完成非 CDB 到 PDB 的转换。
(5) 重新编译无效对象
ALTER SESSION SET CONTAINER = pdb1;
@?/rdbms/admin/utlrp.sql
(6) 打开 PDB 为读写模式
ALTER PLUGGABLE DATABASE pdb1 OPEN READ WRITE;
5. 迁移后验证
(1) 检查 PDB 运行状态
SELECT name, open_mode FROM v$pdbs;
- 确保 PDB1 状态为 READ WRITE。
(2) 验证数据完整性
ALTER SESSION SET CONTAINER = pdb1;
SELECT COUNT(*) FROM dba_tables;
- 确认表数量与源库一致。
(3) 测试用户连接
CREATE USER testuser IDENTIFIED BY Password;
GRANT CREATE SESSION TO testuser;
- 验证新用户是否能正常连接。
(4) 更新补丁(如果有)
- 如果你打了补丁 这一步必须做,不然你的pdb的状态会是受限的,记得执行这一步时确保pdb是open状态
- 如果目标 CDB 有补丁未应用,执行:
$ORACLE_HOME/OPatch/datapatch -verbose
- 确保 PDB 不受补丁限制。