Oracle 12c R2 新特性: Per-PDB Character Sets (同一CDB中PDB可以使用不同的字符集)

后端存储 ANBOB

在oracle12.1版本中,同一CDB中的所有PDB使用的都是相同的字符集从CDB继承而来,这样影响了PDB的迁移灵活性,从12.2起同一CDB中每个PDB可以使用不同的字符集, 如CDB是AL32UTF8,其中的PDB1为WE8ISO8859P1 , PDB2为ZHS16GBK, 从其它CDB plug-in一个JA16EUC字符集的PDB也是允许的,在plug-in PDB的过程中PDB会原封不动的进入目标CDB,过程中并不会转换字符集,并且以后新insert的数据是直接使用的原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

在CDB必须是AL32UTF8时(DBCA 时12.2的默认项),虽然同一个CDB中每个PDB可以使用不同的PDB,但是发现当前版本12.2.0.1对于新创建PDB时并没有办法指定PDB 的字符集,对于已存在的PDB 可以使用hot clone,或Relocate PDB online 方式直接plug-in, 像我之前的笔记[Oracle 12c R2 新特性: Online PDB Relocate (PDB hot move) http://www.anbob.com/archives/2833.html
]中,也是直接把ZHS16GBK 字符集的PDB Plug-in 到了AL32UTF8的CDB中。

如为了以后同一个CDB中的PDB可以使用不同字符集的PDB, 前期规划时建议CDB直接选择AL32UTF8字符集, 但是如果目前想创建一个ZHS16GBK的空PDB时怎么办呢? 目前没有提供创建PDB指定字符集的选项。这种情况下,我目前能想到两种方式。

1, 第一种迁移;创建一个ZHS16GBK 的CDB, 同时自带ZHS16GBK的PDB, 然后通过HOT CLONE PDB或Relocate PDB的方式迁移到另一个AL32UTF8字符集的CDB中。

该操作可以在同一台数据库服务器上创建,因为同一server是可以创建不同的CDB的。具体的方法就不再重复,可以参考ANBOB.com上我之前的clone,relocate的笔记。

2, 第二种转换;可以创建一个AL32UTF8的PDB 然后转换为ZHS16GBK,下面是演示一下。

下面CDB 是AL32UTF8 并且PDBANBOB 也是PDBANBOB。 字符集的可用值可以查询V$NLS_VALID_VALUES 视图, 当前的值可以查询V$NLS_PARAMETERS 视图。

--lang.sql:
col PROPERTY_NAME for a30
col PROPERTY_VALUE for a30
col DESCRIPTION for a30
select * from database_properties where PROPERTY_NAME='NLS_CHARACTERSET';

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDBANBOB                       MOUNTED
         5 PDBTEST2_PROXY                 MOUNTED
         6 PDBWEEJAR                      MOUNTED
SQL> @lang
PROPERTY_NAME                  PROPERTY_VALUE                 DESCRIPTION
------------------------------ ------------------------------ ------------------------------
NLS_CHARACTERSET               AL32UTF8                       Character set

SQL> alter pluggable database PDBANBOB open;
Pluggable database altered.

SQL> alter session set container=pdbanbob;
Session altered.

SQL> @lang
PROPERTY_NAME                  PROPERTY_VALUE                 DESCRIPTION
------------------------------ ------------------------------ ------------------------------
NLS_CHARACTERSET               AL32UTF8                       Character set

SQL> alter database character set ZHS16GBK;
alter database character set ZHS16GBK
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set

SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK
*
ERROR at line 1:
ORA-12719: operation requires database is in RESTRICTED mode


SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
System altered.

SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
Database altered.


SQL> @lang 
PROPERTY_NAME                  PROPERTY_VALUE                 DESCRIPTION
------------------------------ ------------------------------ ------------------------------
NLS_CHARACTERSET               ZHS16GBK                       Character set

已经把pdbanbob 字符集修改成了ZHS16GBK, 同样在12C的版本中推出了Oracle Database Migration Assistant for Unicode(DMU)工具, 如果有兴趣可以去 官方免费下载测

ANBOB稿源:ANBOB (源链) | 关于 | 阅读提示

本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 后端存储 » Oracle 12c R2 新特性: Per-PDB Character Sets (同一CDB中PDB可以使用不同的字符集)

喜欢 (0)or分享给?

专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录