本地克隆非常简单,一条命令:
SQL> create pluggable database testmove4 from testmove2 file_name_convert=('testmove','testmove4');
Pluggable database created.
其中file_name_convert指定了文件目录的转换,其实oracle只是简单的对目录名进行了替换.
使用远程克隆的先决条件是:oracle版本是12.2以上,开启归档模式以及本地undo.在克隆的时候原库可以为读写.
1.兼容性检查
建议在克隆PDB之前进行PDB的兼容性检查.
兼容性检查方法:
1)源端生成pdb的xml文件
begin
dbms_pdb.describe(
pdb_descr_file=>'/home/oracle/brent.xml',
pdb_name=>'BRENT');
end;
/
2)在目标端进行检查
set serveroutput on
declare
compatible constant varchar2(3):=
case DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file=>'/home/oracle/brent.xml',
pdb_name=>'TEST')
WHEN TRUE THEN 'YES'
ELSE 'NO'
end;
begin dbms_output.put_line(compatible);
end;
/
3)查看校验结果
如果为NO,则需要查看PDB_PLUG_IN_VIOLATIONS详细内容.如果为YES,该视图也可能会包含一些内容,因此都需要查看该视图了解内容
2.远程克隆步骤
1)在源端创建公共用户
2)在目标端创建连接到源端的dblink
3)在目标端使用create pluggable database ... from 的命令远程创建PDB
3.远程克隆注意点
下面说说这几步每一步注意点:
1)在源端创建的公共用户需要一些特殊的权限.上面我报错其实就是我们创建的公共用户权限不足导致的.我测试过system用户或者普通公共用户只给DBA权限是不够的,就会上面的错.
真实需要的权限如下:
create user c##suq identified by suq container=all;
grant CREATE PLUGGABLE DATABASE to c##suq container=all;
grant create session,connect,resource,cdb_dba,sysoper to c##suq container=all;
2)创建的dblink可以连接到源端的CDB,也可以连接到源端PDB,例如:
SQL> create database link ora19c2 connect to c##suq identified by suq using 'ora19c2';
Database link created.
上面的ora19c2连接的是源端的CDB
3)使用的语法例如:
SQL> create pluggable database testpdb from testpdb1@ora19c2 file_name_convert=('testpdb1','testpdb');
Pluggable database created.
其中:
testpdb为目标端创建的pdb的名字
testpdb1为源端的pdb的名字,即你想克隆的pdb名字
ora19c2为刚刚创建的dblink的名字
有的时候可以克隆的时候并不想克隆所有的表空间,那么还可以指定表空间进行克隆.使用user_tablespaces语句,这样oracle只会克隆你指定的表空间和必须的系统表空间,而会忽略其它的表空间.
这在某些场合非常有用,例如通过到如一个非CDB创建的数据库,而且此库中存在多个应用的数据,而我们只需要某些数据的时候.
SQL> create pluggable database testpdb from testpdb1@ora19c2 user_tablespaces=('TEST1') file_name_convert=('testpdb1','testpdb');
Pluggable database created.
注意这里需要检查表空间是否 自包含,否则就算你迁移过去了,有可能你的数据也是有问题的.
例如我们创建一张表,其数据存放在test1表空间中,其索引数据存放在test2表空间中,如果我们使用了上面的只克隆test1表空间,那么克隆过去之后,操作表就会出现报错:
SQL> create table suq.t1(id int) tablespace test1;
Table created.
SQL> create index suq.idx_t1 on suq.t1(id) tablespace test2;
Index created.
克隆之后,打开PDB正常,但是在操作表的时候出现报错:
SQL> insert into suq.t1 values(11);
insert into suq.t1 values(11)
*
ERROR at line 1:
ORA-00376: file 78 cannot be read at this time
ORA-01110: data file 78: 'No file with this number, file does not exist'
像我上面的这种情况,你需要删除索引或者将索引重建到存在的表空间中.
SQL> drop index suq.idx_t1;
Index dropped.
SQL>
SQL> insert into suq.t1 values(11);
1 row created.
SQL> commit;
Commit complete.
无数据克隆是特殊的克隆,他不包含用户数据,可以快速创建一个只包含元数据的副本.使用no data语句指定即可.
SQL> create pluggable database testpdb from testpdb1@ora19c2 file_name_convert=('testpdb1','testpdb') no data;
Pluggable database created.
SQL> alter pluggable database testpdb open;
Pluggable database altered.
SQL> alter session set container=testpdb;
Session altered.
SQL>
SQL> select * from suq.t1;
no rows selected
当我们在进行克隆的时候,源库是可读写状态,当克隆完成之后,会将复制期间产生的增量进行恢复.
对此进行扩展,我们可以对克隆的数据库进行反复恢复.这被称之为刷新复制.
刷新复制以下注意点:
1)源库必须开启归档日志和pdb本地undo
2)可以手动刷新(manual)或者自动定时刷新,但是刷新的时候,目标端库必须是close状态.
3)在不刷新期间,目标端可以以只读模式打开
4)如果想以读写模式打开目标端,则必须将refresh mode设置为none,设置为none之后就无法再回退回其它刷新模式
5)18c开始可以对PDB进行switch over,类似于dg的switch over
6)刷新复制必须使用dblink,dblink可以指向同一个CDB,也可以指向不同的CDB
1.下面是创建手动刷新,添加关键字refresh mode manual
SQL> create pluggable database testpdb from testpdb1@ora19c2 user_tablespaces=('TEST1') file_name_convert=('testpdb1','testpdb') refresh mode manual;
Pluggable database created.
只读模式打开:
SQL> alter pluggable database testpdb open read only;
Pluggable database altered.
SQL> alter session set container=testpdb;
Session altered.
SQL> select * from suq.t1;
ID
----------
10
必须关闭才能刷新:
SQL> alter pluggable database testpdb refresh;
alter pluggable database testpdb refresh
*
ERROR at line 1:
ORA-65025: Pluggable database TESTPDB is not closed on all instances.
手工刷新:
SQL> alter pluggable database testpdb close immediate;
Pluggable database altered.
SQL> alter pluggable database testpdb refresh;
Pluggable database altered.
再次打开pdb检查数据:
SQL> alter pluggable database open read only;
Pluggable database altered.
SQL> select * from suq.t1;
ID
----------
10
20
检查PDB的属性,可以通过CDB_PDBS看到pdb是可刷新,刷新模式为手动:
SQL> select pdb_name,status,REFRESH_MODE,REFRESH_INTERVAL from cdb_pdbs;
PDB_NAME STATUS REFRES REFRESH_INTERVAL
------------------------------ ---------- ------ ----------------
TESTPDB REFRESHING MANUAL
2.修改手工刷新为自动刷新,
语法为:指定Refresh MODE EVERY number_of_minutes MINUTES子句,创建以周期性刷新的PDB
SQL> alter pluggable database testpdb refresh mode every 3 minutes;
Pluggable database altered.
以读写模式打开,如果想以读写模式打开,则必须将刷新模式切换位None
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 BRENT READ WRITE NO
4 TESTMOVE4 MOUNTED
5 TEST1 MOUNTED
6 TESTMOVE2 MOUNTED
7 TESTMOVE3 MOUNTED
8 TESTPDB MOUNTED
SQL> alter pluggable database testpdb open;
alter pluggable database testpdb open
*
ERROR at line 1:
ORA-65341: cannot open pluggable database in read/write mode
SQL> alter pluggable database testpdb refresh mode none;
Pluggable database altered.
SQL> alter pluggable database testpdb open;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 BRENT READ WRITE NO
4 TESTMOVE4 MOUNTED
5 TEST1 MOUNTED
6 TESTMOVE2 MOUNTED
7 TESTMOVE3 MOUNTED
8 TESTPDB READ WRITE NO