標籤:
適用於:企業版資料庫——版本12.1.0.1(12.1)本文檔中的知識對所有平台均適用。文檔目的文檔描寫了插接式資料庫的許多方面和用法,以更好的理解該產品,同時,該文檔也可做為一個快速參考手冊。問答12c多租戶架構中的CDB/PDB概念知識。多租戶架構中的可插接資料庫(PDB)是什麼意思?可插接資料庫(PDB)是Oracle資料庫12c(12.1)中的新特性。可以在一個資料庫內部擁有多個可插接資料庫。可插接資料庫是完全向後相容的。為什麼要使用多租戶選件?是為了實現以下資料庫整合目標:降低操作管理的總成本:--管理成本--資料中心成本--儲存成本--意外事故成本提升效能:--資源利用--可管理性--整合--服務管理不需要更改應用程式不會降低效能必須在應用程式之間提供資源管理和隔離簡化資料庫升級和打補丁從多租戶選件中還能獲得哪些益處?多租戶可插接資料庫的益處有:能夠快速配置一個新的資料庫或者針對現存資料庫的拷貝通過拔插功能,可以實現現存資料庫到新平台的快速重部署針對許多資料庫,可以快速打補丁或者升級資料庫版本,且這樣做的成本只有一次可以將PDB拔下打包或者升級,然後可以將它插到一個更新版本的不同的CDB中。一台機器中以PDB的方式可以較單資料庫運行更多的資料庫執行個體從Oracle提供的系統管理員的職責中分離應用程式系統管理員的職責從現有的資料庫版本升級到12c多租戶資料庫有多簡單呢?遷移到12c可插接資料庫是很簡單的。你可以在一下方案中選擇一個最適合你的:方法1:升級現低版本資料庫到12.1將資料庫插入後升級成CDB方法2:給需要升級的每個資料庫提供一個空的PDB用資料泵或者ogg將資料庫遷移到PDB多租戶架構中,現階段不支援哪些資料庫特性?當前在CDB中不支援的資料庫特性如下:一致性查詢通知閃回資料歸檔熱圖自動資料最佳化如果必須使用以上的特性,那麼需要建立一個非CDB。多租戶CDB/PDB的基本操作如何知曉資料庫是否為多租戶資料庫?使用如下語句查詢:SQL> select NAME, DECODE(CDB, 'YES', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option ?" , OPEN_MODE, CON_ID from V$DATABASE;如何確認在CDB中有哪些PDB呢?SQL> select CON_ID, NAME, OPEN_MODE from V$PDBS;如何串連到一個特定的PDB,如:PDB6?可以使用如下命令從其他PDB或者root容器切換到PDB6:SQL> alter session set container = pdb6;也可以使用如下方法使用SQL*PLUS的connect命令串連到PDB:使用快速串連CONNECT username/[email protected][:port][/service_name][:server][/instance_name]如果從OS:$ sqlplus hpal/[email protected]//hpal-node1:1521/pdb2OR$ sqlplus hpal/[email protected]//localhost:1521/pdb2OR$ sqlplus hpal/[email protected]//localhost/pdb2查看當前串連PDB:show con_name使用服務名串連例:sqlplus hpal/[email protected]如何切換到主容器資料庫?SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;如何確認當前串連的PDB或者CDB?SQL> show con_nameSQL> select sys_context ( 'Userenv', 'Con_Name') "Container DB" from dual;如何啟動一個PDB?如果當前串連PDB:SQL> alter pluggable database open;如果當前串連root:QL> alter pluggable database pdb6 open;如何關閉PDB?如果當前串連是PDB:SQL> alter pluggable database close;如果當前串連是root:SQL> alter pluggable database pdb6 close;容器資料庫如何啟停呢?像非CDB那樣使用startup/shutdown啟停CDB:如果CBD關閉了,那麼無法訪問PDB。在CDB中,root和所有的PDB共用一個單一實例,或者,當使用RAC的時候,共用多個並發資料庫執行個體。啟動和關閉整個CDB,而不是單一的PDB。然而,當CDB開啟,可以通過ALTER PLUGGABLE DATABASE命令改變某一個PDB的開啟狀態。哪些參數是可以在PDB層級改變的呢?select NAME, ISPDB_MODIFIABLE from V$PARAMETER;CDB中有哪些普通使用者呢?SQL> select distinct USERNAME from CDB_USERS where common = 'YES';如何建立普通使用者?SQL> create user c##db_dba1 identified by manager1 container=all;如何建立本機使用者?SQL> create user pdb6_dba1 identified by manager1 container=current; 多租戶架構容器ID=0和1有什麼區別呢?CON_ID “0“意味著資料不屬於任何一個容器,而是CDB整體的。比如:從V$DATABASE返回的資料屬於CDB但不適於任一特定的容器,所以CON_ID設為”0“。一個CONTAINER_DATA對象能夠返回屬於不同容器(包括CON_ID==1的root)或者屬於CDB的資料,屬於CDB的行的CON_ID會被設定為0.容器資料對象中不同CONN_ID的不同值的含義:0=資料屬於整個CDB1=資料屬於root2=資料屬於seed3-254=資料屬於PDB,每個PDB有其自己的容器ID。有與PDB關聯的後台進程嗎?如:PMON,SMON等沒有。只有一組root和所有PDB共用的後台進程。每個PDB要有單獨的控制檔案嗎?不。整個CDB只有一個單獨的redo log和控制檔案。每個PDB要有單獨的記錄檔嗎?不。整個CDB只有一個單獨的redo log和控制檔案。可以通過PDB的PDB basis監控PDB上SGA的使用嗎?所有PDB是共用一個SGA的。然而,可以通過root或者PDB監控SGA的消耗。SQL> alter session set container=CDB$ROOT;SQL> select POOL, NAME, BYTES from V$SGASTAT where CON_ID = '&con_id';SQL> select CON_ID, POOL, sum(bytes) from v$sgastat group by CON_ID, POOL order by CON_ID, POOL;可以通過PDB的PDB basis監控PDB上PGA的使用嗎?select CON_ID, sum(PGA_USED_MEM), sum(PGA_ALLOC_MEM), sum(PGA_MAX_MEM) from v$process group by CON_ID order by CON_ID; alter session set container =CDB$ROOT; select NAME , value from v$sysstat where NAME like 'workarea%'; alter session set container = <targetPDB>;select NAME , value from v$sysstat where NAME like 'workarea%';每個PDB都需要單獨的UNDO資料表空間嗎?單一實例CDB中只有一個在用的undo資料表空間。RAC CDB中,每個執行個體有一個在用undo資料表空間。只有一個具有適當許可權且當前串連容器是root的普通使用者可以建立undo資料表空間。每個PDB都需要單獨的system資料表空間嗎?root和每個PDB都有一個system資料表空間。每個PDB都需要單獨的sysaux資料表空間嗎?root和每個PDB都有一個sysaux資料表空間。每個PDB都需要有單獨的暫存資料表空間嗎?對於整個CDB,只有一個預設的暫存資料表空間。然而,可以為每個PDB建立另外的暫存資料表空間。對於單一實例CDB,只需要一個在用的暫存資料表空間;對於RAC CDB,每個執行個體需要一個在用暫存資料表空間。能夠為root和每個PDB指定不同的預設資料表空間嗎?當然可以。root和PDB的物理資料檔案都是分開的嗎?資料檔案對於每個PDB,seed和root都是分開的。那麼在CBD中,使用者資料存放區在哪裡呢?CDB中,大部分使用者資料存在PDB中。root不儲存或者儲存少量使用者資料。可插接資料庫支援分離的字元集嗎?CDB使用一個字元集。CDB中所有的PDB使用與CDB相同字元集。Oracle建議:對於所有新的部署而且如果所有的PDB為空白,那麼Oracle強烈建議CDB資料庫字元集使用AL32UTF8,CDB國家字元集使用AL16UTF8.Oracle強烈建議,合并之前根據需求,將現有資料庫轉換為一個或多個AL32UTF8字元集的CDB。可以使用資料庫Unicode轉換助手將一個非CDB轉為AL32UTF8。但是在建立以後,就不能使用資料庫轉換助手轉換CDB字元集。如果在合并資料庫之前不能轉換字元集,那麼需要使用外掛程式相容的資料庫字元集分組,然後將每個組使用適當的超集插接到不同的CDB。參考文檔:https://support.oracle.com/epmos/faces/Oracle%20Database%20Globalization%20Support%20Guide,%2012c%20Release%201%20(12.1)在可插接資料庫環境中,如何配置網路檔案?CDB有一個唯一的listener.ora,tnsnames.ora,sqlnet.ora檔案,CDB中所有的PDB共用這些檔案。CDB/PDB進階操作如何安裝設定可插接資料庫?使用runInstaller安裝資料庫軟體使用dbca建立資料庫。在一個操作中可以建立多個PDB。DBCA在建立CDB的時候允許指定PDB的個數,可以使用DBCA從CDB拔插PDB。什麼操作作為實體作用在PDB上?這些操作:建立PDB(全新的,現存PDB的拷貝,插入未接入的PDB)拔出PDB刪除PDB設定PDB的Open_Mode如何建立一個可拔插資料庫?create pluggable database x admin user a identified by p;create pluggable database y admin user a identified by p file_name_convert = ('pdbseed', 'y');如何徹底刪除一個PDB?drop pluggable database xincluding datafiles;使用PL/SQL管理PDB的配置有多簡單?例:OMF:declaret0 integer not null := -1;procedure Show_Time(What in varchar2) ist varchar2(10);begint := Lpad((DBMS_Utility.Get_Time() - t0), 5);DBMS_Output.Put_Line('create PDB:'||t||' centiseconds');end Show_Time;begint0 := DBMS_Utility.Get_Time();execute immediate 'create pluggable database xadmin user a identified by p';Show_Time('create PDB:');t0 := DBMS_Utility.Get_Time();execute immediate 'drop pluggable database xincluding datafiles';Show_Time('drop PDB: ');end;如何複製PDB?被複製PDB必須以read only模式開啟。OMF:create pluggable database x2from x;如何拔出一個PDB?alter pluggable database x unplug into '/some_directory/x_description.xml' ;語句中的into後面必須跟描述PDB的全路徑的xml檔案。可擴充性&RAC如何添加或者更改使用者管理的服務?rvctl add service … –pdb <pdb_name>srvctl將會在有服務啟動的所有執行個體上自動開啟PDB。如果將<pdb_name>設定為‘’,也就意味著將此服務屬性值設定為空白,那麼這個服務就只能串連到root如何查看有哪些服務綁定到了可插接資料庫上?SQL> column NAME format a30SQL> select PDB, INST_ID, NAME from gv$services order by 1;診斷有關如何尋找PDB的警示日誌?所有PDB的警示資訊都放到同一個警示日誌中。容器資料庫的資訊可以在xml格式中的Diag Alert和文字格式設定中的Diag Trace找到。也可通過查看動態效能檢視v$diag_info查看明細資訊。如何查看與PDB相關的追蹤檔案?PDB產生的所有追蹤檔案當前都可以在容器資料庫的Diag Trace發現。可以通過查看動態效能檢視v$diag_info查看明細資訊。其他如果PDB中,有使用者定義的,或者普通使用者建立的模式對象,在拔出然後插到另一個CDB中,且原有的普通使用者在這個新的CDB中不存在,那麼原來的模式對象怎麼辦?他們會屬於哪個使用者呢?PDB中,原來被授予對這些模式對象擁有許可權的其他使用者,還依然擁有那些許可權嗎?如果在CDB中插入一個含有普通使用者的PDB,會發生:PDB中的普通使用者以前被授予的一般性許可權(包括SET CONTAINER許可權)將被取消。如果CDB中有與新插入的PDB相同的普通使用者名稱,那麼他們將會合并。且使用者密碼以CDB的為準。否則,新插入的PDB中的使用者將被鎖定。這種情況下,你可以:讓它保持鎖定,使用該模式的對象。使用資料泵將這些對象遷移到另一個模式中,然後將鎖定的使用者帳號刪掉。關閉PDB,串連到root,然後建立一個與鎖定帳號相同名稱的使用者。當重新開啟PDB,資料庫會處理鎖定使用者與建立使用者之間的許可權差異。之後,就可以解鎖PDB中的鎖定使用者。該使用者以前有的許可權和角色將保持不變。在標準版本中,多租戶選件可用嗎?可用,但是每個CDB將只能建立一個PDB。事務可以跨PBD嗎?不可以。雖然在一個PDB上開始一個事務之後可以使用alter session set container,但是只可以在第二個PDB使用select語句。事務是保留的,可以切換回原來的PDB執行提交或者復原。每個容器裡面的CDB_和V$視圖中都儲存什麼資料?CDB_視圖是容器資料對象。當一個使用者串連到root然後查詢一個CDB_視圖,查詢結果取決於該視圖對該使用者佈建的CONTAINER_DATA值。CONTAINER_DATA的SQL ALTER USER語句用來設定和修改使用者的CONTAINER_DATA值。多租戶CDB的root下,CDB_視圖可以用來查詢root和PDB中的表、資料表空間、使用者、許可權、參數等資訊。不管CDB_視圖收集的誰的資訊,CDB_視圖屬於SYS使用者。預設情況下,一個使用者串連到root後只能看到屬於root的資訊。每個PDB可以設定自己的時區嗎?可以。每個PDB可以設定自己的NLS參數嗎?可以。如何監控CDB/PDB中每個容器/資料庫的undo使用?select NAME,MAX(TUNED_UNDORETENTION), MAX(MAXQUERYLEN), MAX(NOSPACEERRCNT), MAX(EXPSTEALCNT)from V$CONTAINERS c , V$UNDOSTAT uwhere c.CON_ID=u.CON_IDgroup by NAME;select NAME,SNAP_ID,UNDOTSN,UNDOBLKS,TXNCOUNT,MAXQUERYLEN,MAXQUERYSQLIDfrom V$CONTAINERS c , DBA_HIST_UNDOSTAT uwhere c.CON_ID=u.CON_IDand u.CON_DBID=c.DBIDorder by NAME;多租戶架構與基於模式有什麼區別?使用者名稱衝突會組織基於模式的整合。基於模式的整合安全性不高。per-application,back-end,point-in-time恢複很難很難協調應用和back-ends之間的資源分派。為單個應用和back-end打補丁是做不到的。對單個應用和back-end的複製是很難的。
Oracle Multitenant Option - 12c Frequently Asked Questions (文檔 ID 1511619.1)譯文