暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

Oracle PDB迁移必知:RELOCATE AVAILABILITY MAX与NORMAL的隐藏差异大揭秘!

原创 szrsu 2025-10-04
290

在Oracle多租户环境中,PDB(Pluggable Database)的迁移是常见的运维操作。今天我们将通过一个实际案例,深入探讨RELOCATE AVAILABILITY MAXRELOCATE AVAILABILITY NORMAL两种迁移方式的区别。

环境准备

源库环境

-- 查看PDB状态 SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PROD READ WRITE NO -- 字符集检查 SQL> select userenv('language') from dual; USERENV('LANGUAGE') ---------------------------------------------------- AMERICAN_AMERICA.AL32UTF8 -- 数据文件位置 SQL> col file_name for a60 SQL> select con_id,file_name from cdb_data_files order by 1; CON_ID FILE_NAME ---------- ------------------------------------------------------------ 1 /oradata/CDB/system01.dbf 1 /oradata/CDB/sysaux01.dbf 1 /oradata/CDB/undotbs01.dbf 1 /oradata/CDB/users01.dbf 3 /oradata/CDB/prod/system01.dbf 3 /oradata/CDB/prod/users01.dbf 3 /oradata/CDB/prod/undotbs01.dbf 3 /oradata/CDB/prod/sysaux01.dbf

创建迁移用户

-- 创建专用用户进行PDB迁移 SQL> create user c##pdbadm identified by oracle; User created. SQL> grant SYSOPER,CREATE PLUGGABLE DATABASE,connect TO c##pdbadm container=all; Grant succeeded.

测试数据准备

SQL> alter session set container=prod; Session altered. SQL> create table test(id int,name varchar2(30)); Table created. SQL> insert into test values(1,'aaa'); 1 row created. SQL> commit; Commit complete.

目标库环境

-- 目标库PDB状态 SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO -- 字符集一致性检查 SQL> select userenv('language') from dual; USERENV('LANGUAGE') ---------------------------------------------------- AMERICAN_AMERICA.AL32UTF8 -- 目标库数据文件 SQL> col file_name for a60 SQL> select con_id,file_name from cdb_data_files order by 1; CON_ID FILE_NAME ---------- ------------------------------------------------------------ 1 /oradata/CDB19C/users01.dbf 1 /oradata/CDB19C/sysaux01.dbf 1 /oradata/CDB19C/system01.dbf 1 /oradata/CDB19C/undotbs01.dbf 3 /oradata/CDB19C/pdb1/system01.dbf 3 /oradata/CDB19C/pdb1/undotbs01.dbf 3 /oradata/CDB19C/pdb1/sysaux01.dbf

网络配置

配置tnsnames.ora:

CDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.150)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = CDB)
    )
  )

创建数据库链接:

SQL> CREATE PUBLIC DATABASE LINK mydblink CONNECT TO c##pdbadm IDENTIFIED BY oracle USING 'CDB'; Database link created. SQL> select * from dual@mydblink; D - X

关键差异:AVAILABILITY MAX vs NORMAL

场景一:AVAILABILITY MAX的限制

-- 尝试使用不同PDB名称进行迁移(失败) SQL> CREATE PLUGGABLE DATABASE pdb2 FROM prod@mydblink RELOCATE AVAILABILITY MAX file_name_convert=('/oradata/CDB/prod/','/oradata/CDB19C/pdb2'); ERROR at line 1: ORA-65348: unable to create pluggable database -- 使用相同PDB名称进行迁移(成功) SQL> CREATE PLUGGABLE DATABASE prod FROM prod@mydblink RELOCATE AVAILABILITY MAX file_name_convert=('/oradata/CDB/prod/','/oradata/CDB19C/prod/');

关键发现AVAILABILITY MAX要求目标端PDB名称必须与源端保持一致。

场景二:AVAILABILITY NORMAL的灵活性

-- 使用不同PDB名称进行迁移(成功) SQL> CREATE PLUGGABLE DATABASE pdb2 FROM prod@mydblink RELOCATE AVAILABILITY NORMAL file_name_convert=('/oradata/CDB/prod/','/oradata/CDB19C/pdb2'); Pluggable database created. -- 验证迁移状态 SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO 4 PDB2 MOUNTED SQL> col pdb_name for a20; SQL> select pdb_id, pdb_name, status, refresh_mode,refresh_interval from cdb_pdbs; PDB_ID PDB_NAME STATUS REFRES REFRESH_INTERVAL ---------- -------------------- ---------- ------ ---------------- 3 PDB1 NORMAL NONE 2 PDB$SEED NORMAL NONE 4 PDB2 RELOCATING NONE

关键发现AVAILABILITY NORMAL允许目标端使用不同的PDB名称。

数据一致性验证

迁移过程中新增数据

-- 源端继续操作 SQL> alter session set container=prod; Session altered. SQL> insert into test values(2,'bbb'); 1 row created. SQL> commit; Commit complete.

目标端完成迁移

-- 打开迁移后的PDB SQL> alter pluggable database pdb2 open; Pluggable database altered. -- 检查最终状态 SQL> select pdb_id, pdb_name, status, refresh_mode,refresh_interval from cdb_pdbs; PDB_ID PDB_NAME STATUS REFRES REFRESH_INTERVAL ---------- -------------------- ---------- ------ ---------------- 3 PDB1 NORMAL NONE 2 PDB$SEED NORMAL NONE 4 PDB2 NORMAL NONE -- 验证数据完整性 SQL> alter session set container=pdb2; Session altered. SQL> select * from test; ID NAME ---------- ------------------------------ 1 aaa 2 bbb

源库状态确认

SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO

总结与建议

通过本次实战,我们明确了两种迁移选项的核心区别:

  1. RELOCATE AVAILABILITY MAX

    • 要求目标端PDB名称必须与源端保持一致
    • 适用于需要严格保持命名一致的场景
  2. RELOCATE AVAILABILITY NORMAL

    • 允许目标端使用不同的PDB名称
    • 提供更大的灵活性,适用于需要重命名的迁移场景

最佳实践建议

  • 在规划迁移时,提前确定PDB命名策略
  • 如果不需要重命名,推荐使用AVAILABILITY MAX以确保一致性
  • 如果需要重命名,选择AVAILABILITY NORMAL并确保文件路径正确映射

两种方式都能保证数据的完整性和一致性,选择取决于具体的业务需求和命名规范要求。

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

评论