Oracle 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 事务不会受到任何影响

源端:

SQL> show pdbs;

CON_ID CON_NAME                       OPEN MODE  RESTRICTED

     2 PDB$SEED                       READ ONLY  NO
     3 PDB1                           READ WRITE NO
     4 PDB3                           READ WRITE NO
     5 SALESPDB                       MOUNTED

目标端:

SQL> show pdbs;

CON_ID CON_NAME                       OPEN MODE  RESTRICTED

     2 PDB$SEED                       READ ONLY  NO
     3 PDB1                           MOUNTED
     6 SALESPDB                       READ WRITE NO

将PDB3进行relocate至目标端

创建DBLINK用户,并授予CREATE PLUGGABLE DATABASE等权限

在源端根容器下创建公有用户:

SQL> create user c##byh identified by byh;

User created.

SQL> grant CREATE PLUGGABLE DATABASE to c##byh container=all;

SQL> grant create session,connect,resource,sysoper to c##byh container=all;

在目标端创建DBLINK:

SQL>

create database link PDB3

connect to c##byh identified by byh

using ‘orcl2’;

迁移前需要满足的条件:

源CDB必须处于本地undo模式(如果不处于本地undo模式,那么迁移前需要将源端置为read only状态)

SQL>select property_name,property_value from database_properties where property_name = ‘LOCAL_UNDO_ENABLED’;

PROPERTY_NAME PROPERTY_VALUE


LOCAL_UNDO_ENABLED TRUE

源CDB处于归档模式

在源端创建一个测试表:

SQL> create table test (id number);

Table created.

SQL> insert into test values(1);

1 row created.

SQL> commit;

Commit complete.

在源库进行一个循环事务:

SYS@prod>

begin

for i in 1…200000 loop

update test set id = 3;

end loop;

end;

目标端进行relocate:

SQL> CREATE PLUGGABLE DATABASE PDB3 FROM PDB3@PDB3 RELOCATE AVAILABILITY MAX;

ERROR at line 1:
ORA-65016: FILE_NAME_CONVERT must be specified

SQL> CREATE PLUGGABLE DATABASE PDB3 FROM PDB3@PDB3 RELOCATE AVAILABILITY MAX FILE_NAME_CONVERT=(’/oracle/app/oradata/orcl/pdb3’,’/oracle/app/oradata/orcl/pdb3’)

Pluggable database created.

查看源端PDB3状态:

SQL> show pdbs;

CON_ID CON_NAME                       OPEN MODE  RESTRICTED

     2 PDB$SEED                       READ ONLY  NO
     3 PDB1                           READ WRITE NO
     4 PDB3                           READ WRITE NO
     5 SALESPDB                       MOUNTED

查看目标端PDB3状态:

SQL> show pdbs;

CON_ID CON_NAME                       OPEN MODE  RESTRICTED

     2 PDB$SEED                       READ ONLY  NO
     3 PDB1                           MOUNTED
     4 PDB3                           MOUNTED
     6 SALESPDB                       READ WRITE NO

在源端查看:

SQL> select * from test;

    ID

     3

在源端再开启一个大事务:

SQL> create table test2 as select * from dba_objects;

Table created.

SQL> insert into test2 select * from test2;

72703 rows created.

SQL> /

145406 rows created.

SQL> /

290812 rows created.

SQL> commit;

SQL> delete from test2;

SQL> commit;

Commit complete.

SQL> create table test3 as select * from dba_objects;

Table created.

目标端启动:

SQL> alter session set container=pdb3;

Session altered.

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-65106: Pluggable database #4 (PDB3) is in an invalid state.

使用CDB启动:

SQL>alter pluggable database pdb3 open;

在源端查看PDB的状态:

SQL> show pdbs;

CON_ID CON_NAME                       OPEN MODE  RESTRICTED

     2 PDB$SEED                       READ ONLY  NO
     3 PDB1                           MOUNTED
     4 PDB3                           MOUNTED
     5 SALESPDB                       MOUNTED

尝试在源端打开PDB3:

SQL> alter pluggable database pdb3 open;
alter pluggable database pdb3 open
*
ERROR at line 1:
ORA-65086: cannot open/close the pluggable database

目标端 PDB状态:

SQL> show pdbs;

CON_ID CON_NAME                       OPEN MODE  RESTRICTED

     2 PDB$SEED                       READ ONLY  NO
     3 PDB1                           MOUNTED
     4 PDB3                           READ WRITE NO
     6 SALESPDB                       READ WRITE NO

SQL> alter session set container=pdb3;

Session altered.

SQL> select * from test;

    ID

     1

事务已回滚。

SQL> select count() from test2;
select count(
) from test1
*
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> select count(*) from test3;

COUNT(*)

 72704

总结:

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 的零停机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值