在oracle12.1版本中,同一CDB中的所有PDB使用的都是相同的字符集,並且Plug-in時PDB也要和目標CDB相同字符集或者是子集,否則plug-in時會失敗在PDB_PLUG_IN_VIOLATIONS視圖提示,這樣影響了PDB的遷移靈活性,在MOS Note 1968706.1摘錄
從 12.2 開始,同一個 cdb 中的各個 PDB 字符集可以不相同。
Per-PDB Character Set的有幾個前提條件:
1) CDB must be AL32UTF8
2) Application Container requires single character set
3) National character set also supported per PDB
4) Truncation of data can occur in cross-container queries if data conversion to UNICODE causes expansion
對於最新版本 12.2.0.1 ,在新創建 PDB 時並沒有辦法指定 PDB 的字符集,因此只能和 root 容器字符集相同。目前沒有提供創建PDB指定字符集的選項。
可以通過以下方式實現:
a. 而不同 PDB 可以使用 hot clone,
b. Relocate PDB online 方式直接 plug-in
c. 可使用內部轉換字符集( internal_use) 進行轉換
d. 使用12 DMU 工具
下面將對前面種方式進行演示:
A. 熱克隆
a. 目標端數據庫使用dbca創建容器數據庫,默認cdb默認字符集是AL32UTF8,源庫能為任意字符集
b.源環境與目標環境平台有相同的字節序(endianness)
c.源庫和目標庫都為歸檔模式 ; archive log list ;
d.源庫和目標庫都使用LOCAL UNDO ; select * from database_properties where property_name='LOCAL_UNDO_ENABLED';
alter session set container=cdb$root; shu immediate ; startup mount ; alter database archivelog ; #改歸檔 startup upgrade ; alter database local undo on ; #改本地UNDO shu immediate ; startup ;
1.源庫,給SYSTEM 授創建PDB的權限
grant create pluggable database to system ;
2. 目標庫 創建public dblink,連接到源庫,並測試
create public database link cdbgbk_link connect to c##adm identified by cloneadmin using 'cdbgbk'; select sysdate from dual@cdbgbk_link ;
3. 目標庫 修改file_name_convert
alter session set pdb_file_name_convert = '/oracle/app/oradata/cdbgbk/pdbgbk','/oracle/app/oradata/cdbgbk/pdb_gbk' ;
4. 目標庫 通過dblink 克隆PDB,並檢查PDB狀態
CREATE PLUGGABLE DATABASE PDB_GBK FROM PDBGBK@cdbgbk_link; select name ,con_id , open_mode from v$pdbs ;
5 .打開PDB
alter session set container=pdb_gbk ; alter database open ; show con_name ; select value from nls_database_parameters where parameter ='NLS_CHARACTERSET';
B .relocate原理
熱克隆+redo應用
准備條件同熱克隆
克隆時源庫可處於read write狀態
目標庫Create PDB完成,源庫dml事務仍可繼續
目標PDB open時源庫中止會話並同步redo(或歸檔數據)
源端應用undo數據回滾
源庫PDB會話自動切換到目標端
克隆語句使用AVALIABLITY選項nomal|high|max
1.目標庫 修改file_name_convert
alter session set pdb_file_name_convert = '/oracle/app/oradata/cdbgbk/pdbgbk','/oracle/app/oradata/cdbgbk/pdb_gbk' ;
2.relocate,relocate過程中,理論上連接原庫PDBGBK的dml事務並不中斷。
CREATE PLUGGABLE DATABASE PDB_GBK FROM PDBGBK@cdbgbk_link relocate availability max; select pdb_name , status from cdb_pdbs; select con_id,name ,open_mode from v$pdbs ;
3.目標CDB中打開PDB,切換PDB
當目標庫PDBGBK打開,如應用連接配置沒有到目標庫,則直接連接原來源庫的連接會斷開且dml事務直接中斷。如有條件配置應用連接可以嘗試配置並驗證源庫和目標端的記錄條數和目標端。
alter pluggable database PDBGBK open;
C. 使用internal_use:
注:oracle並不建議使用INTERNAL_USE來變更數據庫的字符集
1.切換到要更改的字符集
select name ,con_id ,open_mode from v$pdbs; alter session set contailner=pdbutf ; select value from nls_database_parameters where parameter='NLS_CHARACTERSET' ;
2.需要變更為限制會話模式再進行修改:
alter system enable restricted session ;
3.更秘訣字符集
alter database character set INTERNAL_USE ZHS16GBK ; select value from nls_database_parameters where parameter='NLS_CHARACTERSET' ; alter system disable restricted session ;
C2 .RAC 環境:
alter pluggable databse pdbanbob close instances=all; alter pluggable database pdbanbob open read write restricted; -- in container pdbanbob alter database character set internal_use zhs16gbk; alter pluggable databse pdbanbob close; alter pluggable database pdbanbob open instances=all;
參考:
https://mp.weixin.qq.com/s/XnS6TymaA9Q2XyFBgAfMCg
如何選擇或更改數據庫字符集 (NLS_CHARACTERSET) (文檔 ID 1525394.1)
12c多租戶容器數據庫(CDB)和可插拔數據庫(PDB)字符集限制/ ORA-65116/65119:不兼容的數據庫/國家字符集(字符集不匹配:PDB字符集CDB字符集)(文檔ID 1968706.1)
