前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >史上最全-oracle12c pdb迁移实践

史上最全-oracle12c pdb迁移实践

作者头像
数据库架构之美
修改2019-12-27 19:55:01
2K0
修改2019-12-27 19:55:01
举报

Oracle在12c版本引入了多租户的概念,在一个cdb的根容器下可以创建多个pdb供不同用户使用,cdb中主要保存数据库元数据,而pdb中保存用户数据,各个pdb直接不相互影响。Oracle提供了多种方式进行pdb数据库的创建/迁移/克隆,甚至实现了不停机的在线克隆。

PDB的创建

Creating a PDB by Relocating It

12.2的online pdb relocate 实现了PDB 在线几乎零停机时间在不同CDB之间的迁移,且在relocate过程中源库一直是open read-write状态,使用了增量日志的方式追加减少了最源库和网络资源的影响。

Creating a PDB by relocating it

实施步骤验证

主机

cdb

pdb

192.168.1.36/192.168.1.37(RAC)

sourcdb

pdb1

目标

192.168.1.225/192.168.1.226(RAC)

destcdb

pdb1

源库:创建复制用户,授权(cdb级别)

SQL>create user C##CLONE_ADMIN identified by oracle container=all;

User created.

SQL> grant connect, sysoper, create pluggable database to C##CLONE_ADMIN container=all;

Grant succeeded.

目标库:修改tnsnames.ora

cdb_remote =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = sourcdb)

)

)

目标库:创建dblink(一定要是cdb级别的)

SQL> create database link link_cdb connect to C##CLONE_ADMIN identified by oracle using 'cdb_remote';

Database link created.

目标库:测试dblink

SQL> select sysdate from dual@link_cdb;

SYSDATE

---------------

30-JUL-18

目标库:创建pdb1

SQL> create pluggable database pdb1 from pdb1@link_cdb relocate ;

Pluggable database created.

目标库:查询pdb1

SQL> show pdbs;

CON_ID CON_NAME OPEN MODE RESTRICTED

---------- ------------------------ ---------- ----------

2 PDB$SEED READ ONLY NO

3 PDB3 READ WRITE NO

4 PDB2 READ WRITE NO

5 PDB1 MOUNTED

目标库:启动pdb1

SQL> alter pluggable database pdb1 open;

Pluggable database altered.

源库:查看pdb1,发现pdb1已经不存在了。

SQL> show pdbs;

CON_ID CON_NAME OPEN MODE RESTRICTED

---------- ----------------------------- ----------

2 PDB$SEED READ ONLY NO

Creating a PDB by relocating it with parallel and concurrency sql

Relocating和copying方式支持并行方式克隆数据库,需加上参数 parallel integer

主机

cdb

pdb

192.168.1.36/192.168.1.37(RAC)

sourcdb

pdb1

目标

192.168.1.225/192.168.1.226(RAC)

destcdb

pdb1

源库:创建复制用户,授权(cdb级别)
SQL>create user C##CLONE_ADMIN identified by oracle container=all;
User created.
SQL> grant connect, sysoper, create pluggable database to C##CLONE_ADMIN container=all;
Grant succeeded.
目标库:修改tnsnames.ora
cdb_remote =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sourcdb)
)
)
目标库:创建dblink(一定要是cdb级别的)
SQL> create database link link_cdb connect to C##CLONE_ADMIN identified by oracle using 'cdb_remote';
Database link created.
目标库:测试dblink
SQL> select sysdate from dual@link_cdb;
SYSDATE
---------------
30-JUL-18
源库:执行循环插入程序(开两个session不间断执行插入,中途选某些时刻commit)
SQL> alter session set container=pdb1;
SQL> Create table test(id number);
Begin
For i in 1 .. 1000000
Loop
Insert into test values(i);
End loop;
End;
/
目标库:创建pdb1(该语句直接成功,不会等待源端并发sql,执行完后目标端mount状态,源端open状态)
SQL> create pluggable database pdb1 from pdb1@link_cdb relocate availability max parallel 4;
Pluggable database created.
源库:查询pdb1状态
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ---------------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB2 READ WRITE NO
4 PDB3 READ WRITE NO
5 PDB1 READ WRITE NO
目标库:查询pdb1状态
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- --------------------------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
目标库:打开数据库(执行这条命令的途中源端sql报错了,并且源端数据库变为了mount状态,再过一段时间目标端数据库open成功)
SQL> alter pluggable database pdb1 open instances=all;
Pluggable database altered.
源端:查看session1和session2中数据插入情况
Session1:(session1在失败之前有5次成功的commit)
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
PL/SQL procedure successfully completed.
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
PL/SQL procedure successfully completed.
SQL> commit
2 ;
Commit complete.
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
PL/SQL procedure successfully completed.
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
PL/SQL procedure successfully completed.
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
PL/SQL procedure successfully completed.
SQL> commit;
Commit complete.
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
Begin
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 810
Session ID: 2087 Serial number: 44031
Session2:(session2在失败之前有3次成功的commit)
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
PL/SQL procedure successfully completed.
SQL> commit;
Commit complete.
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
PL/SQL procedure successfully completed.
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
PL/SQL procedure successfully completed.
SQL> commit;
Commit complete.
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
PL/SQL procedure successfully completed.
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
PL/SQL procedure successfully completed.
SQL> Begin
2 For i in 1 .. 1000000
3 Loop
4 Insert into test values(i);
5 End loop;
6 End;
7 /
Begin
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 22947
Session ID: 1710 Serial number: 30218
目标库:查询test表条数(发现有8000000条数据,也就是在源库变为mount之前已提交的sql同步过来了,未提交的sql没有同步过来)
SQL> select count(*) from test;
COUNT(*)
----------
8000000
源库:在目标库创建语句完成后查看源库状态
源库:查看pdb1,发现pdb1依然存在,可见加了availability max参数时目标端open后源端库也不会自动remove。
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ----------------------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB2 READ WRITE NO
4 PDB3 READ WRITE NO
5 PDB1 MOUNTED
目标库:
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ----------
3 PDB1 READ WRITE NO
Copying
Cloning from the Seed

SQL>col name for a15;

Set linesize 200;

select con_id, dbid, guid, name , open_mode from v$pdbs;

CON_ID DBID GUID NAME OPEN_MODE

------- ---------- ------------------------------- ---------- ----------

2 3862635051 6FBFB6C2522C0FBBE0537A2003BC80B0 PDB$SEED READ ONLY

SQL> create pluggable database pdb1 admin user pdb1admin identified by pdb1admin roles=(connect,select_catalog_role);

Pluggable database created.

SQL>col pdb_name for a15;

select pdb_id,pdb_name,status,creation_time from cdb_pdbs where pdb_name='PDB1';

PDB_ID PDB_NAME STATUS CREATION_

---------- ---------- ---------- ---------

5 PDB1 NEW 29-JUN-18

SQL> select con_id,name,open_mode from v$pdbs where name='PDB1';

CON_ID NAME OPEN_MODE

---------- ---------- ----------

5 PDB1 MOUNTED

SQL> alter pluggable database PDB1 OPEN;

Pluggable database altered.

SQL> conn PDB1ADMIN/pdb1admin@192.168.1.36:1521/pdb1

Connected.

SQL> show user;

USER is "PDB1ADMIN"

SQL> col username for a10

SQL> col granted_role for a10

SQL> select * from user_role_privs

USERNAME GRANTED_RO ADM DEL DEF OS_ COM INH

---------- ---------- --- --- --- --- --- ---

PDB2ADMIN PDB_DBA YES NO YES NO NO NO

SQL> select * from session_privs;

PRIVILEGE

----------------------------------------

SET CONTAINER

CREATE PLUGGABLE DATABASE

CREATE SESSION

SQL> ho lsnrctl status |grep pdb1 -B1

Instance "rac12c1", status READY, has 1 handler(s) for this service...

Service "pdb1" has 1 instance(s).

Cloning a pdb locally

If the CDB is not in ARCHIVELOG mode, then the source PDB must be in open read only

mode. This requirement does not apply if the CDB is in ARCHIVELOG mode.

col PROPERTY_NAME for a20

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

select

con_id,username,default_tablespace,temporary_tablespace

from cdb_users

where lower(username)='c##global_user1' order by con_id;

CON_ID USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE

---------- -------------------- ---------------------------

1 C##GLOBAL_USER1 USERS TEMP

3 C##GLOBAL_USER1 USERS TEMP

SQL> CREATE PLUGGABLE DATABASE pdb2 FROM pdb1

PATH_PREFIX ='+DATADG';

Pluggable database created.

SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;

CON_ID DBID GUID NAME OPEN_MODE

------- ---------- -------------------------------- -------------------

2 3862635051 6FBFB6C2522C0FBBE0537A2003BC80B0 PDB$SEED READ ONLY

3 1192027733 70CFFC1034AE1258E0537A2003BCF86A PDB1 READ WRITE

4 3478260040 70D030CE84E51838E0537A2003BC0B37 PDB2 MOUNTED

SQL> alter pluggable database PDB2 OPEN;

Pluggable database altered.

SQL> alter session set container=PDB2;

Session altered.

SQL> select file_name from dba_data_files;

FILE_NAME

---------------------------------------------------------------------------------------------

+DATADG/RAC12C/70D030CE84E51838E0537A2003BC0B37/DATAFILE/users.413.981330561

+DATADG/RAC12C/70D030CE84E51838E0537A2003BC0B37/DATAFILE/undotbs1.393.981330561

+DATADG/RAC12C/70D030CE84E51838E0537A2003BC0B37/DATAFILE/sysaux.392.981330561

+DATADG/RAC12C/70D030CE84E51838E0537A2003BC0B37/DATAFILE/system.391.981330561

SQL> conn PDB1ADMIN/pdb1admin@192.168.1.36:1521/pdb2

Connected.

SQL> show user;

USER is "PDB1ADMIN"

SQL> col username for a10

SQL> col granted_role for a10

SQL> select * from user_role_privs;

USERNAME GRANTED_RO ADM DEL DEF OS_ COM INH

---------- ---------- --- --- --- --- --- ---

PDB1ADMIN PDB_DBA YES NO YES NO NO NO

SQL> select * from session_privs;

PRIVILEGE

----------------------------------------

SET CONTAINER

CREATE PLUGGABLE DATABASE

CREATE SESSION

Cloning a Remote PDB

主机

cdb

pdb

192.168.1.36/192.168.1.37(RAC)

sourcdb

pdbtest

目标

192.168.1.225/192.168.1.226(RAC)

destcdb

Pdbtest_new

源库:查看状态:
Col name for a20;
Set linesize 200;
select con_id, dbid, guid, name , open_mode from v$pdbs;
CON_ID DBID GUID NAME OPEN_MODE
---------- ---------- -------------------------------- -----------
2 2014944745 70B4B2EE9A133E58E053100300C51687 PDB$SEED READ ONLY
3 2848006685 71199200CB156359E053100300C5E0A3 PDB1 READ WRITE
4 230313777 7118BDDD91712315E053100300C5B974 PDB2 READ WRITE
6 3617836477 71BAA9EBF6BB18E2E053100300C561BE PDBTEST READ WRITE
目标库:配置监听(rac的话两台机器都要配置,不然克隆数据库会报错ora-65169):
pdbtest_remote =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdbtest)
)
)
目标库:测试连接:
sqlplus pdbtestadmin/pdbtestadmin@pdbtest_remote
目标库:创建dblink
SQL> create public database link pdbtest_link connect to pdbtestadmin identified by pdbtestadmin using 'pdbtest_remote';
Database link created.
目标库:测试dblink
SQL> select cdb from v$database@pdbtest_link;
CDB
---------
YES
目标库:远程克隆pdb:
SQL> create pluggable database pdbtest_new from pdbtest@pdbtest_link;
Pluggable database created.
目标库:打开数据库:
SQL> alter pluggable database pdbtest_new open;
Warning: PDB altered with errors.
发现有warning,查看如下视图:
SQL> col name for a15;
Col time for a30;
Col type for a10;
Col type for a10;
col cause for a15;
Col status for a10;
Col message for a70;
Set linesize 200;
Select time,name,cause,type,message,status from pdb_plug_in_violations order by time;

发现是因为源库和目标库的pga_aggregate_target参数和processes参数设置不一致导致的。第三条是因为源pdb没有users表空间造成的,目标库启动后处于限制模式。

有两种方式解决这个问题:

1.在目标端pdb添加users表空间:

SQL> create tablespace users datafile '+DATADG' size 512M;

Tablespace created.

SQL> select file_name,bytes/1024/1024 from dba_data_files;

FILE_NAME BYTES/1024/1024

--------------------------------------------------------- ---------------

+DATADG/DESTCDB/71CA8CBF1BBE3D46E053E18003C58534/DATAFILE/system.296.982405347 1228.80469

+DATADG/DESTCDB/71CA8CBF1BBE3D46E053E18003C58534/DATAFILE/sysaux.297.982405347 1228.80469

+DATADG/DESTCDB/71CA8CBF1BBE3D46E053E18003C58534/DATAFILE/undotbs1.298.982405347 6144

+DATADG/DESTCDB/71CA8CBF1BBE3D46E053E18003C58534/DATAFILE/undo_2.300.982408217 6144

+DATADG/DESTCDB/71CA8CBF1BBE3D46E053E18003C58534/DATAFILE/users.301.982419533 512

然后重启一下pdbtest_new,发现此时pdbtest_new可以正常启动:

SQL> alter pluggable database pdbtest_new close immediate;

Pluggable database altered.

SQL> alter pluggable database pdbtest_new open;

Pluggable database altered.

再查看pdb_plug_in_violations视图发现错误已解决

1.在源数据库pdbtest创建users表空间,然后再进行克隆:

SQL> create tablespace users datafile '+DATADG' size 512M;

Tablespace created.

SQL> select name,con_id from v$tablespace;

NAME CON_ID

------------------------------- ----------

SYSTEM 6

SYSAUX 6

UNDOTBS1 6

TEMP 6

USERS 6

UNDO_2 6

此时源端已经有了users表空间

然后执行克隆命令:

SQL> create pluggable database pdbtest_new from pdbtest@pdbtest_link;

Pluggable database created.

SQL> alter pluggable database pdbtest_new open;

Pluggable database altered.

发现此时正常open,没有报错。

Cloning a Remote PDB (with parallel)

主机

cdb

pdb

192.168.1.36/192.168.1.37(RAC)

sourcdb

pdbtest

目标

192.168.1.225/192.168.1.226(RAC)

destcdb

Pdbtest_new

源库:并行克隆pdb3创建pdbtest
SQL> create pluggable database pdbtest from pdb3 parallel 2;
Pluggable database created.
SQL> alter pluggable database pdbtest open;
Pluggable database altered.
源库:查询pdb
Col name for a20;
Set linesize 200;
select con_id, dbid, guid, name , open_mode from v$pdbs;
CON_ID DBID GUID NAME OPEN_MODE
---------- ---------- -------------------------------- ----------
2 2014944745 70B4B2EE9A133E58E053100300C51687 PDB$SEED READ ONLY
3 2278955566 72346EAC0C5420B1E053100300C5C447 PDB2 READ WRITE
4 1456576834 72346EAC0C5F20B1E053100300C5C447 PDB3 READ WRITE
6 3636583599 72433986472915BDE053100300C56C89 PDBTEST READ WRITE
目标库:配置监听(rac的话两台机器都要配置,不然克隆数据库会报错ora-65169):
pdbtest_remote =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdbtest)
)
)
目标库:测试连接:
sqlplus pdb2admin/pdb2admin@pdbtest_remote
目标库:创建dblink
SQL> create public database link pdbtest_link connect to pdb2admin identified by pdb2admin using 'pdbtest_remote';
Database link created.
目标库:测试dblink
SQL> select cdb from v$database@pdbtest_link;
CDB
---------
YES
目标库:远程并行克隆pdb:
SQL> create pluggable database pdbtest_new from pdbtest@pdbtest_link parallel 4;
Pluggable database created.
目标库:打开数据库:
SQL> alter pluggable database pdbtest_new open instances=all;
Pluggable database altered.
目标端:查看pdb状态
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ---------------------- ----------
2 PDB$SEED READ ONLY NO
3 PDBTEST_NEW READ WRITE NO
Cloning a Remote Non-CDB

主机

cdb

pdb

192.168.1.36/192.168.1.37(RAC)

noncdb(非cdb)

不适用

目标

192.168.1.225/192.168.1.226(RAC)

destcdb

pdbtest

源端:由于没有noncdb,使用dbca创建一个non-cdb类型的数据库noncdb

export ORACLE_SID=noncdb1

SQL> select name,cdb,con_id from v$database;

NAME CDB CON_ID

--------- --- ----------

NONCDB NO 0

目标端:配置监听

noncdb_remote =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = noncdb)

)

)

目标端:测试连接

sqlplus sys/oracle@noncdb_remote as sysdba

目标端:创建dblink

SQL> create public database link noncdb_link connect to linkuser identified by linkuser using 'noncdb_remote';

Database link created.

源端:创建linkuser

SQL> create user linkuser identified by linkuser;

User created.

SQL> grant dba to linkuser;

Grant succeeded.

目标端:测试dblink

SQL> select cdb from v$database@noncdb_link;

CDB

---------

NO

目标端:远程克隆pdb

SQL> create pluggable database noncdb_new from noncdb@noncdb_link;

Pluggable database created.

SQL> show pdbs;

CON_ID CON_NAME OPEN MODE RESTRICTED

---------- ----------------------------- ----------

2 PDB$SEED READ ONLY NO

3 NONCDB_NEW MOUNTED

4 PDB1 READ WRITE NO

5 PDB2 MOUNTED

目标端:执行noncdb_to_pdb.sql(在打开数据库之前一定要切换到该pdb下并执行这个sql,否者启动会报错)

SQL> alter session set container=noncdb_new;

SQL> @$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql

目标端:切换到cdb,然后再启动数据库

SQL> alter session set container=cdb$root;

Session altered.

SQL> alter pluggable database noncdb_new open;

Pluggable database altered.

Plugging in

使用xml文件创建pdb

主机

cdb

pdb

192.168.1.36/192.168.1.37(RAC)

sourcdb

pdb1

目标

192.168.1.225/192.168.1.226(RAC)

destcdb

pdbtest

源库:关闭并拔出数据库

SQL> alter session set container=pdb1;

Session altered.

SQL> alter pluggable database pdb1 close immediate;

Pluggable Database closed.

SQL> conn / as sysdba

Connected.

SQL> alter pluggable database PDB1 unplug into '/tmp/pdb1.xml';

Pluggable database altered.

源库:删除pdb1保留数据文件:

SQL> drop pluggable database PDB1;

Pluggable database dropped.

--拷贝文件(将源库asm磁盘中该guid文件夹下的文件挨个拷贝到本地,再拷贝到远程,再拷贝入远程的asm中)

示例是拷贝到/tmp目录下做中转

Scp到目标库文件系统,然后拷贝到目标库的asm磁盘(不能加上OMF的文件后缀,否则报错)

ASMCMD> pwd

+datadg/sourcdb/722EE1EE9A370DBDE053100300C558EF/datafile

ASMCMD> cp /tmp/722EE1EE9A370DBDE053100300C558EF/datafile/SYSAUX.289.982836275 +datadg/destcdb/722EE1EE9A370DBDE053100300C558EF/datafile/SYSAUX

copying /tmp/722EE1EE9A370DBDE053100300C558EF/datafile/SYSAUX.289.982836275 -> +datadg/destcdb/722EE1EE9A370DBDE053100300C558EF/datafile/SYSAUX

ASMCMD> cp /tmp/722EE1EE9A370DBDE053100300C558EF/datafile/SYSTEM.290.982836275 +datadg/destcdb/722EE1EE9A370DBDE053100300C558EF/datafile/SYSTEM

copying /tmp/722EE1EE9A370DBDE053100300C558EF/datafile/SYSTEM.290.982836275 -> +datadg/destcdb/722EE1EE9A370DBDE053100300C558EF/datafile/SYSTEM

ASMCMD> cp /tmp/722EE1EE9A370DBDE053100300C558EF/datafile/UNDOTBS1.284.982836275 +datadg/destcdb/722EE1EE9A370DBDE053100300C558EF/datafile/UNDOTBS1

copying /tmp/722EE1EE9A370DBDE053100300C558EF/datafile/UNDOTBS1.284.982836275 -> +datadg/destcdb/722EE1EE9A370DBDE053100300C558EF/datafile/UNDOTBS1

ASMCMD> cp /tmp/722EE1EE9A370DBDE053100300C558EF/datafile/USERS.292.982836373 +datadg/destcdb/722EE1EE9A370DBDE053100300C558EF/datafile/USERS

copying /tmp/722EE1EE9A370DBDE053100300C558EF/datafile/USERS.292.982836373 -> +datadg/destcdb/722EE1EE9A370DBDE053100300C558EF/datafile/USERS

目标库:查询pdb

SQL> select con_id,name,open_mode from v$pdbs where name='PDB1';

no rows selected

目标库:创建pdb1

SQL> CREATE PLUGGABLE DATABASE pdb1 USING '/tmp/pdb1.xml'

COPY tempfile reuse

--PATH_PREFIX = '+DATADG'

--FILE_NAME_CONVERT = ('+DATADG/SOURCDB', '+DATADG/DESTCDB');

Pluggable database created.

目标库:查询并开启pdb1

SQL> select con_id,name,open_mode from v$pdbs where name='PDB1';

CON_ID NAME OPEN_MODE

---------- --------------------

5 PDB1 MOUNTED

SQL> alter session set container=PDB1;

Session altered.

SQL> alter pluggable database pdb1 open;

Pluggable database altered.

目标库:查看相关数据文件

SQL> select file_name from dba_data_files;

FILE_NAME

--------------------------------------------------------------------------------

+DATADG/DESTCDB/722EE1EE9A370DBDE053100300C558EF/DATAFILE/system.286.982861811

+DATADG/DESTCDB/722EE1EE9A370DBDE053100300C558EF/DATAFILE/sysaux.302.982861811

+DATADG/DESTCDB/722EE1EE9A370DBDE053100300C558EF/DATAFILE/undotbs1.306.982861811

+DATADG/DESTCDB/722EE1EE9A370DBDE053100300C558EF/DATAFILE/users.284.982861811

SQL> select file_name from dba_temp_files;

FILE_NAME

--------------------------------------------------------------------------------

+DATADG/DESTCDB/722EE1EE9A370DBDE053100300C558EF/TEMPFILE/temp.282.982861839

SQL> conn PDB1ADMIN/pdb1admin@192.168.1.225:1521/pdb1

Connected.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据库架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PDB的创建
    • Creating a PDB by Relocating It
      • 源库:创建复制用户,授权(cdb级别)
        • SQL>create user C##CLONE_ADMIN identified by oracle container=all;
          • User created.
            • SQL> grant connect, sysoper, create pluggable database to C##CLONE_ADMIN container=all;
              • Grant succeeded.
                • 目标库:修改tnsnames.ora
                  • cdb_remote =
                    • (DESCRIPTION =
                      • (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))
                        • (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521))
                          • (CONNECT_DATA =
                            • (SERVER = DEDICATED)
                              • (SERVICE_NAME = sourcdb)
                                • )
                                  • )
                                    • 目标库:创建dblink(一定要是cdb级别的)
                                      • SQL> create database link link_cdb connect to C##CLONE_ADMIN identified by oracle using 'cdb_remote';
                                        • Database link created.
                                          • 目标库:测试dblink
                                            • SQL> select sysdate from dual@link_cdb;
                                              • SYSDATE
                                                • ---------------
                                                  • 30-JUL-18
                                                    • 源库:执行循环插入程序(开两个session不间断执行插入,中途选某些时刻commit)
                                                      • SQL> alter session set container=pdb1;
                                                        • SQL> Create table test(id number);
                                                          • Begin
                                                            • For i in 1 .. 1000000
                                                              • Loop
                                                                • Insert into test values(i);
                                                                  • End loop;
                                                                    • End;
                                                                      • /
                                                                        • 目标库:创建pdb1(该语句直接成功,不会等待源端并发sql,执行完后目标端mount状态,源端open状态)
                                                                          • SQL> create pluggable database pdb1 from pdb1@link_cdb relocate availability max parallel 4;
                                                                            • Pluggable database created.
                                                                              • 源库:查询pdb1状态
                                                                                • SQL> show pdbs;
                                                                                  • CON_ID CON_NAME OPEN MODE RESTRICTED
                                                                                    • ---------- ---------------- ---------- ----------
                                                                                      • 2 PDB$SEED READ ONLY NO
                                                                                        • 3 PDB2 READ WRITE NO
                                                                                          • 4 PDB3 READ WRITE NO
                                                                                            • 5 PDB1 READ WRITE NO
                                                                                              • 目标库:查询pdb1状态
                                                                                                • SQL> show pdbs;
                                                                                                  • CON_ID CON_NAME OPEN MODE RESTRICTED
                                                                                                    • ---------- --------------------------- ----------
                                                                                                      • 2 PDB$SEED READ ONLY NO
                                                                                                        • 3 PDB1 MOUNTED
                                                                                                          • 目标库:打开数据库(执行这条命令的途中源端sql报错了,并且源端数据库变为了mount状态,再过一段时间目标端数据库open成功)
                                                                                                            • SQL> alter pluggable database pdb1 open instances=all;
                                                                                                              • Pluggable database altered.
                                                                                                                • 源端:查看session1和session2中数据插入情况
                                                                                                                  • Session1:(session1在失败之前有5次成功的commit)
                                                                                                                    • SQL> Begin
                                                                                                                      • 2 For i in 1 .. 1000000
                                                                                                                        • 3 Loop
                                                                                                                          • 4 Insert into test values(i);
                                                                                                                            • 5 End loop;
                                                                                                                              • 6 End;
                                                                                                                                • 7 /
                                                                                                                                  • PL/SQL procedure successfully completed.
                                                                                                                                    • SQL> Begin
                                                                                                                                      • 2 For i in 1 .. 1000000
                                                                                                                                        • 3 Loop
                                                                                                                                          • 4 Insert into test values(i);
                                                                                                                                            • 5 End loop;
                                                                                                                                              • 6 End;
                                                                                                                                                • 7 /
                                                                                                                                                  • PL/SQL procedure successfully completed.
                                                                                                                                                    • SQL> commit
                                                                                                                                                      • 2 ;
                                                                                                                                                        • Commit complete.
                                                                                                                                                          • SQL> Begin
                                                                                                                                                            • 2 For i in 1 .. 1000000
                                                                                                                                                              • 3 Loop
                                                                                                                                                                • 4 Insert into test values(i);
                                                                                                                                                                  • 5 End loop;
                                                                                                                                                                    • 6 End;
                                                                                                                                                                      • 7 /
                                                                                                                                                                        • PL/SQL procedure successfully completed.
                                                                                                                                                                          • SQL> Begin
                                                                                                                                                                            • 2 For i in 1 .. 1000000
                                                                                                                                                                              • 3 Loop
                                                                                                                                                                                • 4 Insert into test values(i);
                                                                                                                                                                                  • 5 End loop;
                                                                                                                                                                                    • 6 End;
                                                                                                                                                                                      • 7 /
                                                                                                                                                                                        • PL/SQL procedure successfully completed.
                                                                                                                                                                                          • SQL> Begin
                                                                                                                                                                                            • 2 For i in 1 .. 1000000
                                                                                                                                                                                              • 3 Loop
                                                                                                                                                                                                • 4 Insert into test values(i);
                                                                                                                                                                                                  • 5 End loop;
                                                                                                                                                                                                    • 6 End;
                                                                                                                                                                                                      • 7 /
                                                                                                                                                                                                        • PL/SQL procedure successfully completed.
                                                                                                                                                                                                          • SQL> commit;
                                                                                                                                                                                                            • Commit complete.
                                                                                                                                                                                                              • SQL> Begin
                                                                                                                                                                                                                • 2 For i in 1 .. 1000000
                                                                                                                                                                                                                  • 3 Loop
                                                                                                                                                                                                                    • 4 Insert into test values(i);
                                                                                                                                                                                                                      • 5 End loop;
                                                                                                                                                                                                                        • 6 End;
                                                                                                                                                                                                                          • 7 /
                                                                                                                                                                                                                            • Begin
                                                                                                                                                                                                                              • *
                                                                                                                                                                                                                                • ERROR at line 1:
                                                                                                                                                                                                                                  • ORA-03113: end-of-file on communication channel
                                                                                                                                                                                                                                    • Process ID: 810
                                                                                                                                                                                                                                      • Session ID: 2087 Serial number: 44031
                                                                                                                                                                                                                                        • Session2:(session2在失败之前有3次成功的commit)
                                                                                                                                                                                                                                          • SQL> Begin
                                                                                                                                                                                                                                            • 2 For i in 1 .. 1000000
                                                                                                                                                                                                                                              • 3 Loop
                                                                                                                                                                                                                                                • 4 Insert into test values(i);
                                                                                                                                                                                                                                                  • 5 End loop;
                                                                                                                                                                                                                                                    • 6 End;
                                                                                                                                                                                                                                                      • 7 /
                                                                                                                                                                                                                                                        • PL/SQL procedure successfully completed.
                                                                                                                                                                                                                                                          • SQL> commit;
                                                                                                                                                                                                                                                            • Commit complete.
                                                                                                                                                                                                                                                              • SQL> Begin
                                                                                                                                                                                                                                                                • 2 For i in 1 .. 1000000
                                                                                                                                                                                                                                                                  • 3 Loop
                                                                                                                                                                                                                                                                    • 4 Insert into test values(i);
                                                                                                                                                                                                                                                                      • 5 End loop;
                                                                                                                                                                                                                                                                        • 6 End;
                                                                                                                                                                                                                                                                          • 7 /
                                                                                                                                                                                                                                                                            • PL/SQL procedure successfully completed.
                                                                                                                                                                                                                                                                              • SQL> Begin
                                                                                                                                                                                                                                                                                • 2 For i in 1 .. 1000000
                                                                                                                                                                                                                                                                                  • 3 Loop
                                                                                                                                                                                                                                                                                    • 4 Insert into test values(i);
                                                                                                                                                                                                                                                                                      • 5 End loop;
                                                                                                                                                                                                                                                                                        • 6 End;
                                                                                                                                                                                                                                                                                          • 7 /
                                                                                                                                                                                                                                                                                            • PL/SQL procedure successfully completed.
                                                                                                                                                                                                                                                                                              • SQL> commit;
                                                                                                                                                                                                                                                                                                • Commit complete.
                                                                                                                                                                                                                                                                                                  • SQL> Begin
                                                                                                                                                                                                                                                                                                    • 2 For i in 1 .. 1000000
                                                                                                                                                                                                                                                                                                      • 3 Loop
                                                                                                                                                                                                                                                                                                        • 4 Insert into test values(i);
                                                                                                                                                                                                                                                                                                          • 5 End loop;
                                                                                                                                                                                                                                                                                                            • 6 End;
                                                                                                                                                                                                                                                                                                              • 7 /
                                                                                                                                                                                                                                                                                                                • PL/SQL procedure successfully completed.
                                                                                                                                                                                                                                                                                                                  • SQL> Begin
                                                                                                                                                                                                                                                                                                                    • 2 For i in 1 .. 1000000
                                                                                                                                                                                                                                                                                                                      • 3 Loop
                                                                                                                                                                                                                                                                                                                        • 4 Insert into test values(i);
                                                                                                                                                                                                                                                                                                                          • 5 End loop;
                                                                                                                                                                                                                                                                                                                            • 6 End;
                                                                                                                                                                                                                                                                                                                              • 7 /
                                                                                                                                                                                                                                                                                                                                • PL/SQL procedure successfully completed.
                                                                                                                                                                                                                                                                                                                                  • SQL> Begin
                                                                                                                                                                                                                                                                                                                                    • 2 For i in 1 .. 1000000
                                                                                                                                                                                                                                                                                                                                      • 3 Loop
                                                                                                                                                                                                                                                                                                                                        • 4 Insert into test values(i);
                                                                                                                                                                                                                                                                                                                                          • 5 End loop;
                                                                                                                                                                                                                                                                                                                                            • 6 End;
                                                                                                                                                                                                                                                                                                                                              • 7 /
                                                                                                                                                                                                                                                                                                                                                • Begin
                                                                                                                                                                                                                                                                                                                                                  • *
                                                                                                                                                                                                                                                                                                                                                    • ERROR at line 1:
                                                                                                                                                                                                                                                                                                                                                      • ORA-03113: end-of-file on communication channel
                                                                                                                                                                                                                                                                                                                                                        • Process ID: 22947
                                                                                                                                                                                                                                                                                                                                                          • Session ID: 1710 Serial number: 30218
                                                                                                                                                                                                                                                                                                                                                            • 目标库:查询test表条数(发现有8000000条数据,也就是在源库变为mount之前已提交的sql同步过来了,未提交的sql没有同步过来)
                                                                                                                                                                                                                                                                                                                                                              • SQL> select count(*) from test;
                                                                                                                                                                                                                                                                                                                                                                • COUNT(*)
                                                                                                                                                                                                                                                                                                                                                                  • ----------
                                                                                                                                                                                                                                                                                                                                                                    • 8000000
                                                                                                                                                                                                                                                                                                                                                                      • 源库:在目标库创建语句完成后查看源库状态
                                                                                                                                                                                                                                                                                                                                                                        • 源库:查看pdb1,发现pdb1依然存在,可见加了availability max参数时目标端open后源端库也不会自动remove。
                                                                                                                                                                                                                                                                                                                                                                          • SQL> show pdbs;
                                                                                                                                                                                                                                                                                                                                                                            • CON_ID CON_NAME OPEN MODE RESTRICTED
                                                                                                                                                                                                                                                                                                                                                                              • ---------- ----------------------- ---------- ----------
                                                                                                                                                                                                                                                                                                                                                                                • 2 PDB$SEED READ ONLY NO
                                                                                                                                                                                                                                                                                                                                                                                  • 3 PDB2 READ WRITE NO
                                                                                                                                                                                                                                                                                                                                                                                    • 4 PDB3 READ WRITE NO
                                                                                                                                                                                                                                                                                                                                                                                      • 5 PDB1 MOUNTED
                                                                                                                                                                                                                                                                                                                                                                                        • 目标库:
                                                                                                                                                                                                                                                                                                                                                                                          • SQL> show pdbs;
                                                                                                                                                                                                                                                                                                                                                                                            • CON_ID CON_NAME OPEN MODE RESTRICTED
                                                                                                                                                                                                                                                                                                                                                                                              • ---------- ------------------------------ ----------
                                                                                                                                                                                                                                                                                                                                                                                                • 3 PDB1 READ WRITE NO
                                                                                                                                                                                                                                                                                                                                                                                                  • Copying
                                                                                                                                                                                                                                                                                                                                                                                                    • Plugging in
                                                                                                                                                                                                                                                                                                                                                                                                    相关产品与服务
                                                                                                                                                                                                                                                                                                                                                                                                    数据库
                                                                                                                                                                                                                                                                                                                                                                                                    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                                                                                                                                                                                                                                                                                                                                                                                                    领券
                                                                                                                                                                                                                                                                                                                                                                                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档