关于proxy pdb proxy pdb可以让你访问远端cdb像在本地访问一样,类似一个符号链。
可以通过创建一个本地代理pdb来引用一个不同cdb里的pdb,这个被引用的pdb则称为引用pdb。如果要访问引用pdb的数据,那么可以直接访问本地代理pdb即可,简化了一些书写。当不同cdb里的应用容器有相同的应用程序时,可以通过代理pdb来同步应用容器的根节点。
创建代理pdb时都需要创建数据链,都是在本地代理pdb所属的CDB中创建数据链,指向远端的CDB或者引用pdb。
同样也可以在应用容器中创建代理pdb,这样引用pdb则必须是应用根节点或者应用pdb。数据链则要在应用根节点中创建,指向远端的应用根节点或者应用pdb。
代理pdb中的DML和DDL语句都会传输到引用pdb中,结果都会返回代理pdb
当前库是代理pdb时,执行ALTER PLUGGABLE DATABASE和ALTER DATABASE语句都只影响本身,不会传输到引用pdb
当前库是代理pdb所在的cdb时,执行ALTER PLUGGABLE DATABASE语句都只影响本身,不会传输到引用pdb
创建proxy pdb 1 2 3 create pluggable database pdb3_proxy as proxy from pdb3@to_remote; alter pluggable database pdb3_proxy open;
通过查看proxy pdb的信息,会发现cdb显示的是远端cdb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 sys@ORA12C> alter session set container=PDB3_PROXY ; Session altered. sys@ORA12C> select name from v$database; select name from v$database * ERROR at line 1: ORA-01017: invalid username/password; logon denied ORA-02063: preceding line from PROXYPDB$DBLINK sys@ORA12C> conn sys@ora12c as sysdba Enter password: Connected. sys@ORA12C> alter session set container=PDB3_PROXY ; Session altered. sys@ORA12C> select name from v$database; NAME --------- CDB1
查看代理pdb的相关信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 sys@ORA12C> select con_id,name,open_mode,proxy_pdb from v$pdbs; CON_ID NAME OPEN_MODE PRO ---------- ------------------------------ ---------- --- 2 PDB$SEED READ ONLY NO 3 PDB12C READ WRITE NO 4 PDB4 READ WRITE NO 5 APP_ROOT READ WRITE NO 6 APP1 READ WRITE NO 7 APP_ROOT$SEED READ ONLY NO 8 APP2 READ WRITE NO 9 F3483665686_3_1 READ WRITE NO 10 F3483665686_3_2 READ WRITE NO 11 F3483665686_3_3 READ WRITE NO 12 PDB3_PROXY READ WRITE YES sys@ORA12C> select pdb_name,status,IS_PROXY_PDB from cdb_pdbs; PDB_NAME STATUS IS_ ------------------------------ ---------- --- PDB$SEED NORMAL NO PDB12C NORMAL NO PDB4 NORMAL NO APP_ROOT NORMAL NO APP1 NORMAL NO APP_ROOT$SEED NORMAL NO APP2 NORMAL NO F3483665686_3_1 NORMAL NO F3483665686_3_2 NORMAL NO F3483665686_3_3 NORMAL NO PDB3_PROXY NORMAL YES
也可以通过V$PROXY_PDB_TARGETS视图来查看代理pdb指向的哪个引用pdb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 set linesize 300 col target_host format a20 col target_service format a40 col target_user format a20 select con_id, target_port, target_host, target_service, target_user from v$proxy_pdb_targets; CON_ID TARGET_PORT TARGET_HOST TARGET_SERVICE TARGET_USER ---------- ----------- -------------------- ---------------------------------------- -------------------- 12 1521 stbyum 8c1e38d38cd88f9ee0536992a8c0e93b 根据target_service的名称,可以去远端确定是哪个pdb sys@CDB1> select name,open_mode from v$pdbs where guid=upper('8c1e38d38cd88f9ee0536992a8c0e93b'); NAME OPEN_MODE ---------- ---------- PDB3 READ WRITE
proxy pdb数据传输 验证在代理pdb上创建数据,看是否会影响引用pdb
1 2 3 4 5 6 7 8 9 10 11 12 13 conn sys/oracle@pdb3_proxy as sysdba create table t1 (id number); insert into t1 values(1); commit; # 查看引用pdb conn sys/oracle@pdb3 as sysdba sys@PDB3> select * from t1; ID ---------- 1
看如果反过来的情况怎么样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sys@PDB3> insert into t1 values(2); 1 row created. sys@PDB3> commit; Commit complete. # 查看proxy pdb sys@PDB3_PROXY> select * from t1; ID ---------- 1 2
可以看到无论是在哪边进行ddl、dml的操作,得到的结果都是一样。
那试一下ALTER PLUGGABLE DATABASE的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 关闭proxy pdb sys@PDB3_PROXY> alter pluggable database close immediate; Pluggable database altered. sys@ORA12C> select open_mode from v$pdbs where name='PDB3_PROXY'; OPEN_MODE ---------- MOUNTED # 而引用pdb状态仍然是读写 sys@PDB3> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDB3 READ WRITE NO
这样就验证了之前的结论。
代理pdb并不是将全部的数据文件同步到本地,而只有一些系统表空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 在代理pdb端新建表空间 sys@PDB3_PROXY> create tablespace tbs1 datafile size 10m; Tablespace created. sys@ORA12C> select file#,name from v$datafile where con_id=12; FILE# NAME ---------- ------------------------------------------------------------------------------------------------------------------------ 128 /u01/app/oracle/oradata/ORA12C/8C1E5E9B7B4A86A6E0536892A8C0D8F8/datafile/o1_mf_system_gk34lm03_.dbf 129 /u01/app/oracle/oradata/ORA12C/8C1E5E9B7B4A86A6E0536892A8C0D8F8/datafile/o1_mf_sysaux_gk34lm14_.dbf 130 /u01/app/oracle/oradata/ORA12C/8C1E5E9B7B4A86A6E0536892A8C0D8F8/datafile/o1_mf_undotbs1_gk34lm15_.dbf # 引用pdb端 sys@CDB1> select file#,name from v$datafile where con_id=3; FILE# NAME ---------- ------------------------------------------------------------------------------------------------------------------------ 17 /u01/app/oracle/oradata/CDB1/8C1E38D38CD88F9EE0536992A8C0E93B/datafile/o1_mf_system_gk33yoco_.dbf 18 /u01/app/oracle/oradata/CDB1/8C1E38D38CD88F9EE0536992A8C0E93B/datafile/o1_mf_sysaux_gk33yodn_.dbf 19 /u01/app/oracle/oradata/CDB1/8C1E38D38CD88F9EE0536992A8C0E93B/datafile/o1_mf_undotbs1_gk33yodn_.dbf 20 /u01/app/oracle/oradata/CDB1/8C1E38D38CD88F9EE0536992A8C0E93B/datafile/o1_mf_tbs1_gk3x1g2l_.dbf
说明除了其他表空间外,其他的数据文件都是存放在引用pdb端的,代理pdb都是通过引用pdb端来访问。
当proxy pdb创建完毕,数据链就可以删除了
1 2 drop public database link to_remote; drop user c#xb cascade ;
proxy pdb和监听 这时代理pdb是直接与引用pdb进行通信,代理pdb通常是采用默认值。
监听端口:1521
如果引用pdb不是使用的默认端口,那么必须通过PORT
选项来指定,可以在创建的时候指定,也可以创建完毕以后修改代理pdb属性
监听主机名称: 包含引用pdb的CDB所在的主机名称
如果不是默认值,则需要通过HOST
选项来指定,可以在创建的时候指定,也可以创建完毕以后修改代理pdb属性
1 2 3 4 5 6 7 8 9 create pluggable database pdb3_proxy as proxy from pdb3@to_remote PORT=1522 HOST='testyum'; -- 修改远端host alter pluggable database containers host='stbyum'; alter pluggable database containers host rest; -- 修改远端端口 alter pluggable database containers port='1522'; alter pluggable database containers port rest;