Oracle 18c 新特性:動態 Container Map 增強 Application Container 靈活性
資料技術嘉年華等你來
活動預告:11.16-17日,北京市東三環中路61號富力萬麗酒店,相聚資料技術嘉年華,(99元票務)免費購票倒計時,點選檢視大會詳情。
蓋老師帶來主題“穩築基石,雲帆萬里-資料技術的發展和平臺創新”,敬請期待~
點選“閱讀原文”或者掃描下圖二維碼註冊購票,即將售罄,趕快參與鴨!
蓋國強,雲和恩墨創始人,Oracle ACE總監,中國地區首位Oracle ACE和ACE總監,曾獲評"中國首屆傑出資料庫工程師"獎,擁有近 20 年的資料庫實施和顧問諮詢經驗,對於資料庫效能優化及內部技術具有深入理解。著有《深入解析Oracle》、《循序漸進Oracle》等技術書籍。蓋老師帶來的主題是“穩築基石,雲帆萬里-資料技術的發展和平臺創新
主題背景:在資料庫領域,隨著開源技術的快速發展,市場正在分化,一方面是以Oracle、MySQL為龍頭的資料生態,一方面隨著MongoDB、ElasticSearch的成功IPO,以及 PostgreSQL、Redis 的奮發向上,百花齊放的時代已經來到,而這些變革的驅動力則是雲浪潮。在這個主題中,將和大家分享我們對於行業的分析和展望,並對雲時代企業級資料應用面對的挑戰提出解決方案,同時分享雲和恩墨在這一領域的探索和成功案例。
在 Oracle 18c 中,Container Map 的特性再次獲得增強,實現了 動態 Container Map 的功能,允許線上動態更改容器對映。
(關注本公眾號:
為了理解這個增強,我們需要回顧一下 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 ENAMECITY
---------- -------------------- --------------------
3 LAOXIONGCHENGDU
SQL> alter session set container=BEIJING;
Session altered.
SQL> select * from eygle.emp;
EMPNO ENAMECITY
---------- -------------------- --------------------
1 EYGLEBEIJING
2 KAMUSBEIJING
SQL> alter session set container=ENMOTECH;
Session altered.
SQL> select * from eygle.emp;
EMPNO ENAMECITY CON_ID
---------- -------------------- -------------------- ----------
1 EYGLEBEIJING 5
2 KAMUSBEIJING 5
3 LAOXIONGCHENGDU 9
在 18c 增加的動態容器對映特性,允許我們增加、分拆分割槽資料,進一步的增強了靈活性。
這就是關於 Dynamic Container Map 的增強。如果有哪位在生產環境使用了 Application Container 特性,請在留言中告訴我們。謝謝。
近期文章