Oracle 19c多租户 : PDB重定位

Oracle 12.2 引入了多租户架构下可插拔数据库(Pluggable Database, PDB)的重定位功能,使得可以在几乎零停机的情况下将PDB从一个根容器(Root Container)移动到另一个。这一特性在后续版本如Oracle 19c中得到了保留,并且随着技术的发展,该过程变得更加优化和稳定。

一、前提条件

在进行PDB relocate之前,请确保满足以下前提条件:

  • 本地CDB:指的是目标或接收CDB,将容纳被重定位的PDB。
  • 远程CDB:指的是源CDB,其中包含要被重定位的PDB。

具体要求如下:

  • 本地数据库中的用户必须在根容器中拥有CREATE PLUGGABLE DATABASE权限。
  • 远程CDB必须使用本地撤消模式(local undo mode)。如果未使用,则需要打开远程PDB。
  • 远程和本地数据库应处于归档日志模式(archivelog mode)。
  • 本地数据库必须有一个公共数据库链接到远程CDB,使用一个通用用户。
  • 远程数据库中连接数据库链接的通用用户必须拥有CREATE PLUGGABLE DATABASE和SYSDBA或SYSOPER权限。
  • 本地和远程数据库必须具有相同的字节序(endianness),版本相同,并且远程数据库的COMPATIBLE参数不能高于本地数据库。
  • 本地和远程数据库必须安装相同的选项,或者远程数据库必须是本地数据库所安装选项的一个子集。
  • 如果本地CDB的字符集为AL32UTF8,则远程数据库可以是任何字符集;如果本地CDB不使用AL32UTF8,则远程和本地数据库的字符集必须匹配。
  • 如果远程数据库使用透明数据加密(TDE),则本地CDB必须在尝试重定位之前正确配置。否则,新PDB将只能以受限模式打开。
  • Bug 19174942 关于新PDB仅能以受限模式打开的问题已在12.2版本中修复,但在实际操作前仍建议再次确认最新文档说明。
  • 远程PDB中每个通用用户的默认表空间必须存在于本地CDB中。如果不这样做,新的PDB将只能以受限模式打开

二、准备远(源)端CDB

1. 创建用户:为了建立数据库链接,需要在远程CDB中创建一个通用用户(common user),并赋予其CREATE SESSION, SYSOPER以及CREATE PLUGGABLE DATABASE权限。

cpp 复制代码
CREATE USER c##remote_clone_user IDENTIFIED BY remote_clone_user CONTAINER=ALL;
GRANT CREATE SESSION, SYSOPER, CREATE PLUGGABLE DATABASE TO c##remote_clone_user CONTAINER=ALL;

**2. 检查模式:**确保远程CDB处于本地撤消(local undo)模式和归档日志(archivelog)模式下。如果未开启,则需进行相应设置。

cpp 复制代码
SELECT property_name, property_value FROM database_properties WHERE property_name = 'LOCAL_UNDO_ENABLED';
SELECT log_mode FROM v$database;

由于远程CDB处于local undo模式和archivelog模式下,我们不需要将远程数据库置为只读模式。

三、准备本地CDB

**1. 配置tnsnames.ora:**在本地服务器上编辑tnsnames.ora文件,添加指向远程CDB的服务名条目。例如:

cpp 复制代码
CDB3 =
(DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = my-server.my-domain)(PORT = 1521))
  (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = cdb3)
  )
)

**2. 创建数据库链接:**使用上述配置,在本地CDB中创建一个公共数据库链接至远程CDB。

cpp 复制代码
CREATE PUBLIC DATABASE LINK clone_link
CONNECT TO c##remote_clone_user IDENTIFIED BY remote_clone_user USING 'cdb3';

**3. 验证环境:**确认本地CDB同样处于local undo模式与archivelog模式下。

cpp 复制代码
SELECT property_name, property_value FROM database_properties WHERE property_name = 'LOCAL_UNDO_ENABLED';
SELECT log_mode FROM v$database;

**4. 创建必要的表空间:**对于远程PDB中的每个通用用户,默认表空间应在本地CDB中存在;若不存在,则需预先创建。如果不这样做,新的PDB将只能以受限模式打开(Bug 19174942)。

四、重定位PDB

**1. 测试数据库链接:**确保创建的数据库链接能够正常工作。

cpp 复制代码
DESC user_tables@clone_link

2. 执行relocate命令

通过SQL*Plus或类似工具连接到本地CDB,使用CREATE PLUGGABLE DATABASE ... FROM ... RELOCATE语法发起PDB relocate操作。

cpp 复制代码
CREATE PLUGGABLE DATABASE pdb5 FROM pdb5@clone_link RELOCATE;

如果没有使用OMF,示例如下:

cpp 复制代码
 CREATE PLUGGABLE DATABASE pdb12 FROM pdb12@clone_link RELOCATE FILE_NAME_CONVERT=('/opt/oracle/oradata/ORCLCDB/pdb12/','/u01/app/oracle/oradata/ORCLCDB/pdb12/');

/opt/oracle/oradata/ORCLCDB/pdb12/是远端的pdb目录
/u01/app/oracle/oradata/ORCLCDB/pdb12/是本地的pdb目录

**3. 检查新PDB状态:**创建完成后,检查新PDB的状态。

cpp 复制代码
COLUMN name FORMAT A30
SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5';

**4. 打开新PDB:**将新PDB从MOUNTED状态更改为READ WRITE状态。

cpp 复制代码
ALTER PLUGGABLE DATABASE pdb5 OPEN;
SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5';

**5. 管理连接:**根据实际情况调整网络连接参数以保证迁移过程中数据传输的效率和稳定性。如果两个CDB使用不同的监听器,可以指定RELOCATE AVAILABILITY MAX来指导初始监听器转发连接到新的监听器,或者使用LOCAL_LISTENER和REMOTE_LISTENER参数配置跨注册。

**6. 清理资源:**完成PDB relocate后,记得删除不再需要的数据库链接及其他临时资源。

cpp 复制代码
DROP PUBLIC DATABASE LINK clone_link;

**7. 检查常见用户和临时表空间:**如同任何PDB克隆一样,检查常见用户和临时表空间是否按预期配置。

**8. 验证远程实例:**切换回远程实例,验证原PDB已经被删除。

cpp 复制代码
export ORAENV_ASK=NO
export ORACLE_SID=cdb3
. oraenv
export ORAENV_ASK=YES
sqlplus / as sysdba <<EOF
SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5';
EOF

五、结论

通过遵循上述指导,您可以安全高效地在Oracle 19c环境中实施PDB relocate,从而更好地管理和利用多租户架构的优势。随着技术的进步,预计未来版本中这项功能将会更加完善,为用户提供更佳的操作体验。

请注意,示例代码中的敏感信息如用户名、密码应当替换为您的实际环境对应的信息,并遵守安全策略。此外,所有更改之前都应备份相关配置,以免发生意外。

相关推荐
-SGlow-6 小时前
MySQL相关概念和易错知识点(2)(表结构的操作、数据类型、约束)
linux·运维·服务器·数据库·mysql
明月5667 小时前
Oracle 误删数据恢复
数据库·oracle
♡喜欢做梦8 小时前
【MySQL】深入浅出事务:保证数据一致性的核心武器
数据库·mysql
遇见你的雩风8 小时前
MySQL的认识与基本操作
数据库·mysql
dblens 数据库管理和开发工具8 小时前
MySQL新增字段DDL:锁表全解析、避坑指南与实战案例
数据库·mysql·dblens·dblens mysql·数据库连接管理
weixin_419658318 小时前
MySQL的基础操作
数据库·mysql
不辉放弃9 小时前
ZooKeeper 是什么?
数据库·大数据开发
Goona_10 小时前
拒绝SQL恐惧:用Python+pyqt打造任意Excel数据库查询系统
数据库·python·sql·excel·pyqt
程序员编程指南10 小时前
Qt 数据库连接池实现与管理
c语言·数据库·c++·qt·oracle
幼儿园老大*12 小时前
数据中心-时序数据库InfluxDB
数据库·时序数据库