LoginSignup
1
2

More than 1 year has passed since last update.

[OCI]Oracle Database CloudでCDB内にキャラクタセットの異なるPDBが混在する環境を作ってみた

Last updated at Posted at 2021-06-04

はじめに

キャラクタセットが「AL32UTF8」であるCDBに、キャラクタセットが「AL32UTF8」のPDBと「JA16SJIS」のPDBを混在させたいというお話があったので、キャラクタセットが「AL32UTF8」のDBCSインスタンスと「JA16SJIS」のDBCSインスタンスを用意して、PDBの再配置によって実現する手順を検証してみました。

<ソース側DB>
DBCSインスタンス作成時のキャラクタセット:JA16SJIS
DB名;SJISDB
PDB名:SJISPDB
ホスト:sjisdb.subnet1.vcn1.oraclevcn.com
<ターゲット側DB>
DBCSインスタンス作成時のキャラクタセット:AL32UTF8
DB名;UTF8DB
PDB名:UTF8PDB
ホスト:utf8db.subnet1.vcn1.oraclevcn.com

なお、CDBルートに直接プラグインされる場合、CDBのキャラクタセットはPDBのキャラクタセットと同じ、またはスーパーセットである必要があります。
CDBのキャラクタセットがAL32UTF8である場合、PDBのデータベース・キャラクタ・セットに関係なく、プラグイン操作は成功します。

1.ソース(PDBの移動元)側DBでの作業

SYSDBAとしてDBに接続します。

[oracle@sjisdb ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 4 20:52:11 2021
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

CDBのキャラクタセットを確認します。

SQL> col parameter for a20
SQL> col value for a30
SQL> SELECT parameter, value FROM v$nls_parameters WHERE parameter='NLS_CHARACTERSET';

PARAMETER	     VALUE
-------------------- ------------------------------
NLS_CHARACTERSET     JA16SJIS

JA16SJISであることがわかりました。

PDBの一覧を確認します。

SQL> col name for a20
SQL> SELECT dbid, name,open_mode FROM v$pdbs;

      DBID NAME 		OPEN_MODE
---------- -------------------- ----------
3128296700 PDB$SEED		READ ONLY
2198425545 SJISPDB		READ WRITE

「SJISPDB」という名前のPDBが存在することが確認できました。

PDB「SJISPDB」に接続します。

SQL> ALTER SESSION SET CONTAINER = sjispdb;

Session altered.

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
SJISPDB

「SJISPDB」に接続していることが確認できました。

PDB「SJISPDB」のキャラクタセットを確認します。

SQL> SELECT parameter, value FROM v$nls_parameters WHERE parameter='NLS_CHARACTERSET';

PARAMETER	     VALUE
-------------------- ------------------------------
NLS_CHARACTERSET     JA16SJIS

PDB「SJISPDB」のキャラクタセットが「JA16SJIS」であることが確認できました。

CDBルートに接続します。

SQL> ALTER SESSION SET CONTAINER = cdb$root;

Session altered.

接続先の確認を確認します。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

CDBルートに接続していることが確認できました。

PDB再配置用ユーザを作成します。

SQL> 
SQL> CREATE USER c##remote_clone_user IDENTIFIED BY Demo#1Demo#1 CONTAINER=ALL;

User created.

PDB再配置用ユーザに必要な権限を付与します。

SQL> GRANT CREATE SESSION, SYSOPER, CREATE PLUGGABLE DATABASE TO c##remote_clone_user CONTAINER=ALL;

Grant succeeded.

以上でソース側DBの作業は完了です。

2.ターゲット(PDBの移動先)側DBでの作業

tnsnames.oraにSJSIDBに接続するための接続エイリアスを追加します。

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_UTF8DB =
  (ADDRESS = (PROTOCOL = TCP)(HOST = utf8db)(PORT = 1521))


UTF8DB_NRT177 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = utf8db)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = UTF8DB_nrt177.subnet1.vcn1.oraclevcn.com)
    )
  )

## SJISDBへの接続エイリアス
SJISDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = sjisdb.subnet1.vcn1.oraclevcn.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = SJISDB_nrt1sr.subnet1.vcn1.oraclevcn.com)
    )
  )

SJISDBへの接続エイリアスが正しく設定できているかを確認します。

[oracle@utf8db ~]$ sqlplus system/Demo#1Demo#1@sjisdb

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 4 21:05:01 2021
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Last Successful login time: Fri Jun 04 2021 20:28:45 +09:00

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

SQL> exit

SYSDBAとしてUTF8DBに接続します。

oracle@utf8db ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 4 21:06:44 2021
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

SQL> 

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

CDBルートに接続していることが確認できました。

CDBのキャラクタセットを確認します。

SQL> col parameter for a20
SQL> col value for a30
SQL> SELECT parameter, value FROM v$nls_parameters WHERE parameter='NLS_CHARACTERSET';

PARAMETER	     VALUE
-------------------- ------------------------------
NLS_CHARACTERSET     AL32UTF8

CDBのキャラクタセットが「AL32UTF8」であることが確認できました。

既存のPDBを確認します。

SQL> col name for a20
SQL> SELECT dbid,name, open_mode FROM v$pdbs;

      DBID NAME 		OPEN_MODE
---------- -------------------- ----------
1100021415 PDB$SEED		READ ONLY
1195479388 UTF8PDB		READ WRITE

CDB「UTF8PDB」が存在することが確認できました。

PDB「UTF8PDB」に接続します。

SQL> ALTER SESSION SET CONTAINER = utf8pdb;

Session altered.

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
UTF8PDB

PDB「UTF8PDB」に接続していることが確認できました。

PDB「UTF8PDB」のキャラクタセットを確認します。

SQL> SELECT parameter, value FROM v$nls_parameters WHERE parameter='NLS_CHARACTERSET';

PARAMETER	     VALUE
-------------------- ------------------------------
NLS_CHARACTERSET     AL32UTF8

PDB「UTF8PDB」のキャラクタセットが「AL32UTF8」であることが確認できました。

CDBルートに接続します。

SQL> ALTER SESSION SET CONTAINER = cdb$root;

Session altered.

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

CDBルートに接続していることが確認できました。

CDB上でSJISDBへのデータベース・リンク「SJISDB」を作成します。

SQL> CREATE PUBLIC DATABASE LINK sjisdb CONNECT TO c##remote_clone_user IDENTIFIED BY Demo#1Demo#1 USING 'SJISDB';

Database link created.

作成したデータベース・リンクを使用して、CDB「SJISDB」上のPDB「SJISPDB」をCDB「UTF8DB」上に再配置します。
DBCS上のデータベースは暗号化されているので、"keystore identified by"句で暗号化パスワード(DBCSの場合、デフォルトでは管理者パスワードと同じ)を指定します。

SQL> CREATE PLUGGABLE DATABASE sjispdb FROM sjispdb@sjisdb RELOCATE AVAILABILITY MAX keystore identified by Demo#1Demo#1;

Pluggable database created.

再配置したPDBのオープンモードを確認します。

SQL> SELECT dbid,name, open_mode FROM v$pdbs;

      DBID NAME 		OPEN_MODE
---------- ------------ ----------
1100021415 PDB$SEED		READ ONLY
1195479388 UTF8PDB		READ WRITE
2198425545 SJISPDB		MOUNTED

再配置したPDB「SJISPDB」はマウント・モードであることがわかります。

PDB「SJISPDB」をオープンします。
再配置されたPDBをオープンすると、ソース側のPDBはクローズされます。

SQL> ALTER PLUGGABLE DATABASE sjispdb OPEN;

Pluggable database altered.

PDBのオープンモードを再度確認します。

SQL> SELECT dbid,name, open_mode FROM v$pdbs;

      DBID NAME 		OPEN_MODE
---------- ------------ ----------
1100021415 PDB$SEED		READ ONLY
1195479388 UTF8PDB		READ WRITE
2198425545 SJISPDB		READ WRITE

PDB「SJISPDB」はオープン・モードになったことがわかります。

PDB「SJISPDB」に接続します。

SQL> ALTER SESSION SET CONTAINER = sjispdb;

Session altered.

SJISPDBのキャラクタセットを確認します。

SQL> SELECT parameter, value FROM v$nls_parameters WHERE parameter='NLS_CHARACTERSET';

PARAMETER	       VALUE
----------------   ------------------------------
NLS_CHARACTERSET   JA16SJIS

再配置したPDB「SJISPDB」のキャラクタセットは「JA16SJIS」で、ソースPDBのキャラクタセットを維持していることが確認できました。

CDBルートに接続します。

SQL> ALTER SESSION SET CONTAINER = cdb$root;

Session altered.

接続先を確認します。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

CDBルートに接続していることが確認できました。

CDBのキャラクタセットを確認します。

SQL> SELECT parameter, value FROM v$nls_parameters WHERE parameter='NLS_CHARACTERSET';

PARAMETER	     VALUE
-------------------- ------------------------------
NLS_CHARACTERSET     AL32UTF8

CDBのキャラクタセットが「AL32UTF8」であることが確認できました。

キャラクタセットが「AL32UTF8」であるCDB内にキャラクタセットが「JA16SJIS」をPDBを配置することができました。

3.ソース側に残ったツームストンPDBの削除

PDBを再配置すると、ソース側のPDBはツームストンPDBとして残ったままとなるため、これを削除します。

[oracle@sjisdb ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 4 21:48:10 2021
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

PDBのオープンモードを再度確認します。

SQL> col name for a20
SQL> SELECT dbid, name,open_mode FROM v$pdbs;

      DBID NAME 		OPEN_MODE
---------- -------------------- ----------
3128296700 PDB$SEED		READ ONLY
2198425545 SJISPDB		MOUNTED

PDB「SJISPDB」がオープンできるか試してみます。

SQL> ALTER PLUGGABLE DATABASE sjispdb OPEN;
ALTER PLUGGABLE DATABASE sjispdb OPEN
*
ERROR at line 1:
ORA-65086: cannot open/close the pluggable database

再配置済みのため、オープンできませんでした。

ツームストンPDB「SJISPDB」をデータファイルごと削除します。

SQL> DROP PLUGGABLE DATABASE sjispdb INCLUDING DATAFILES;

Pluggable database dropped.

ツームストンPDB「SJISPDB」が削除されたか確認します。

SQL> SELECT dbid, name,open_mode FROM v$pdbs;

      DBID NAME 		OPEN_MODE
---------- ------------ ----------
3128296700 PDB$SEED		READ ONLY

ツームストンPDB「SJISPDB」が削除されたことが確認できました。

以上で文字コードの異なるCDB間でのPDBの再配置ができることが確認できました。

参考情報

Oracle Database 19c 管理者ガイド:PDBの再配置
Oracle Database 19c Databaseグローバリゼーション・サポート・ガイド:マルチテナント・コンテナ・データベースのデータベース文字セットの選択

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2