Oracle Database 11gR2(11.2.0.4)から12cR2(12.2.0.1)のPDBにTTS(トランスポータブル表領域)をしてみる。

表題の通り、Oracle Database 11gR2(11.2.0.4)から12cR2(12.2.0.1)の
PDBにTTS(トランスポータブル表領域)を実行してみるやで彡(ﾟ)(ﾟ)

プラットフォームはどちらも Linux x86 64bitで試します。
特別な手順は必要なくマニュアル通りに粛々と実施するだけです。
 
 > Oracle Database管理者ガイド 11gリリース2 (11.2) B56301-08
 > データベース間で表領域をトランスポートする手順および例
 > https://docs.oracle.com/cd/E16338_01/server.112/b56301/tspaces.htm#i1007252
 > 
 > Oracle Database データベース管理者ガイド 12c リリース2 (12.2)
 > 15.1.2.2 トランスポータブル表領域またはトランスポータブル表の使用例
 > https://docs.oracle.com/cd/E82638_01/admin/transporting-data.html#GUID-5158E6EB-591A-4DF0-9A44-BAF1E10338A8

# 0. 移行対象の表／表領域

移行対象は以下の表(TBL_TEST_TTS1,TBL_TEST_TTS2)／表領域(TBS_TTS1,TBS_TTS2)とします。

```sql
-- 11gR2
COLUMN OWNER FORMAT A20;
COLUMN SEGMENT_NAME FORMAT A20;
COLUMN BYTES FORMAT 999,999,999;
COLUMN TABLESPACE_NAME FORMAT A20;
SELECT OWNER, SEGMENT_NAME, BYTES, TABLESPACE_NAME FROM DBA_SEGMENTS WHERE TABLESPACE_NAME IN ('TBS_TTS1', 'TBS_TTS2');

OWNER                SEGMENT_NAME                BYTES TABLESPACE_NAME
-------------------- -------------------- ------------ --------------------
AYSHIBAT             TBL_TEST_TTS1             196,608 TBS_TTS1
AYSHIBAT             TBL_TEST_TTS2             196,608 TBS_TTS2
```

# 1. 移行元／移行先のエンディアンを確認

まず移行元／移行先のエンディアンを確認します。今回はどちらも同じエンディアン彡(ﾟ)(ﾟ)

```sql
-- 移行元(11gR2)のエンディアン
COLUMN PLATFORM_NAME FORMAT A30;
COLUMN ENDIAN_FORMAT FORMAT A30;
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
     FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
     WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

PLATFORM_NAME                  ENDIAN_FORMAT
------------------------------ ------------------------------
Linux x86 64-bit               Little

-- 移行先(12cR2)のエンディアン
COLUMN PLATFORM_NAME FORMAT A30;
COLUMN ENDIAN_FORMAT FORMAT A30;
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
     FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
     WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

PLATFORM_NAME                  ENDIAN_FORMAT
------------------------------ ------------------------------
Linux x86 64-bit               Little
```

# 2. 表領域が自己完結しているかを確認

下記のコマンドで表領域が自己完結しているかを確認します。
TRANSPORT_SET_VIOLATIONSで行が出なければ、自己完結しています。

```sql
-- 11gR2
EXECUTE SYS.DBMS_TTS.TRANSPORT_SET_CHECK('TBS_TTS1, TBS_TTS2', TRUE);

SELECT * FROM SYS.TRANSPORT_SET_VIOLATIONS;

PL/SQL procedure successfully completed.

no rows selected
```

# 3. 移行対象の表領域を READ ONLY にします。

下記のコマンドで移行対象の表領域を READ ONLY にします。

```sql
-- 11gR2
ALTER TABLESPACE TBS_TTS1 READ ONLY;
ALTER TABLESPACE TBS_TTS2 READ ONLY;

Tablespace altered.
Tablespace altered.
```

# 4. 表領域の定義情報をエクスポート(expdp)

expdpコマンドで表領域の定義情報をエクスポートします。
定義情報だけのエクスポートなので、時間はそれほど掛かりません。

```shell
# 11gR2
expdp AYSHIBAT/xxxxxxxx@orcl dumpfile=tts_users.dmp directory=DIR_AYSHIBAT transport_tablespaces=TBS_TTS1,TBS_TTS2 logfile=exp_tts_users.log

Export: Release 11.2.0.4.0 - Production on Tue Jun 26 18:49:44 2018

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
Starting "AYSHIBAT"."SYS_EXPORT_TRANSPORTABLE_01":  AYSHIBAT/********@orcl dumpfile=tts_users.dmp directory=DIR_AYSHIBAT transport_tablespaces=TBS_TTS1,TBS_TTS2 logfile=exp_tts_users.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Master table "AYSHIBAT"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for AYSHIBAT.SYS_EXPORT_TRANSPORTABLE_01 is:
  /home/oracle/work/ayshibat/tts_users.dmp
******************************************************************************
Datafiles required for transportable tablespace TBS_TTS1:
  +DATA/orcl/datafile/tbs_tts1.266.979841605
Datafiles required for transportable tablespace TBS_TTS2:
  +DATA/orcl/datafile/tbs_tts2.267.979841605
Job "AYSHIBAT"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at Tue Jun 26 18:50:53 2018 elapsed 0 00:01:06
```

# 5. dmpファイルとデータファイルの転送(コピー)

dmpファイルとデータファイルを移行先(12cR2)に転送(コピー)します。
データファイルの転送にはcpコマンド/DBMS_FILE_TRANSFER/RMAN等々の手段が有りますが、
今回は 11gR2のASM ⇒ asmcmdでファイルシステムに出力 ⇒ scpで転送 ⇒ 12cR2のファイルシステム とします。

```shell
# 11gR2
asmcmd
cd +DATA/ORCL/DATAFILE
ls -l

Type      Redund  Striped  Time             Sys  Name
DATAFILE  MIRROR  COARSE   JUN 26 18:00:00  Y    SYSAUX.257.836897651
DATAFILE  MIRROR  COARSE   JUN 26 18:00:00  Y    SYSTEM.256.836897649
DATAFILE  MIRROR  COARSE   JUN 26 18:00:00  Y    TBS_TTS1.266.979841605
DATAFILE  MIRROR  COARSE   JUN 26 18:00:00  Y    TBS_TTS2.267.979841605
DATAFILE  MIRROR  COARSE   JUN 26 18:00:00  Y    UNDOTBS1.258.836897653
DATAFILE  MIRROR  COARSE   JUN 26 18:00:00  Y    USERS.259.836897653

cp '+DATA/ORCL/DATAFILE/TBS_TTS1.266.979841605' '/home/grid/work/ayshibat/TBS_TTS1.266.979841605'
cp '+DATA/ORCL/DATAFILE/TBS_TTS2.267.979841605' '/home/grid/work/ayshibat/TBS_TTS2.267.979841605'

copying +DATA/ORCL/DATAFILE/TBS_TTS1.266.979841605 -> /home/grid/work/ayshibat/TBS_TTS1.266.979841605
copying +DATA/ORCL/DATAFILE/TBS_TTS2.267.979841605 -> /home/grid/work/ayshibat/TBS_TTS2.267.979841605

↓

【scpでdmpファイルとデータファイルを転送(コピー)】

↓
# 12cR2
cd /u01/app/oracle/oradata/AYUCDB/6C4B2D3386C20FB8E055000000000001/datafile/
ls -la
-rw-r--r--. 1 oracle oinstall  10493952 Jun 26 18:55 TBS_TTS1.266.979841605 ★scpで転送(コピー)したデータファイル
-rw-r--r--. 1 oracle oinstall  10493952 Jun 26 18:56 TBS_TTS2.267.979841605 ★scpで転送(コピー)したデータファイル
-rw-r-----. 1 oracle oinstall 398467072 Jun 26 18:35 o1_mf_sysaux_fhq8s86l_.dbf
-rw-r-----. 1 oracle oinstall 272637952 Jun 26 18:57 o1_mf_system_fhq8s865_.dbf
:
cd /home/oracle/work/ayshibat
ls -la tts_users.dmp
-rw-r--r--. 1 oracle oinstall 94208 Jun 26 18:50 tts_users.dmp ★scpで転送(コピー)したdmpファイル
```

# 6. PDBに表領域の定義情報をインポート(impdp)

impdpコマンドで表領域の定義情報をインポートします。
やはり定義情報だけのインポートなので、時間はそれほど掛かりません。

```shell
# 12cR2
impdp AYSHIBAT/xxxxxxxx@PDB01 dumpfile=tts_users.dmp directory=DIR_AYSHIBAT \
transport_datafiles=\
'/u01/app/oracle/oradata/AYUCDB/6C4B2D3386C20FB8E055000000000001/datafile/TBS_TTS1.266.979841605',\
'/u01/app/oracle/oradata/AYUCDB/6C4B2D3386C20FB8E055000000000001/datafile/TBS_TTS2.267.979841605' \
logfile=imp_tts_users.log

Import: Release 12.2.0.1.0 - Production on Tue Jun 26 19:10:48 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Master table "AYSHIBAT"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded
Starting "AYSHIBAT"."SYS_IMPORT_TRANSPORTABLE_01":  AYSHIBAT/********@PDB01 dumpfile=tts_users.dmp directory=DIR_AYSHIBAT transport_datafiles=/u01/app/oracle/oradata/AYUCDB/6C4B2D3386C20FB8E055000000000001/datafile/TBS_TTS1.266.979841605,/u01/app/oracle/oradata/AYUCDB/6C4B2D3386C20FB8E055000000000001/datafile/TBS_TTS2.267.979841605 logfile=imp_tts_users.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Job "AYSHIBAT"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at Tue Jun 26 19:11:05 2018 elapsed 0 00:00:13
```

# 7. PDBに接続してデータを確認

PDBに接続してデータを確認します。見事にデータが転送されています。やったぜ彡(^)(^)

```sql
-- 12cR2
sqlplus /nolog
CONNECT AYSHIBAT/xxxxxxxx@PDB01
SHOW CON_NAME;
COLUMN OWNER FORMAT A20;
COLUMN SEGMENT_NAME FORMAT A20;
COLUMN BYTES FORMAT 999,999,999;
COLUMN TABLESPACE_NAME FORMAT A20;
SELECT OWNER, SEGMENT_NAME, BYTES, TABLESPACE_NAME FROM DBA_SEGMENTS WHERE TABLESPACE_NAME IN ('TBS_TTS1', 'TBS_TTS2');
SELECT COUNT(*) FROM TBL_TEST_TTS1;
SELECT COUNT(*) FROM TBL_TEST_TTS2;

SQL*Plus: Release 12.2.0.1.0 Production on Tue Jun 26 19:14:27 2018

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

Connected.

CON_NAME
------------------------------
PDB01

OWNER                SEGMENT_NAME                BYTES TABLESPACE_NAME
-------------------- -------------------- ------------ --------------------
AYSHIBAT             TBL_TEST_TTS2             196,608 TBS_TTS2
AYSHIBAT             TBL_TEST_TTS1             196,608 TBS_TTS1

  COUNT(*)
----------
     10000

  COUNT(*)
----------
     10000
```

# 8. 表領域の READ ONLY状態を解除

表領域のREAD ONLY状態を解除します。ちな移行元(今回は11gR2)のREAD ONLY解除は、
データファイル書き出しが終わった時点で実施してOKですやで彡(ﾟ)(ﾟ)

```sql
-- 11gR2
SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME IN ('TBS_TTS1', 'TBS_TTS2');
ALTER TABLESPACE TBS_TTS1 READ WRITE;
ALTER TABLESPACE TBS_TTS2 READ WRITE;
SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME IN ('TBS_TTS1', 'TBS_TTS2');

TABLESPACE_NAME                STATUS
------------------------------ ---------
TBS_TTS1                       READ ONLY
TBS_TTS2                       READ ONLY

Tablespace altered.
Tablespace altered.

TABLESPACE_NAME                STATUS
------------------------------ ---------
TBS_TTS1                       ONLINE
TBS_TTS2                       ONLINE

-- 12cR2
SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME IN ('TBS_TTS1', 'TBS_TTS2');
ALTER TABLESPACE TBS_TTS1 READ WRITE;
ALTER TABLESPACE TBS_TTS2 READ WRITE;
SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME IN ('TBS_TTS1', 'TBS_TTS2');

TABLESPACE_NAME                STATUS
------------------------------ ---------
TBS_TTS1                       READ ONLY
TBS_TTS2                       READ ONLY

Tablespace altered.
Tablespace altered.

TABLESPACE_NAME                STATUS
------------------------------ ---------
TBS_TTS1                       ONLINE
TBS_TTS2                       ONLINE
```

# 9. まとめ

特別な手順は無く、11gR2 ⇒ 12cR2(PDB) の
TTS(トランスポータブル表領域)が実行できました彡(^)(^)

リアルな環境を考慮すると、5. のデータファイル転送(コピー)のところで
最も時間が掛かるのですが、一旦中間ファイルに書き出す今回のやり方よりも、
中間ファイルを介さずに直接転送する方法も有るようなので、
詰める余地が有りますやね彡(ﾟ)(ﾟ)

# ※2018/6/27追記
 「5. dmpファイルとデータファイルの転送(コピー)」の
データファイル転送部分はDBMS_FILE_TRANSFERパッケージでも行けました。
ファイルシステム(中間ファイル)を介さないので理論上速い。
下記記事参照彡(ﾟ)(ﾟ)

 > DBMS_FILE_TRANSFERパッケージでDB(11gR2) -> DBLINK -> PDB(12cR2)のデータファイルの転送(コピー)を実行する。(Oracle Database)
 > https://qiita.com/ora_gonsuke777/items/94cf4572cdad942f8d52