Edited at

Oracle Database:リモート・クローンで文字コード異なるPDBを混在させてみてみた

JA16SJISデータベースから別のAL32UTF8データベースにデータベース・リンクを介してPDBをリモート・クローンしてみてみます。

手順は通常のリモート・クローンと同じで、文字コード異なる複数のPDBを1つのCDBへ混在させることができます。

Oracle Cloud infrastructure(OCI)のDatabase Cloud Serviceでは、表領域暗号化Transparent Data Encryption(TDE)はデフォルトで有効になっています。

ということで、Oracle Database 18cでは、KEYSTORE IDENTIFIED BY句を追加したCREATE PLUGGABLE DATABASE文によって、暗号化データを含むPDBをリモートからクローニングできます。

・Remote Cloning手順概要

1. Target DB :Source DB接続 Database Link設定
2. Target DB :Source PDB クローン実行
3. Target DB :クローンPDB 起動

・リモートクローン要件参考:

 - Advanced Securityガイド:統一モードで、暗号化データを含むPDBのリモート・クローニングを2つのCDB間で実行する

 - グローバリゼーション・サポート・ガイド:PDB候補がCDBルートに直接プラグインされる場合


■構成


■環境事前確認


●環境変数確認

以下が設定されていることを確認

・Target DB:sjis2db

[oracle@sjis2db ~]$ env | grep ORA

ORACLE_UNQNAME=sjis2db
ORACLE_SID=sjis2db
ORACLE_HOME=/u01/app/oracle/product/18.0.0.0/dbhome_1

・Source DB:UTF8PDB

[oracle@utf8db ~]$ env | grep ORA

ORACLE_UNQNAME=UTF8PDB
ORACLE_SID=UTF8PDB
ORACLE_HOME=/u01/app/oracle/product/18.0.0.0/dbhome_1


●Walletパス確認

・Target DB:sjis2db

[oracle@sjis2db admin]$ cat $ORACLE_HOME/network/admin/sqlnet.ora

ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/tde/$ORACLE_UNQNAME)))
・・・

・Source DB:UTF8DB

[oracle@sjis2db ~]$ cat $ORACLE_HOME/network/admin/sqlnet.ora

ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/tde/$ORACLE_UNQNAME)))
・・・


●PDB文字コード確認

・Target DB:sjis2pdb

[oracle@sjis2db ~]$ sqlplus / as sysdba


SQL*Plus: Release 18.0.0.0.0 - Production on Tue Jul 23 09:24:00 2019
Version 18.6.0.0.0

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

Connected to:
Oracle Database 18c EE High Perf Release 18.0.0.0.0 - Production
Version 18.6.0.0.0

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

SQL> SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

VALUE
------------
JA16SJIS

・Source DB:UTF8PDB

[oracle@utf8db ~]$ sqlplus / as sysdba


SQL*Plus: Release 18.0.0.0.0 - Production on Tue Jul 23 09:25:19 2019
Version 18.6.0.0.0

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

Connected to:
Oracle Database 18c EE High Perf Release 18.0.0.0.0 - Production
Version 18.6.0.0.0

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

SQL> SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

VALUE
------------
AL32UTF8


■1. Target DB :Source DB接続用Database Link作成


● Source DB(sjis2db): Database Link接続User作成

[oracle@sjis2db ~]$ sqlplus / as sysdba


SQL> col NAME format a20
SQL> select name, open_mode from v$pdbs;
NAME OPEN_MODE
-------------------- ----------
PDB$SEED READ ONLY
SJIS2PDB READ WRITE

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

SQL> create user remote_user_for_clone identified by <user パスワード>;
User created.

SQL> grant create session,create pluggable database to remote_user_for_clone;
Grant succeeded.


● Target Databse(utf8db):Database Link設定


① Source DBでPDBの接続情報確認

Target DBのtnsnames.oraに設定するSERVICE_NAMEをlsnrctlで確認

[oracle@sjis2db ~]$ lsnrctl stat | grep pdb

Service "sjis2pdb.publicsubnet01.vcnxxxxx.oraclevcn.com" has 1 instance(s).


② tnsnames.ora設定

Target DBのtnsnames.oraにSource PDBの接続情報SJIS2PDBを設定

[oracle@utf8db ~]$ cd $ORACLE_HOME/network/admin

[oracle@utf8db ~]$ vi tnsnames.ora

SJIS2PDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.10)(PORT = 1521)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sjis2pdb.publicsubnet01.vcnxxxxx.oraclevcn.com)
)
)


③ Database link作成

リモート・クローンの場合、DB_DOMAIN異なるので、リモート側のDOMAIN含めた名前で作成

SQL> create database link sjis2pdb.publicsubnet01.vcnxxxxx.oraclevcn.com connect to remote_user_for_clone identified by <Database Linkパスワード> using 'SJIS2PDB_NRT1RK';

Database link created.


④ Database link接続確認

SQL> select * from dual@sjis2pdb.publicsubnet01.vcnxxxxx.oraclevcn.com;

D
-
X


■2. Target DB :Source PDB クローン実行


● リモート・クローン実行

SQL> create pluggable database Clone_SJIS2PDB from SJIS2PDB@sjis2pdb.publicsubnet01.vcnxxxxx.oraclevcn.com KEYSTORE IDENTIFIED BY <Database Linkパスワード>;

Pluggable database created.


● リモート・クローンPDB作成確認

SQL> col NAME format a20

SQL> select name, open_mode from v$pdbs;

NAME OPEN_MODE
-------------------- ----------
PDB$SEED READ ONLY
UTF8PDB READ WRITE
CLONE_SJIS2PDB MOUNTED


■3. Target DB :クローンPDB 起動

SQL>  alter pluggable database CLONE_SJIS2PDB open;


Pluggable database altered.

SQL> select name, open_mode from v$pdbs;

NAME OPEN_MODE
-------------------- ----------
PDB$SEED READ ONLY
UTF8PDB READ WRITE
CLONE_SJIS2PDB READ WRITE


■4.PDB文字コード確認

① CDB$ROOT文字コード確認

SQL> alter session set container=CDB$ROOT;

Session altered.

SQL> SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

VALUE
-------------
AL32UTF8

② UTF8PDB文字コード確認

SQL> alter session set container=UTF8PDB;

Session altered.

SQL> SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
VALUE
-------------
AL32UTF8

③ CLONE_SJIS2PDB文字コード確認

SQL> alter session set container=CLONE_SJIS2PDB;

SQL> SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
VALUE
-------------
JA16SJIS


■参考

・SQL言語リファレンス: CREATE PLUGGABLE DATABASE

・Advanced Securityガイド: 統一モードで、暗号化データを含むPDBのリモート・クローニングを2つのCDB間で実行する

・グローバリゼーション・サポート・ガイド: PDB候補がCDBルートに直接プラグインされる場合