在 12.1 中, PDB 的字符集与 root 容器必须保持一致,这样无形中造成了 PDB 迁移或者克隆的限制性。从 12.2 开始,同一个 cdb 中的各个 PDB 字符集可以不相同。
对于最新版本 12.2.0.1 ,在新创建 PDB 时并没有办法指定 PDB 的字符集,因此只能和 root 容器字符集相同,而不同 PDB 可以使用 hot clone 或 Relocate PDB online 方式直接 plug-in ,还可使用 internal_use 进行转换。
从12.2起引入新特性同一CDB中每个PDB可以使用不同的字符集,前提CDB是AL32UTF8。 如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
-
- 第一种迁移;创建一个ZHS16GBK 的CDB, 同时自带ZHS16GBK的PDB, 然后通过HOT CLONE PDB 或 Relocate PDB的方式迁移到另一个AL32UTF8字符集的CDB中。
该操作可以在同一台数据库服务器上创建,因为同一server是可以创建不同的CDB的。具体的方法就不再重复,可以参考ANBOB.com上我之前的clone,relocate的笔记。
- 第一种迁移;创建一个ZHS16GBK 的CDB, 同时自带ZHS16GBK的PDB, 然后通过HOT CLONE PDB 或 Relocate PDB的方式迁移到另一个AL32UTF8字符集的CDB中。
-
- 第二种转换;可以创建一个AL32UTF8的PDB 然后转换为ZHS16GBK,下面使用了internal_use,这个方法在ORACLE是不太建议的。
下面 CDB 是AL32UTF8 并且 pdb3 也是 AL32UTF8 后来转换为ZHS16GBK。 字符集的可用值可以查询 V$NLS_VALID_VALUES
视图, 当前的值可以查询 V$NLS_PARAMETERS
视图。
RAC Instance:
rac实例修改时和单实例有点不同,需要先停止所有其它instance,修改后再打开一个实例。
操作环境为 Oracle 19.10
alter session set container=cdb$root;
alter pluggable database pdb3 close instances=all;
alter pluggable database pdb3 open read write restricted;
alter session set container=pdb3;
alter database character set internal_use zhs16gbk;
alter pluggable database pdb3 close instances=all;
alter pluggable database pdb3 open instances=all;
alter session set container=pdb3;
SELECT value
FROM nls_database_parameters
WHERE parameter = 'NLS_CHARACTERSET';