Oracle 18c 新特性:動態 Container Map 增強 Application Container 靈活性

蓋國強,雲和恩墨創始人,Oracle ACE總監,中國地區首位Oracle ACE和ACE總監,曾獲評"中國首屆傑出數據庫工程師"獎,擁有近 20 年的數據庫實施和顧問諮詢經驗,對於數據庫性能優化及內部技術具有深入理解。著有《深入解析Oracle》、《循序漸進Oracle》等技術書籍。蓋老師帶來的主題是“穩築基石,雲帆萬里-數據技術的發展和平臺創新”。

主題背景:在數據庫領域,隨着開源技術的快速發展,市場正在分化,一方面是以Oracle、MySQL爲龍頭的數據生態,一方面隨着MongoDB、ElasticSearch的成功IPO,以及 PostgreSQL、Redis 的奮發向上,百花齊放的時代已經來到,而這些變革的驅動力則是雲浪潮。在這個主題中,將和大家分享我們對於行業的分析和展望,並對雲時代企業級數據應用面對的挑戰提出解決方案,同時分享雲和恩墨在這一領域的探索和成功案例。

在 Oracle 18c 中,Container Map 的特性再次獲得增強,實現了 動態 Container Map 的功能,允許在線動態更改容器映射。

(關注本公衆號: Oranews 回覆 2018OOW 可以在 “CDB Fleet” 目錄找到這個 118 頁的 PPT)

爲了理解這個增強,我們需要回顧一下 Oracle 12.2 增加的 Container Map 的新特性,當然我相信我們還必須瞭解 Oracle Application Container 的概念。

簡單來說,在有了多租戶的體系結構之後,很多 PDB 都可能共用同一套應用架構和元數據,所以 Oracle 在數據庫中引入了應用容器的概念,在應用容器中,首先存在一個 Application Root,可以在其中創建應用 SEED 數據庫,種子數據庫定義數據結構元數據等信息,然後其他和應用相關的數據庫可以由此克隆而來,加快部署,想一想這樣的例子,如果在雲上爲100家客戶部署收費系統,通過這樣的Clone就很便捷。

多租戶加上應用容器(Application Container),整個數據庫架構如下圖所示:

在 Oracle 12.2 中增加的 Container Map 新特性,可以看做一個基於多租戶 PDB 的 Sharding 架構,其基本原理是,如果我們在應用容器中構建一個分區表,其分區可以映射到不同的PDB 中,而在整個應用容器中,數據結構邏輯上是一個整體,各 PDB 僅能操作自己分區的數據,而應用在全局則可以看到所有的數據。

以下是一個示例,如果在容器級別建立應用元數據的地域分區,然後可以在創建數據表時引用啓用,分區和 PDB 的名稱相對應啓用,則隨後映射由此建立。

在應用容器全局查詢,可以透明的訪問數據,而針對特定分區的數據訪問會被自動路由到特定的 PDB 執行:

來看一下測試過程。

首先創建一個應用容器,這個 PDB 的名稱是:enmotech

SQL> create pluggable database enmotech as application container admin user enmoadm identified by EnmoAdm; Pluggable database created.

接下來創建兩個區域數據庫,分別是 BEIJING 和 CHENGDU:

SQL> alter session set container=enmotech; SQL> create pluggable database BEIJING admin user yhapadm identified by yhapadm; Pluggable database created. SQL> create pluggable database CHENGDU admin user yhapadm identified by yhapadm; Pluggable database created. SQL> alter pluggable database all open; Pluggable database altered.

接下來查看一下這幾個數據庫的角色,在 Application Root之下,是兩個 Application PDB:

SQL> alter session set container=enmotech;

現在對應用容器進行初始化,在其中部署初始的元數據,創建 containermap ,然後創建數據表並對數據表啓用 container_map ,最後完成這個應用元數據庫的部署:

SQL> alter pluggable database application EMAPP begin install '1.0'; Pluggable database altered. SQL> create user eygle identified by eygle; User created. SQL> grant connect,resource,dba to eygle; Grant succeeded. SQL> create table eygle.containermap (CITY varchar2(20) not null) 2 partition by list (city) ( 3 partition beijing values('BEIJING'), 4 partition chengdu values('CHENGDU')); Table created. SQL> alter pluggable database set container_map='EYGLE.CONTAINERMAP'; Pluggable database altered. SQL> create table eygle.emp sharing=metadata ( empno number, ename varchar2(20), city varchar2(20)); Table created. SQL> alter table eygle.emp enable container_map; Table altered. SQL> alter table eygle.emp enable containers_default; Table altered. SQL> alter pluggable database application EMAPP end install '1.0'; Pluggable database altered.

在應用PDB中,需要先刷新同步元數據,否則對象信息並不可見:

SQL> alter session set container=BEIJING; Session altered. SQL> alter pluggable database application EMAPP sync; Pluggable database altered. SQL> desc eygle.emp Name Null? Type ----------------------------------------- -------- ---------------------------- EMPNO NUMBER ENAME VARCHAR2(20) CITY VARCHAR2(20)

在容器數據庫中分別插入數據,注意,在 BEIJING 的數據庫中只能插入相關分區的數據,如果試圖插入不存在的分區或其他MAP區域數據,會顯示出錯:

SQL> insert into eygle.emp values(1,'EYGLE','BEIJING'); 1 row created. SQL> insert into eygle.emp values(2,'KAMUS','BEIJING'); 1 row created. SQL> insert into eygle.emp values(3,'YANGTINGKUN','SHANGHAI'); insert into eygle.emp values(3,'YANGTINGKUN','SHANGHAI') * ERROR at line 1: ORA-65391: violation of container map partitions

注意我接下來切換到另外一個 PDB ,結果發現前面未提交的數據會對後續的操作形成阻塞,事實上這說明 alter session set container 這個 DDL 沒有隱式提交之前的事務,必須切換回到原PDB下提交事務:

SQL> alter session set container=CHENGDU; Session altered. SQL> desc eygle.emp; ERROR: ORA-04043: object eygle.emp does not exist SQL> alter pluggable database application EMAPP sync; alter pluggable database application EMAPP sync * ERROR at line 1: ORA-65023: active transaction exists in container BEIJING SQL> commit; commit * ERROR at line 1: ORA-65023: active transaction exists in container BEIJING SQL> alter session set container=BEIJING; Session altered. SQL> commit; Commit complete. SQL> alter session set container=CHENGDU; Session altered. SQL> alter pluggable database application EMAPP sync; Pluggable database altered. SQL> insert into eygle.emp values(3,'LAOXIONG','CHENGDU'); 1 row created. SQL> insert into eygle.emp values(4,'600','BEIJING'); insert into eygle.emp values(4,'600','BEIJING') * ERROR at line 1: ORA-65391: violation of container map partitions SQL> commit; Commit complete.

此時可以觀察效果,在不同PDB只能查詢和操作各自PDB的信息,而在Application Root 則可以查詢全部數據:

SQL> alter session set container=CHENGDU;

SQL> select * from eygle.emp; EMPNO ENAME CITY ---------- -------------------- -------------------- 3 LAOXIONG CHENGDU SQL> alter session set container=BEIJING; Session altered. SQL> select * from eygle.emp; EMPNO ENAME CITY ---------- -------------------- -------------------- 1 EYGLE BEIJING 2 KAMUS BEIJING SQL> alter session set container=ENMOTECH; Session altered. SQL> select * from eygle.emp; EMPNO ENAME CITY CON_ID ---------- -------------------- -------------------- ---------- 1 EYGLE BEIJING 5 2 KAMUS BEIJING 5 3 LAOXIONG CHENGDU 9

在 18c 增加的動態容器映射特性,允許我們增加、分拆分區數據,進一步的增強了靈活性。

這就是關於 Dynamic Container Map 的增強。如果有哪位在生產環境使用了 Application Container 特性,請在留言中告訴我們。謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章