oracle19c克隆PDB

一.本地克隆

本地克隆非常简单,一条命令:

 

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的名字

 

三.拆分PDB

有的时候可以克隆的时候并不想克隆所有的表空间,那么还可以指定表空间进行克隆.使用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
 

 

 

 

 

 

 

 

 

你可能感兴趣的:(oracle,19c,克隆,pdb)