Proxy PDB

关于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;

Proxy PDB
https://www.xbdba.com/2019/06/25/proxy-pdb/
作者
xbdba
发布于
2019年6月25日
许可协议