您好,登錄后才能下訂單哦!
Oracle 中的12C新特性-容器數據庫
---12.1.0.2_GI_RAC_Create_CDB_Blog
三月份的時候杰哥跟我講有時間部署
Oracle
12C-容器數據庫,參考公司的遷移文檔,做個測試。這個事一直拖,最近有空嘗試了一下,還是蠻不錯的,就是非常的燒內存。
Oracle 12C
引入了CDB與PDB的新特性,在ORACLE 12C數據庫引入的多租用戶環境(Multitenant Environment)中,允許一個數據庫容器(CDB)承載多個可插拔數據庫(PDB)。CDB全稱為Container Database,中文翻譯為數據庫容器,PDB全稱為Pluggable Database,即可插拔數據庫。在ORACLE 12C之前,實例與數據庫是一對一或多對一關系(RAC):即一個實例只能與一個數據庫相關聯,數據庫可以被多個實例所加載。而實例與數據庫不可能是一對多的關系。當進入ORACLE 12C后,實例與數據庫可以是一對多的關系。下面是官方文檔關于CDB與PDB的關系圖。
其實大家如果對SQL SERVER比較熟悉的話,這種CDB與PDB是不是感覺和SQL SERVER的單實例多數據庫架構是一回事呢。像PDB$SEED可以看成是master、msdb等系統數據庫,PDBS可以看成用戶創建的數據庫。而可插拔的概念與SQL SERVER中的用戶數據庫的分離、附加其實就是那么一回事。
一個CDB數據庫容器包含了下面一些組件:
-ROOT組件
ROOT又叫CDB$ROOT, 存儲著ORACLE提供的元數據和Common User,元數據的一個例子是ORACLE提供的PL/SQL包的源代碼,Common User 是指在每個容器中都存在的用戶。
-SEED組件
Seed又叫PDB$SEED,這個是你創建PDBS數據庫的模板,你不能在Seed中添加或修改一個對象。一個CDB中有且只能有一個Seed. 這個感念,個人感覺非常類似SQL SERVER中的model數據庫。
-PDBS
CDB中可以有一個或多個PDBS,PDBS向后兼容,可以像以前在數據庫中那樣操作PDBS,這里指大多數常規操作。
這些組件中的每一個都可以被稱為一個容器。因此,ROOT(根)是一個容器,Seed(種子)是一個容器,每個PDB是一個容器。每個容器在CDB中都有一個獨一無二的的ID和名稱。
注意:
①:一個CDB可以包含253個PDB(去掉一個是seed還能創建252個PDB)。
②:Root,seed以及每一個PDB的數據文件是獨立的。
③:一個單實例的CDB有一個redo log;RAC環境中每個實例有一個redo log。
④:只有一組后臺進程,它們被ROOT和所有PDB共享。
⑤:Root的全局數據庫名就是CDB的全局數據庫名;PDB的全局數據庫名是由PDB name和DB_DOMAIN參數共同定義的。
⑥:一個CDB使用一個SPFILE或者一個PFILE,其中為ROOT設置的參數的值可以被PDB繼承。另外,也可以使用ALTER SYSTEM語句來設置PDB的參數。對參數文件執行 操作時,必須使用common user并且使用AS SYSDBA, ASSYSOPER, AS SYSBACKUP來連接數據庫。要創建CDB,必須要將初始化參數ENABLE_PLUGGABLE_DATABASE的 值設置為TRUE。
⑦:所有PDB的字符集都使用CDB的字符集。
可以設置所有PDB的時區與CDB相同,也可以單獨為PDB設置時區。
塊大小被應用于整個CDB。
一個CDB也僅有一個控制文件(可以多路復用)。
⑧:Root與每一個PDB都有自己的SYSAUX表空間和SYSTEM表空間。可以為root和每一個PDB設置默認表空間。而默認的臨時表空間對于整個CDB只有一個,但是可以為 每個PDB創建臨時表空間。
⑨:撤銷表空間對于CDB是唯一的。在CDB中,初始化參數UNDO_MANAGEMENT必須被設置為AUTO。當前容器為PDB時,無法通過數據字典視圖查看撤銷表空間,只能通 過動態性能視圖。
》可以把多個PDB集成進一個平臺。
》可以快速提供一個新的PDB或一個已有PDB的克隆。
》通過拔插技術,可以快速把存在的數據庫重新部署到一個新平臺上。
》多個PDB數據庫補丁或升級一次完成。
》通過把單個PDB拔插到較高版本的不同CDB,可以補丁或升級一個PDB。
》從同一個CDB中眾多PDB中分離出某個PDB的內容。
》分離這些PDB應用管理員的責任。
》在一個CDB中,你可以擁有很多PDB。
》PDB和12.1之前版本的普通數據庫是向后兼容的。
》PDB對應用是透明的——你不需要改變客戶端代碼或數據庫對象。
》RAC中每個實例作為一個整體打開CDB(因此CDB和其中的PDB數據庫版本都是相同的)。
》會話僅僅看到它自己連接的那個PDB。
》你可以從一個CDB拔出一個PDB,然后插入另一個CDB。
》你可以在同一個CDB或不同CDB間克隆PDB。
》資源管理器隨著PDB的功能得以擴展。
》通過SQL語句實現了實體PDB的操作(創建,拔出,插入,克隆,清除,設置打開模式)。
》當連接到所謂的“根”(root)時,CDB管理員來執行這些操作。
》所有的PDB能被一次備份,但可以分別單獨恢復。
》每個PDB有自己的私有數據字典用于用戶創建的數據庫對象;另一方面,CDB作為一個整體也包含Oracle提供系統的數據字典,其中,每個數據字典定義自己的命名空間。換句話說,有全局數據字典(CDB級)和本地數據字典(PDB級)。
》有新的分開的數據字典架構,該架構允許一個PDB被快速從一個CDB拔出并插入一個不同的CDB。
》每個PDB只能看到oracle提供系統的只讀定義。
》有全局數據庫參數,也有本地數據庫參數。PDB參數僅僅屬于特定的PDB,并且拔出后,PDB參數也將保持不變。
》數據庫用戶可以是全局的(CDB)或本地的(PDB)。SYS和SYSTEM用戶一開始就在兩級DB中存在。如果你在CDB中創建了一個新用戶,那么你在PDB中也能看到這個用戶。在PDB中創建的用戶只能在該PDB中使用。
》臨時表空間可以是全局或本地的。
》Redo日志和Undo表空間都是全局的(CDB級)。
》Data Guard在CDB級作為一個整體發揮作用;RMAN調度的備份也作為一個整體在CDB級完成;任何時候,你可以只備份一個PDB。
》應用連接PDB時,不需做代碼修改;系統管理員可以連接CDB;連接串中的服務名確定目標PDB。
》PDB允許更加清晰的聲明定義一個應用;一個PDB對同一個CDB里的其他PDB一無所知;每個PDB是個密閉的容器。這保證了新層面DB的獨立和安全。
1. 查看數據庫是否為CDB
[root@vastdata11 ~]# su - oracle [oracle@vastdata11 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sat Jun 1 21:42:21 2019 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options SQL> select name,cdb,open_mode,con_id from v$database; NAME CDB OPEN_MODE CON_ID ------------------ ------ ---------------------------------------- ---------- CDB YES READ WRITE 0
SQL> show con_name; CON_NAME ------------------------------ CDB$ROOT SQL> select Sys_Context('Userenv', 'Con_Name') "current Container" from dual; current Container -------------------------------------------------------------------------------- CDB$ROOT
SQL> select con_id, dbid, guid, name , open_mode from v$pdbs; CON_ID DBID GUID NAME OPEN_MODE ---------- ---------- -------------------------------- ------------------------------------------------------------ -------------------- 2 2382420430 8A33449DBB2C529AE0530B38A8C0899C PDB$SEED READ ONLY 3 1983375270 8A337E167FD16986E0530B38A8C0632A PDB1 READ WRITE 4 2621964339 8A33890C63336EADE0530B38A8C02ED2 PDB2 READ WRITE 5 4092698095 8A3390728AB570E0E0530B38A8C0006E PDB3 READ WRITE SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED 5 PDB3 MOUNTED
SQL> alter pluggable database pdb1 open; Pluggable database altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO 4 PDB2 MOUNTED 5 PDB3 MOUNTED SQL> alter pluggable database pdb1 close; Pluggable database altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED 5 PDB3 MOUNTED ----------也可以通過sqlplus使用傳統的startup和shutdown命令來啟動和關閉PDB----------- SQL> alter session set container=pdb1; Session altered. SQL> startup Pluggable Database opened. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDB1 READ WRITE NO SQL> shu immediate; Pluggable Database closed. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDB1 MOUNTED SQL> alter session set container=CDB$ROOT; Session altered. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED 5 PDB3 MOUNTED
[oracle@vastdata11 admin]$ cat tnsnames.ora # tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/db_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. CDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = vastdata-scan.us.oracle.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cdb) ) ) PDB1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = vastdata-scan.us.oracle.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdb1) ) ) [oracle@vastdata11 admin]$ tnsping pdb1 TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 01-JUN-2019 23:16:33 Copyright (c) 1997, 2014, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = vastdata-scan.us.oracle.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdb1))) OK (0 msec) [oracle@vastdata11 admin]$ sqlplus system/oracle@pdb1 SQL*Plus: Release 12.1.0.2.0 Production on Sat Jun 1 23:14:15 2019 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options SQL> select name,cdb,open_mode,con_id from v$database; NAME CDB OPEN_MODE CON_ID ------------------ ------ ---------------------------------------- ---------- CDB YES READ WRITE 0 SQL> show con_name CON_NAME ------------------------------ PDB1 SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- +DATA/CDB/DATAFILE/undotbs1.280.1009718515 +DATA/CDB/8A337E167FD16986E0530B38A8C0632A/DATAFILE/system.292.1009719563 +DATA/CDB/8A337E167FD16986E0530B38A8C0632A/DATAFILE/sysaux.293.1009719563 +DATA/CDB/8A337E167FD16986E0530B38A8C0632A/DATAFILE/users.295.1009719733 SQL>
oracle12C中在啟動數據庫的時候, PDB 并不會隨著 CDB 而啟動。
不過我們可以通過創建一個觸發器讓 PDB 能夠隨 CDB 啟動。如下:
SQL> SHOW CON_NAME CON_NAME ------------------------------ CDB$ROOT SQL> CREATE OR REPLACE TRIGGER open_pdbs 2 AFTER STARTUP ON DATABASE 3 BEGIN 4 EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN'; 5 END open_pdbs; 6 / Trigger created. SQL> shu immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL>startup ORACLE instance started. Total System Global Area 1560281088 bytes Fixed Size 2924784 bytes Variable Size 570429200 bytes Database Buffers 973078528 bytes Redo Buffers 13848576 bytes Database mounted. Database opened. SQL>show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO 4 PDB2 READ WRITE NO 5 PDB3 READ WRITE NO
7.創建一個新的PDB
SQL> create pluggable database pdb4 admin user admin identified by admin; SQL> alter pluggable database pdb4 open; SQL> select con_id,dbid,con_uid,guid,name,open_mode,create_scn,total_size,block_size from v$pdbs; CON_ID DBID CON_UID GUID NAME OPEN_MODE CREATE_SCN TOTAL_SIZE BLOCK_SIZE ---------- ----- ---------- -------------------------------- ----------- ---------- ---------- ---------- ---------- 2 427872663 427872663 439BFCB2A2EE1BE7E055000000000001 PDB$SEED READ ONLY 1594401 838860800 8192 3 1891424478 1891424478 439C5B1174C121B7E055000000000001 FEIGE READ WRITE 1753608 865075200 8192 4 2998508999 2998508999 53F376E8715628BCE055000000000001 PDB4 READ WRITE 1757024 859832320 8192
“admin user”子句是必須的,在擴展格式,給新用戶賦予了權限和角色,該用戶僅在admin內可以創建新會話。
在創建完可插拔數據庫后,新的PDB處于MOUNTED模式.
8.克隆一個新的PDB
SQL> create pluggable database pdb5 from pdb4; SQL> alter pluggable database pdb5 open; 切換到PDB,或切換到CDB SQL> alter session set container=pdb4; SQL> alter session set container=cdb$root; 關閉一個pdb和關閉所有的pdb SQL> alter pluggable database pdb4 close; SQL> alter pluggable database all close;
9.插入一個pdb數據庫
pdb5.xml:文件確定數據文件的名字和全路徑等信息。這些信息在插入操作時會用到。
注意:PDB還是其從中拔出的CDB的一部分,只是現在狀態變為了拔出(UNPLUGGED)而已。
SQL> alter pluggable database pdb5 close; SQL> alter pluggable database pdb5 unplug into '/opt/oracle/oradata/pdb5.xml';
----在當前的容器中刪除這個pdb
SQL> drop pluggable database pdb5 keep datafiles;
----查看pdb和這個容器是否兼容,如果報錯說明不兼容
exec DBMS_PDB.Check_Plug_Compatibility(PDB_Descr_File=>'/opt/oracle/oradata/pdb5.xml');
----開始插入pdb
(using關鍵字后必須跟上PDB描述的絕對路徑,即,先前拔出操作時產生的.XML文件)
create pluggable database pdb5 using '/opt/oracle/oradata/pdb5.xml' move file_name_convert = ('/cdb1/', '/cdb2/');
----最后打開這個pdb
alter pluggable database pdb5 open;
---至此,
cdb與pdb的一些基礎的知識和操作都有介紹,
就先總結到這里。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。