Oracle 12c系列|PDB的創建
轉自:https://blog.csdn.net/dev_csdn/article/details/79459017
PDB數據庫的創建可以從現存的數據庫中復制數據文件,包括種子容器、可插拔數據庫、non-CDB數據庫,創建時可以使用CREATE PLUGGABLE、RMAN、DBCA以及EM等。
在12.1版本中在創建PDB時,Source PDB必須處於read only狀態,在12.2版本中,因為undo local mode新特性的推出,在創建PDB時,Source PDB在read write狀態,依然可以創建。
另外在12.2版本中Oracle推出了refresh PDB特性,具有對Source PDB進行增量同步的功能。
使用CREATE PLUGGABLE命令可以使用以下資源創建PDB
CDB seed (PDB$SEED)
克隆已經存在的PDB
Local PDB
Remote PDB
non-CDB數據庫
拔下的PDB
使用DBCA可以使用以下資源創建PDB
CDB seed (PDB$SEED)
RMAN備份
拔下的PDB
示例:(這里只演示使用create pluggable database命令方式創建PDB)
使用CDB seed創建PDB
1.在SQL*Plus中輸入CREATE PLUGGABLE DATABASE語句
(這里創建未ypdb1的pdb,管理用戶為ypdb1)
CREATE PLUGGABLE DATABASE orclpdb ADMIN USER orclpdb IDENTIFIED BY orclpdb STORAGE (MAXSIZE 4G) DEFAULT TABLESPACE orclpdb DATAFILE '/usr/local/oracle/oradata/orclpdb/orclpdb.dbf' SIZE 1024M AUTOEXTEND ON PATH_PREFIX = '/usr/local/oracle/oradata/orclpdb/' FILE_NAME_CONVERT =('/usr/local/oracle/oradata/orcl/pdbseed', '/usr/local/oracle/oradata/orclpdb/');
ADMIN USER 用於執行管理任務的本地用戶
STORAGE (MAXSIZE 2G) 指定了PDB可用的最大空間
DEFAULT TABLESPACE 為PDB指定默認的Tablespace
PATH_PREFIX 用來限制directory objects/Oracle XML/Create pfile/Oracle wallets所在的目錄
FILE_NAME_CONVERT 設置子容器和數據文件副本的位置
2.語句執行完畢之后查看創建完成的PDB:
sys. ora12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 YPDB1 MOUNTED
sys. ora12c>
克隆已經存在的PDB
這種方式可以通過使用當前CDB中的其他PDB,以及復制遠端CDB中的PDB,還可以復制non-CDB數據庫創建成PDB。
Clone a Local PDB
在Clone本地PDB時需要注意一下幾點:
使用的用戶必須擁有’CREATE PLUGGABLE DATABASE’的權限(測試里使用sys用戶)
源PDB不可以是關閉狀態
如果CDB為shared undo,PDB必須為READ-ONLY狀態
如果CDB不是歸檔模式,那么PDB必須為READ-ONLY狀態
說明:如果是Oracle Database 版本為12.1,那么PDB只能為READ-ONLY狀態,因在12.1中undo模式,還只能選擇shared undo。
sys. ora12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 YPDB1 READ WRITE NO
sys. ora12c>
這里使用YPDB1做為源PDB,創建的PDB為YPDB2。
(1) 檢查是否為shared undo模式
COL PROPERTY_NAME FOR A30
COL PROPERTY_VALUE FOR A30
SELECT property_name, property_value
FROM database_properties
WHERE property_name='LOCAL_UNDO_ENABLED';
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------------------
LOCAL_UNDO_ENABLED TRUE
(2) 檢查是否未archivelog模式
sys. ora12c>ARCHIVE LOG LIST
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/recovery/ora12c/arch
Oldest online log sequence 21
Next log sequence to archive 23
Current log sequence 23
sys. ora12c>
(3) 創建驗證數據
yangyuhang. ypdb1>CONN /AS SYSDBA
Connected.
sys. ora12c>conn yangyuhang/yangyuhang@ypdb1
Connected.
yangyuhang. ypdb1>SELECT COUNT(*) FROM t;
COUNT(*)
----------
22198
Elapsed: 00:00:00.01
yangyuhang. ypdb1>
(4) 執行CREATE PLUGGABLE DATABASE語句(這里使用sys用戶連接根容器)
CREATE PLUGGABLE DATABASE ypdb2 FROM ypdb1
PATH_PREFIX = '/u01/app/oracle/oradata/ora12c/ypdb2/'
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/ora12c/ypdb1/', '/u01/app/oracle/oradata/ora12c/ypdb2/')
SERVICE_NAME_CONVERT = ('ypdb1t','ypdb2t');
(5) 查看創建完成的YPDB2
sys. ora12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 YPDB1 READ WRITE NO
4 YPDB2 MOUNTED
sys. ora12c>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;
PDB_ID PDB_NAME CON_UID STATUS CREATION_SCN CON_ID
---------- -------------------- ---------- ---------- ------------ ----------
2 PDB$SEED 1453953285 NORMAL 213 2
3 YPDB1 2376019304 NORMAL 697945 3
4 YPDB2 3908707960 NEW 707501 4
Elapsed: 00:00:00.02
sys. ora12c>
(6) 檢查數據文件
sys. ora12c>ALTER PLUGGABLE DATABASE YPDB2 OPEN;
Pluggable database altered.
Elapsed: 00:00:14.02
sys. ora12c>SELECT con_id, tablespace_name, file_name FROM cdb_data_files WHERE con_id=4;
CON_ID TABLESP FILE_NAME
------ ------- ---------------------------------------------------------
4 SYSTEM /u01/app/oracle/oradata/ora12c/ypdb2/system01.dbf
4 SYSAUX /u01/app/oracle/oradata/ora12c/ypdb2/sysaux01.dbf
4 DEFTBS /u01/app/oracle/oradata/ora12c/ypdb2/deftbs01.dbf
4 USERTBS /u01/app/oracle/oradata/ora12c/ypdb2/usertbs01.dbf
4 UNDO_1 /u01/app/oracle/oradata/ora12c/ypdb2/system01_i1_undo.dbf
4 YPDB1 /u01/app/oracle/oradata/ora12c/ypdb2/ypdb01.dbf
6 rows selected.
Elapsed: 00:00:00.01
sys. ora12c>
(7) 檢查service_name
sys. ora12c>SELECT service_id, name, network_name, enabled, pdb, con_id FROM cdb_services;
SERVICE_ID NAME NETWORK_NAME ENA PDB CON_ID
---------- ------------------- -------------------- --- --------- ----------
1 SYS$BACKGROUND NO CDB$ROOT 1
2 SYS$USERS NO CDB$ROOT 1
3 ora12c.linux.com ora12c.linux.com NO CDB$ROOT 1
6 ypdb1.linux.com ypdb1.linux.com NO YPDB1 3
1 ypdb1t ypdb1t NO YPDB1 3
1 ypdb2t ypdb2t NO YPDB2 4
2 ypdb2.linux.com ypdb2.linux.com NO YPDB2 4
7 rows selected.
Elapsed: 00:00:00.00
sys. ora12c>
源PDB中的service_name已經被更改指定的service_name.
(8) 檢查驗證數據
sys. ora12c>conn yangyuhang/yangyuhang@ypdb2
Connected.
yangyuhang. ypdb2>SELECT COUNT(*) FROM t;
COUNT(*)
----------
22198
Elapsed: 00:00:00.11
yangyuhang. ypdb2>
Creating a PDB by Cloning a Remote PDB
Clone遠端PDB時需要注意以下幾點:
如果PDB被Clone到的CDB的字符集不是AL32UTF8,那么源與目標字符集必須兼容。
源端與目標端的字節順序必須相同。
連接的用戶在CDB中必須擁有'CREATE PLUGGABLE DATABASE'的權限。
源PDB不可以是關閉狀態。
如果遠端CDB為shared undo,源PDB必須為READ-ONLY狀態。
如果遠端CDB不是歸檔模式,源PDB必須為READ-ONLY狀態。
這里測試將win平台ORA12CW中的PDB(ORA12CWPDB)復制到Linux的,目標PDB為PDB2。
(1) 查看源端與目標的字符集
col parameter for a30
col value for a30
select * from nls_database_parameters where parameter='NLS_CHARACTERSET'
or parameter='NLS_LANGUAGE' or parameter='NLS_NCHAR_CHARACTERSET';
(2) 查看源端與目標端字節順序
col platform_name for a40
SELECT d.inst_id, t.platform_id, t.platform_name, t.endian_format, d.name FROM v$transportable_platform t, gv$database d
WHERE t.platform_name = d.platform_name;
(3) 查看源端歸檔模式
archive log list
(4) 查看源端undo模式
SELECT property_name, property_value
FROM database_properties
WHERE property_name='LOCAL_UNDO_ENABLED';
(5) 目標端創建dblink
CREATE DATABASE LINK ora12cw CONNECT TO system IDENTIFIED BY oracle USING 'ORA12CW';
(6) 運行CREATE PLUGGABLE DATABASE語句進行復制PDB
CREATE PLUGGABLE DATABASE pdb2 FROM ORA12CWPDB@ora12cw
PATH_PREFIX = '/u01/app/oracle/oradata/ora12cl/pdb2/'
FILE_NAME_CONVERT = ('D:\U01\APP\ORACLE\ORADATA\ORA12CW\ORA12CWPDB\', '/u01/app/oracle/oradata/ora12cl/pdb2/');
(7) 創建完成后目標端查看PDB2
sys. ora12cl>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 PDB2 MOUNTED
5 PDB1 MOUNTED
sys. ora12cl>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;
PDB_ID PDB_NAME CON_UID STATUS CREATION_SCN CON_ID
---------- -------------------- ---------- ---------- ------------ ----------
2 PDB$SEED 3409233005 NORMAL 1408788 2
4 PDB2 2218727525 NEW 1824437 4
5 PDB1 1058019921 NORMAL 1535445 5
Elapsed: 00:00:00.00
sys. ora12cl>
(8) 目標查看數據文件
sys. ora12cl>alter pluggable database pdb2 open;
Pluggable database altered.
Elapsed: 00:00:14.02
sys. ora12cl>SELECT con_id, tablespace_name, file_name FROM cdb_data_files WHERE con_id=4;
CON_ID TABLESPACE_NAME FILE_NAME
------ --------------- --------------------------------------------------
4 SYSTEM /u01/app/oracle/oradata/ora12cl/pdb2/SYSTEM01.DBF
4 SYSAUX /u01/app/oracle/oradata/ora12cl/pdb2/SYSAUX01.DBF
4 UNDOTBS1 /u01/app/oracle/oradata/ora12cl/pdb2/UNDOTBS01.DBF
4 USERS /u01/app/oracle/oradata/ora12cl/pdb2/USERS01.DBF
Elapsed: 00:00:00.00
sys. ora12cl>
克隆遠端的PDB成功。
Creating a PDB by Cloning a Non-CDB
Clone遠端的non-CDB時需要注意以下幾點:
連接的用戶必須擁有’CREATE PLUGGABLE DATABASE’的權限。
non-CDB不可以是關閉狀態。
如果遠端non-CDB不是歸檔模式,那么non-CDB必須為READ-ONLY狀態。
源端與目標端的字節序必須相同。
如果創建的PDB來自於non-CDB,那么non-CDB的版本必須在12.1.0.2之后。
如果創建的PDB來自於non-CDB,當PDB創建完成后使用SYSDBA權限用戶登錄PDB運行noncdb_to_pdb.sql腳本,將這里將源端non-CDB數據庫orcl12復制到ora12cl中,命名為PDB3。
(1)查看non-CDB數據庫版本
SELECT * FROM v$version;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
(2)查看遠端non-CDB數據庫模式
SELECT dbid, name, open_mode, cdb FROM v$database;
DBID NAME OPEN_MODE CDB
---------- --------- -------------------- ---
3544959965 ORCL12 READ WRITE NO
(3)查看non-CDB數據庫是否為歸檔模式
ARCHIVE LOG LIST
(4)查看源端與目標端字節順序
col platform_name for a40
SELECT d.inst_id, t.platform_id, t.platform_name, t.endian_format, d.name FROM v$transportable_platform t, gv$database d
WHERE t.platform_name = d.platform_name;
(5)目標端創建dblink
CREATE DATABASE LINK orcl12 CONNECT TO system IDENTIFIED BY oracle USING 'ORCL12';
(6)執行CREATE PLUGGABLE DATABASE語句
CREATE PLUGGABLE DATABASE pdb3 FROM orcl12@orcl12
PATH_PREFIX = '/u01/app/oracle/oradata/ora12cl/pdb3/'
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/orcl12/', '/u01/app/oracle/oradata/ora12cl/pdb3/');
(7)PDB創建成功后查看PDB
sys. ora12cl>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB3 MOUNTED
4 PDB2 READ WRITE NO
5 PDB1 MOUNTED
sys. ora12cl>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;
PDB_ID PDB_NAME CON_UID STATUS CREATION_SCN CON_ID
---------- --------------- ---------- ---------- ------------ ----------
3 PDB3 3564415452 NEW 3014651 3
2 PDB$SEED 3409233005 NORMAL 1408788 2
4 PDB2 2218727525 NORMAL 1824437 4
5 PDB1 1058019921 NORMAL 1535445 5
Elapsed: 00:00:00.00
(8)運行noncdb_to_pdb.sql腳本(必須使用擁有SYSDBA權限的用戶在PDB中執行)
$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
(9)查看數據文件
sys. ora12cl>alter pluggable database pdb3 open;
Pluggable database altered.
Elapsed: 00:00:52.88
sys. ora12cl>SELECT con_id, tablespace_name, file_name FROM cdb_data_files WHERE con_id=3;
CON_ID TABLESPACE_NAME FILE_NAME
---------- --------------- --------------------------------------------------
3 SYSTEM /u01/app/oracle/oradata/ora12cl/pdb3/system01.dbf
3 SYSAUX /u01/app/oracle/oradata/ora12cl/pdb3/sysaux01.dbf
3 UNDOTBS1 /u01/app/oracle/oradata/ora12cl/pdb3/undotbs01.dbf
3 USERS /u01/app/oracle/oradata/ora12cl/pdb3/users01.dbf
Elapsed: 00:00:00.00
sys. ora12cl>
Cloning a PDB Without Cloning Its Data
在克隆已有的PDB或者non CDB時,我們也可以將克隆語句中加入NO DATA子句,在使用NO DATA子句時,僅僅會克隆源PDB中的模型定義,並不會克隆PDB中的數據。(Oracle數據庫內自動創建的schemas下的對象會被成功克隆,而用戶創建的schemas下的對象僅僅會克隆對象的定義結構)。
測試克隆本地PDB時使用no data子句
這里將WOQUPDB克隆為PDBTEST.
(1)源PDB
sys. woqu>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 WOQUPDB READ WRITE NO
sys. woqu>COL PROPERTY_NAME FOR A30
sys. woqu>COL PROPERTY_VALUE FOR A30
sys. woqu>
(2)檢查UNDO模式及歸檔模式
sys. woqu>SELECT property_name, property_value
2 FROM database_properties
3 WHERE property_name='LOCAL_UNDO_ENABLED';
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------------------
LOCAL_UNDO_ENABLED TRUE
Elapsed: 00:00:00.04
sys. woqu>sys. woqu>archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 7
Next log sequence to archive 9
Current log sequence 9
sys. woqu>
(3)創建測試數據表t,注意這里的t表位於sys用戶下
05:51:10 sys. woqupdb>create table t as select * from dba_objects where rownum<=10;
Table created.
Elapsed: 00:00:00.10
05:52:41 sys. woqupdb>select count(*) from t;
COUNT(*)
----------
10
Elapsed: 00:00:00.01
05:52:50 sys. woqupdb>
表t中共有10條數據。
(4)創建測試數據表t_tab,注意這里的t表位於yangyuhang用戶下
05:51:46 yangyuhang. woqupdb>create table t_tab as select * from dba_objects where rownum<=999;
Table created.
Elapsed: 00:00:01.84
05:52:15 yangyuhang. woqupdb>select count(*) from t_tab;
COUNT(*)
----------
999
Elapsed: 00:00:00.01
05:52:19 yangyuhang. woqupdb>
(5)使用create pluggable database + NO DATA子句創建pdb:pdbtest
sys. woqu>CREATE PLUGGABLE DATABASE pdbtest FROM woqupdb NO DATA
2 PATH_PREFIX = '/u01/app/oracle/oradata/woqu/pdbtest'
3 FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/woqu/woqupdb', '/u01/app/oracle/oradata/woqu/pdbtest');
Pluggable database created.
Elapsed: 00:00:09.35
sys. woqu>
(6)檢查克隆完成的pdbtest
sys. woqu>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ----------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 WOQUPDB READ WRITE NO
5 PDBTEST MOUNTED
sys. woqu>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;
PDB_ID PDB_NAME CON_UID STATUS CREATION_SCN CON_ID
---------- ----------- ---------- ---------- ------------ ----------
3 WOQUPDB 1167267009 NORMAL 1443334 3
2 PDB$SEED 399989944 NORMAL 1408751 2
5 PDBTEST 3356573055 NEW 1956581 5
Elapsed: 00:00:00.05
sys. woqu>alter pluggable database pdbtest open;
Pluggable database altered.
Elapsed: 00:00:07.09
sys. woqu>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ----------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 WOQUPDB READ WRITE NO
5 PDBTEST READ WRITE NO
sys. woqu>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;
PDB_ID PDB_NAME CON_UID STATUS CREATION_SCN CON_ID
---------- --------- ---------- ------ ------------ ----------
3 WOQUPDB 1167267009 NORMAL 1443334 3
2 PDB$SEED 399989944 NORMAL 1408751 2
5 PDBTEST 3356573055 NORMAL 1956581 5
Elapsed: 00:00:00.02
sys. woqu>
(7)將從測試數據
sys. woqu>alter session set container=pdbtest;
Session altered.
Elapsed: 00:00:00.07
sys. woqu>show user con_id
USER is "SYS"
CON_ID
------------------------------
5
sys. woqu>select count(*) from t;
COUNT(*)
----------
10
Elapsed: 00:00:00.00
sys. woqu>select count(*) from yangyuhang.t_tab;
COUNT(*)
----------
0
Elapsed: 00:00:00.02
sys. woqu>
通過測試可以看到sys下的對象中的數據依然克隆成功,而自建用戶下的對象中數據並沒有跟着一起克隆。
測試克隆遠端PDB時使用no data子句
這里將遠端PDB:PDBTEST克隆到本地,命名為ORA12CPDB2:
(1)創建DBLINK
sys. ora12c>CREATE DATABASE LINK woqu CONNECT TO system IDENTIFIED BY oracle USING 'WOQU';
Database link created.
Elapsed: 00:00:00.15
sys. ora12c>
(2)克隆PDBTEST
sys. ora12c>CREATE PLUGGABLE DATABASE ORA12CPDB2 FROM PDBTEST@WOQU NO DATA
2 PATH_PREFIX = '/u01/app/oracle/oradata/ora12c/ora12cpdb2'
3 FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/woqu/pdbtest', '/u01/app/oracle/oradata/ora12c/ora12cpdb2');
Pluggable database created.
Elapsed: 00:00:10.44
sys. ora12c>
(3)檢查克隆完成后的ORA12CPDB2
sys. ora12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- -------------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORA12CPDB READ WRITE NO
5 ORA12CPDB2 MOUNTED
sys. ora12c>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;
PDB_ID PDB_NAME CON_UID STATUS CREATION_SCN CON_ID
---------- ------------- ---------- ---------- ------------ ----------
3 ORA12CPDB 1788418398 NORMAL 1442734 3
2 PDB$SEED 2375660446 NORMAL 1408749 2
5 ORA12CPDB2 2003741801 NEW 1959473 5
Elapsed: 00:00:00.01
sys. ora12c>
(4)驗證數據
sys. ora12c>alter pluggable database ora12cpdb2 open;
Pluggable database altered.
Elapsed: 00:00:05.24
sys. ora12c>alter session set container=ora12cpdb2;
Session altered.
Elapsed: 00:00:00.04
sys. ora12c>select count(*) from t;
COUNT(*)
----------
10
Elapsed: 00:00:00.01
sys. ora12c>select count(*) from yangyuhang.t_tab;
COUNT(*)
----------
0
Elapsed: 00:00:00.00
sys. ora12c>