relocate pdb

Relocating a PDB 是 Oracle 在 12C 中推出的一种新的数据迁移方式,在采用 Relocate 时可以使用最短的停机时间在不同的 CDB 之间直接迁移 PDB 。

Oracle 12.1 中 Relocate 迁移数据时,需要源库处于 read only 状态,但由于 12.2 中 local undo 的推出,可以实现完全在线迁移,源库的 PDB 在 read-write 模式下就可以 Relocate 到远端 CDB 中, 源 PDB 中的 DML 事务不会受到任何影响 ,整个迁移过程中不需要导出导入元数据,其迁移方式比 XTTS 更加简单快捷。

在目标 PDB 执行“ create pluggable database xxx relocate ”完成后,源 CDB 和目标 CDB 会同时存在 2 个 Relocate PDB ,此时目标 CDB 中该 PDB 处于 MOUNT 状态,而源库的 PDB 仍然处于 READ WRITE 状态。当在目标 CDB 中的 PDB 执行 OPEN 时,源 PDB 会停止且 Oracle 会自动 KILL 掉源 PDB 连接的所有会话,并同步且应用源 PDB 的日志到目标 PDB ,同时也会回滚未提交的事务,应用完成后 源 PDB 库的所有数据文件将会自动删除,源库会被删除 ,目标 PDB 可以对外提供服务。

如果在 Relocate 过程中使用 AVAILABILITY 模式进行 Relocate ,新的连接请求 Oracle 会将其发送新 PDB 上,则完全实现 PDB 迁移的零停机

其实 Relocate 的机制就是 Hot Clone+DBlink 的增量恢复。

PDB relocate 的基本实现方式 hot clone 和通过 dblink 的增量 redo apply 。在线 Pdb Relocate 需要在目标 CDB 中创建一个 database link 指向源库的 CDB ,需要 DBLINK 使用的 common 用户有 create pluggable database 的权限, relocate 的 AVAILABILITY (高用选项)有 normal|max|high ,当目标库使用 create pluggable database relocate 选项时,源库会一直在 read-write open 状态,甚至到 create pdb 的命令完成,源 PDB ( READ-WRITE OPEN )上的用户 DML 事务都不会有任何影响。当目标库的 CREATE PDB RELOCATE 完成时,会在源 CDB 和目标 CDB 存在 2 个 relocate 的 PDB ,只不过在目标 CDB 中该 PDB 是 mount 状态,此时源库的 DML 为生成更多的 redo 日志为后期的 PDB 切换, PDB 的切换操作是在目标 CDB 中的 PDB open read-write 时,此时源 PDB 会暂停,并且 KILL 掉源 PDB 库连接的会话,同步并应用源库 PDB 的 redo 到目标 PDB ,并且应用 undo 数据回滚未提交的事务,当应用完成后源 pdb 库的所有数据文件将会自动删除,目标 PDB 事务继续,在这短暂的操作期间如果使用 AVAILABILITY 如果有新的连接请求, Oracle 可以跳过连接到新 PDB 上,实现了移动 PDB 的零停机。

有一些基本的条件如源库和目标库是 archivelog mode, 并且 local undo ,和相同的字节码( endianness ),相同的 options 和字符集或者目标库是源库的子集,如目标库是字符集是 AL32UTF8 ,源库可以是任何字符集,当然这也是 12.2 的另一新特性 ( 同一 CDB 中,不同的 PDB 可以使用不同的字符集,但是其限制是 CDB 必须是 AL32UTF8) 。

源库CDB需要处于本地UNDO模式

col property_name for a30
col property_value for a20
select property_name,property_value from database_properties where property_name='LOCAL_UNDO_ENABLED';

--检查结果
PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ --------------------
LOCAL_UNDO_ENABLED             TRUE

--可以切换到PDB下查看undo表空间是否存在
select name from v$datafile where name like '%undo%';

源库CDB需要保存PDB的状态

--这步操作保证PDB relocate操作完成后自动启动目标库服务
ALTER PLUGGABLE DATABASE ALL SAVE STATE INSTANCES=ALL;

源库CDB必须为归档模式

archive log list;

源库CDB和目标库CDB需要有相同的字节序

--源库、目标库检查,注意:当CDB的字符集是UTF8时,PDB可以是任意的字符集
set lines 120
col platform_name for a20
select db.name,db.platform_id,db.platform_name,os.endian_format from v$database db,v$transportable_platform os where db.platform_id=os.platform_id

--检查结果
NAME      PLATFORM_ID PLATFORM_NAME        ENDIAN_FORMAT
--------- ----------- -------------------- --------------
ORCL               13 Linux x86 64-bit     Little

如果目标CDB是非归档模式,则目标PDB只能是只读模式;如果目标PDB是归档模式,则没有此限制,源库CDB上安装的组件需要和目标CDB相同,或者是其子集

col COMP_NAME for a35
set lines 140
select comp_name, version, status from dba_registry;

三、操作步骤

1.源库创建管理用户

实际测试可以使用SYSTEM用户,官方文档及参考书目中是新创建用户。

--common user默认前缀c##,show parameter common_user_prefix可查看
create user c##test identified by oracle;

--官方文档明确需要sysoper与create pluggable database权限
grant sysoper,create session,resource,create any table,unlimited tablespace,create pluggable database to c##test;

2.创建目标端到源端的DBLINK

create public database link qy connect to c##test identified by oracle using '192.168.10.11:1521/服务名';

--注意:如果配置tns方式创建dblink,rac环境记得两个节点都要修改tnsnames.ora
--测试dblink,有时候tnsping能通,但是测试dblink不成功可以检查下global_names参数是否为false
select * from dual@qy;

3.目标库执行创建pdb命令

--执行下述命令的用户需要具有create pluggable database权限
create pluggable database test01 from test01@qy relocate availability normal;

--如果没有启动OMF,则需要增加FILE_NAME_CONVERT子句

4.检查状态

SELECT a.name,a.open_mode,b.status FROM v$pdbs a,DBA_PDBS b WHERE a.name=b.pdb_name and a.name = 'TEST01';

NAME          OPEN_MODE   STATUS     
------------- ----------- -----------
TEST01        MOUNTED     RELOCATING 

5.测试同步

此时可以在源库创建表或修改数据,用于目标库OPEN后验证数据是否同步

6.打开目标库PDB完成relocate

到此步,如果顺利open,则relocate完成,正常来说源库的pdb会同步删除,但是在我测试的过程中,是有没有删除的情况。

alter pluggable database TEST01 open instances=all;

四、总结

  1. 建议查看源库及目标库alert日志,能更好理解迁移的过程;
  2. 这种方式目标库open后,源端会自动删除pdb,考虑到风险及借鉴某大行的迁移经验,还是放弃了采用这种方式,转为测试使用refresh pdb方式做迁移;
  3. 另外relocate还能通过dbca静默方式执行,可以参考官方文档的说明

转自《https://www.modb.pro/db/145103》

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章