1. 程式人生 > >Oracle 18c 新特性:動態 Container Map 增強 Application Container 靈活性

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

資料技術嘉年華等你來

活動預告:11.16-17日,北京市東三環中路61號富力萬麗酒店,相聚資料技術嘉年華,(99元票務)免費購票倒計時,點選檢視大會詳情。

蓋老師帶來主題“穩築基石,雲帆萬里-資料技術的發展和平臺創新”,敬請期待~

點選“閱讀原文”或者掃描下圖二維碼註冊購票,即將售罄,趕快參與鴨!

640?wx_fmt=jpeg

蓋國強,雲和恩墨創始人,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),整個資料庫架構如下圖所示:

640?wx_fmt=png

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

640?wx_fmt=png

以下是一個示例,如果在容器級別建立應用元資料的地域分割槽,然後可以在建立資料表時引用啟用,分割槽和 PDB 的名稱相對應啟用,則隨後對映由此建立。

640?wx_fmt=png

在應用容器全域性查詢,可以透明的訪問資料,而針對特定分割槽的資料訪問會被自動路由到特定的 PDB 執行:

640?wx_fmt=png

來看一下測試過程。

首先建立一個應用容器,這個 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;

640?wx_fmt=jpeg

現在對應用容器進行初始化,在其中部署初始的元資料,建立 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 增加的動態容器對映特性,允許我們增加、分拆分割槽資料,進一步的增強了靈活性。

640?wx_fmt=png

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

近期文章

640?wx_fmt=jpeg