随着 12c PDB 的使用日渐成熟, 用户生产中心的 PDB 也越来越多, 且这些 PDB 彼此之间都是相互孤立的, 一方面扩展性受到限制, 另一方面也给管理带来较多的不便.
Oracle 12cR2 和 18c 中对 PDB 的扩展性和管理便利性等方面进行了诸多的增强. 这里介绍通过应用容器的 Container Map 来实现分区表部署在不同的 PDB 中.
首先介绍几个概念
分区映射表: 定义分区键和 PDB 之间的映射关系, 表数据将根据映射关系存放到不同的应用 PDB Container
Map: 数据库属性, 在 Application root 中指定分区映射表
Map Objects: 映射的分区表
接下来, 创建分区映射表, 并且设置数据库的 CONTAINER_MAP 属性
- 创建 map 对象
- CREATE TABLE appadm.conmap (country VARCHAR2(30) NOT NULL)
- PARTITION BY LIST (country) (
- PARTITION app01 VALUES ('US','MEXICO','CANADA','INDIA'),
- PARTITION app02 VALUES ('UK','FRANCE','GERMANY','CHINA','JAPAN')
- );
- 设置 container_map 属性
ALTER PLUGGABLE DATABASE SET CONTAINER_MAP='appadm.conmap';1
分别插入数据到相应的 PDB
- 插入数据
- ALTER SESSION SET CONTAINER=app01;
- INSERT INTO APPADM.cmtb VALUES ('AMER VALUE','US');
- INSERT INTO APPADM.cmtb VALUES ('AMER VALUE','MEXICO');
- INSERT INTO APPADM.cmtb VALUES ('AMER VALUE','CANADA');
- COMMIT;
- ALTER SESSION SET CONTAINER=app02;
- INSERT INTO APPADM.cmtb VALUES ('EURO VALUE','UK');
- INSERT INTO APPADM.cmtb VALUES ('EURO VALUE','FRANCE');
- INSERT INTO APPADM.cmtb VALUES ('EURO VALUE','GERMANY');
- COMMIT;
在应用 root 中查询对象
- select * from APPADM.cmtb where country = 'MEXICO';
- VALUE COUNTRY CON_ID
- ------------------------------ ------------------------------ ----------
- AMER VALUE MEXICO 6
能够正常获取到查询结果, 并且如果是 select * 的话, 还会多出 CON_ID 列, 指出数据来源的 PDB ID.
仅仅实现查询还远远满足不了业务系统的要求, 接下来我们再测试 DML 操作在 CONTAINER_MAP 时的使用情况.
Oracle 提供了几种 DML 操作方法:
使用 containers 子句, 并且在 where 条件中指定操作的 con_id
SQL> update containers(appadm.cmtb) set value='EURO VALUE1' where country='GERMANY' and con_id=7;
1 row updated.
这种方法需要进行大量的应用重构, 而且非常不灵活, 实际生产环境中没有多大的实用价值.
设置默认目标容器, 无需在 where 条件中指定操作的 con_id
- ALTER PLUGGABLE DATABASE CONTAINERS DEFAULT TARGET = (app01);
- SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='CONTAINERS_DEFAULT_TARGET';
- SQL> update containers(appadm.cmtb) set value='EURO VALUE1' where country='GERMANY';
0 rows updated.
- SQL> select * from appadm.cmtb where country='GERMANY';
- VALUE COUNTRY CON_ID
- ------------------------------ ------------------------------ ----------
- EURO VALUE GERMANY 7
现实中同样不太可能将操作限制在某个应用 PDB, 这种方法的价值仍然不大. 而且测试过程中, 这种方法未更新成功.
由此可见, 虽然经过两个版本的更新, CONTAINER_MAP 仍然只是一个原型, 距离实际的生产使用还有很多的路要走.
来源: http://www.linuxidc.com/Linux/2018-08/153476.htm