暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

非容器数据库(non-CDB)迁移为可插拔数据库(PDB)步骤

原创 潇湘秦 2025-08-27
376

非容器数据库(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 权限)

BEGIN
  DBMS_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 不受补丁限制。
最后修改时间:2025-08-28 10:06:00
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论