在12.2之前的版本中,PDB的字符集必须和root容器保持一致。很显然这样就限制了PDB的灵活性。这个限制在12.2中被取消,12.2中支持PDB的字符集可以和root容器字符集不同。
1 检查CDB字符集
可以看到CDB字符是AL32UTF8
SQL>COLUMN parameter FORMAT A30
SQL>COLUMN value FORMAT A30
SQL>SELECT *
FROM nls_database_parameters
WHERE parameter = 'NLS_CHARACTERSET';
PARAMETER VALUE
------------------------------ ------------------------------
NLS_CHARACTERSET AL32UTF8
2 创建一个源CDB和PDB
首先,我们必须使用WE8ISO8859P1字符集创建CDB,以便我们有合适的源CDB和PDB。 以下命令将创建一个名为cdb3的CDB,并带有一个名为pdb5的PDB
dbca -silent -createDatabase /
-templateName General_Purpose.dbc /
-gdbname cdb3 -sid cdb3 -responseFile NO_VALUE /
-characterSet WE8ISO8859P1 /
-sysPassword OraPasswd1 /
-systemPassword OraPasswd1 /
-createAsContainerDatabase true /
-numberOfPDBs 1 /
-pdbName pdb5 /
-pdbAdminPassword OraPasswd1 /
-databaseType MULTIPURPOSE /
-automaticMemoryManagement false /
-totalMemory 2048 /
-storageType FS /
-datafileDestination "/u02/app/oracle/oradata/" /
-redoLogFileSize 50 /
-emConfiguration NONE /
-ignorePreReqs
我们使源CDB使用OMF管理方式,并切换到归档模式。
ALTER SYSTEM SET db_create_file_dest = '/u02/app/oracle/oradata';
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
ALTER PLUGGABLE DATABASE pdb5 OPEN;
–保存当前PDB的状态,下次重启自动到这个状态
ALTER PLUGGABLE DATABASE pdb5 SAVE STATE;
3 克隆一个PDB
为了证明PDB可以支持不同的字符集,我们需要克隆一个源PDB出来。就克隆刚刚创建的另一个CDB中的PDB。
3.1 通过dblink来克隆
SQL>CREATE PLUGGABLE DATABASE pdb5new FROM pdb5@clone_link;
3.2 查看当前PDB
SQL>SHOW PDBS
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB5NEW MOUNTED
SQL>
3.3 打开克隆的PDB
SQL>ALTER PLUGGABLE DATABASE pdb5new OPEN;
SQL>SHOW PDBS
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ----------------------------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB5NEW READ WRITE NO
如果克隆有什么问题,可以通过pdb_plug_in_violations视图查看具体信息。
该视图主要是展示了关于CDB和PDB之间不兼容的一些信息。
3.4 验证
可以看到PDB字符集是WE8ISO8859P1,CDB字符集是AL32UTF8。
3.4.1 查看CDB字符集
SQL>COLUMN parameter FORMAT A30
SQL>COLUMN value FORMAT A30
SQL>SELECT *
FROM nls_database_parameters
WHERE parameter = ‘NLS_CHARACTERSET’;
PARAMETER VALUE
NLS_CHARACTERSET AL32UTF8
SQL>
3.4.2 查看PDB字符集
SQL>ALTER SESSION SET CONTAINER=pdb5new;
SQL>COLUMN parameter FORMAT A30
SQL>COLUMN value FORMAT A30
SQL>SELECT *
FROM nls_database_parameters
WHERE parameter = 'NLS_CHARACTERSET';
PARAMETER VALUE
------------------------------ ------------------------------
NLS_CHARACTERSET WE8ISO8859P1