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,从而更好地管理和利用多租户架构的优势。随着技术的进步,预计未来版本中这项功能将会更加完善,为用户提供更佳的操作体验。

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

相关推荐
松涛和鸣42 分钟前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa1 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k1 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦2 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL2 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·3 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德3 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫3 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i3 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.3 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql