RMANでトランスポータブル表領域を抽出し、SQLスクリプトでインポートする実践手順

Datapump

~Data Pumpを使わず、自動生成スクリプトでスマートに移行する~

Oracleのトランスポータブル表領域(TTS)は大量データ移行の最適解ですが、実はData Pump(impdp)を使わずにインポートする方法があるのをご存知でしょうか。

RMANの TRANSPORT TABLESPACE コマンドを使用すると、メタデータをインポートするためのSQLスクリプト(impscrpt.sql)が自動生成されます。これを利用すれば、表領域を READ ONLY にすることなく、過去の特定時点(UNTIL TIME)の状態をSQLベースで取り込むことが可能です。

Data Pumpトランスポータブル表領域 実行手順をわかりやすく解説!
前回の記事では、Data PumpとRMANによるトランスポータブル表領域の違いについて解説しました。今回は、実際にData Pumpを使って表領域を移行する手順を詳しく紹介していきます。トランスポータブル表領域の流れをマスターすることで、…

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


✅ この手法のメリット

項目内容
運用の柔軟性表領域を READ ONLY にする必要がない(RMANが補助インスタンスで処理するため)
Data Pump不要RMANが生成した impscrpt.sql を SQL*Plus から実行するだけで完了
特定時点の復元UNTIL TIME 指定により、昨日の時点、パッチ適用前の時点などを抽出可能
自動変換クロスプラットフォーム移行時、RMANがエンディアン変換を代行する

🛠 実行手順の流れ

  1. RMANで抽出: データファイルとインポート用SQLスクリプトを生成
  2. ファイル転送: 生成されたファイルを移行先サーバへコピー
  3. SQL実行: impscrpt.sql を実行して表領域をアタッチ

Step 1:RMANによるトランスポータブル表領域の出力

まず、RMANを使用して抽出作業を行います。ここでは UNTIL TIME を使い、1分前の状態を抽出する例を記載します。

rman target /

RMAN> TRANSPORT TABLESPACE test_tbs
      TABLESPACE DESTINATION '/backup/tbs_transport'
      AUXILIARY DESTINATION '/backup/aux'
      DATAPUMP DIRECTORY dpump_dir
      DUMP FILE 'test_tbs_meta.dmp'
      EXPORT LOG 'rman_test_tbs.log'
      UNTIL TIME 'SYSDATE-1/1440';

このコマンドにより、/backup/tbs_transport に以下のファイルが出力されます。

  • test_tbs.dbf(データファイル)
  • test_tbs_meta.dmp(メタデータ・ダンプ ※スクリプト内部で使用)
  • impscrpt.sql(今回の主役:インポート用SQLスクリプト)
  • rman_test_tbs.log(エクスポート時のログ)
RMAN> SELECT tablespace_name,status FROM dba_tablespaces;

TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS ONLINE
TEST_TBS ONLINE

RMAN> TRANSPORT TABLESPACE test_tbs
2> TABLESPACE DESTINATION '/backup/tbs_transport'
3> AUXILIARY DESTINATION '/backup/aux'
4> DATAPUMP DIRECTORY dpump_dir
5> DUMP FILE 'test_tbs_meta.dmp'
6> EXPORT LOG 'rman_test_tbs.log'
7> UNTIL TIME 'SYSDATE-1/1440';

現在のログがアーカイブされました。
RMAN-05026: 警告: 次の表領域のセットは、指定したPoint-in-Timeへの適用が想定されています

UNDOセグメントがあると予測される表領域のリスト
表領域SYSTEM
表領域UNDOTBS1

自動インスタンスを作成しています(SID='cBsr')

自動インスタンスに使用される初期化パラメータ:
db_name=V19
db_unique_name=cBsr_pitr_V19
compatible=19.0.0
db_block_size=8192
db_files=200
diagnostic_dest=/u01/app/oracle
_pdb_name_case_sensitive=false
_system_trig_enabled=FALSE
sga_target=1472M
processes=200
db_create_file_dest=/backup/aux
log_archive_dest_1='location=/backup/aux'
#No auxiliary parameter file used


自動インスタンスV19を起動しています

Oracleインスタンスが起動しました

システム・グローバル領域の合計は、 1543500120バイトです。

Fixed Size 8925528バイト
Variable Size 369098752バイト
Database Buffers 1157627904バイト
Redo Buffers 7847936バイト
自動インスタンスが作成されました
リカバリ・セット表領域で TRANSPORT_SET_CHECKの実行中
TRANSPORT_SET_CHECKは正常に終了しました

メモリー・スクリプトの内容:
{
# set requested point in time
set until time "SYSDATE-1/1440";
# restore the controlfile
restore clone controlfile;

# mount the controlfile
sql clone 'alter database mount clone database';

# archive current online log
sql 'alter system archive log current';
}
メモリー・スクリプトを実行しています

実行コマンド: SET until clause

restoreを25-03-29で開始しています
チャネル: ORA_AUX_DISK_1が割り当てられました
チャネルORA_AUX_DISK_1: SID=37 デバイス・タイプ=DISK

チャネルORA_AUX_DISK_1: データファイル・バックアップ・セットのリストアを開始しています
チャネルORA_AUX_DISK_1: 制御ファイルをリストア中です
チャネルORA_AUX_DISK_1: バックアップ・ピース/u01/app/oracle/product/19.0.0/dbhome_1/dbs/c-2957249400-20250329-01から読取り中です
チャネルORA_AUX_DISK_1: ピース・ハンドル=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/c-2957249400-20250329-01 タグ=TAG20250329T203629
チャネルORA_AUX_DISK_1: バックアップ・ピース1がリストアされました
チャネルORA_AUX_DISK_1: リストアが完了しました。経過時間: 00:00:01
出力ファイル名=/backup/aux/V19/controlfile/o1_mf_myhq1fof_.ctl
restoreを25-03-29で終了しました

SQL文: alter database mount clone database

SQL文: alter system archive log current

メモリー・スクリプトの内容:
{
# set requested point in time
set until time "SYSDATE-1/1440";
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile 1 to new;
set newname for clone datafile 4 to new;
set newname for clone datafile 3 to new;
set newname for clone tempfile 1 to new;
set newname for datafile 5 to
"/backup/tbs_transport/test_tbs.dbf";
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 1, 4, 3, 5;

switch clone datafile all;
}
メモリー・スクリプトを実行しています

実行コマンド: SET until clause

実行コマンド: SET NEWNAME

実行コマンド: SET NEWNAME

実行コマンド: SET NEWNAME

実行コマンド: SET NEWNAME

実行コマンド: SET NEWNAME

制御ファイルで一時ファイル1の名前を/backup/aux/V19/datafile/o1_mf_temp_%u_.tmpに変更しました

restoreを25-03-29で開始しています
チャネルORA_AUX_DISK_1の使用

チャネルORA_AUX_DISK_1: データファイル・バックアップ・セットのリストアを開始しています
チャネルORA_AUX_DISK_1: バックアップ・セットからリストアするデータファイルを指定しています
チャネルORA_AUX_DISK_1: データファイル00001を/backup/aux/V19/datafile/o1_mf_system_%u_.dbfにリストアしています
チャネルORA_AUX_DISK_1: データファイル00004を/backup/aux/V19/datafile/o1_mf_undotbs1_%u_.dbfにリストアしています
チャネルORA_AUX_DISK_1: データファイル00003を/backup/aux/V19/datafile/o1_mf_sysaux_%u_.dbfにリストアしています
チャネルORA_AUX_DISK_1: データファイル00005を/backup/tbs_transport/test_tbs.dbfにリストアしています
チャネルORA_AUX_DISK_1: バックアップ・ピース/u01/app/oracle/product/19.0.0/dbhome_1/dbs/023ljblu_2_1_1から読取り中です
チャネルORA_AUX_DISK_1: ピース・ハンドル=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/023ljblu_2_1_1 タグ=TAG20250329T203614
チャネルORA_AUX_DISK_1: バックアップ・ピース1がリストアされました
チャネルORA_AUX_DISK_1: リストアが完了しました。経過時間: 00:00:15
restoreを25-03-29で終了しました

データファイル1はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=5 スタンプ=1197060050 ファイル名=/backup/aux/V19/datafile/o1_mf_system_myhq1mq9_.dbf
データファイル4はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=6 スタンプ=1197060050 ファイル名=/backup/aux/V19/datafile/o1_mf_undotbs1_myhq1mqq_.dbf
データファイル3はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=7 スタンプ=1197060050 ファイル名=/backup/aux/V19/datafile/o1_mf_sysaux_myhq1mql_.dbf
データファイル5はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=8 スタンプ=1197060050 ファイル名=/backup/tbs_transport/test_tbs.dbf

メモリー・スクリプトの内容:
{
# set requested point in time
set until time "SYSDATE-1/1440";
# online the datafiles restored or switched
sql clone "alter database datafile 1 online";
sql clone "alter database datafile 4 online";
sql clone "alter database datafile 3 online";
sql clone "alter database datafile 5 online";
# recover and open resetlogs
recover clone database tablespace "TEST_TBS", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
メモリー・スクリプトを実行しています

実行コマンド: SET until clause

SQL文: alter database datafile 1 online

SQL文: alter database datafile 4 online

SQL文: alter database datafile 3 online

SQL文: alter database datafile 5 online

recoverを25-03-29で開始しています
チャネルORA_AUX_DISK_1の使用

実行中: alter database datafile 7 offline
メディア・リカバリを開始しています

スレッド1 (順序14)のアーカイブ・ログは、ファイル/u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch1_14_1153872185.dbfとしてディスクにすでに存在します
アーカイブ・ログ・ファイル名=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch1_14_1153872185.dbf スレッド=1 順序=14
メディア・リカバリが完了しました。経過時間: 00:00:01
recoverを25-03-29で終了しました

データベースがオープンしました。

メモリー・スクリプトの内容:
{
# make read only the tablespace that will be exported
sql clone 'alter tablespace TEST_TBS read only';
}
メモリー・スクリプトを実行しています

SQL文: alter tablespace TEST_TBS read only

メタデータのエクスポートを実行しています...
EXPDP> "SYS"."TSPITR_EXP_cBsr_aDxa"を起動しています:
EXPDP> オブジェクト型TRANSPORTABLE_EXPORT/PLUGTS_BLKの処理中です
EXPDP> オブジェクト型TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLKの処理中です
EXPDP> マスター表"SYS"."TSPITR_EXP_cBsr_aDxa"は正常にロード/アンロードされました
EXPDP> ******************************************************************************
EXPDP> SYS.TSPITR_EXP_cBsr_aDxaに設定されたダンプ・ファイルは次のとおりです:
EXPDP> /u01/app/oracle/dpump/test_tbs_meta.dmp
EXPDP> ******************************************************************************
EXPDP> トランスポータブル表領域TEST_TBSにはデータファイルが必要です:
EXPDP> /backup/tbs_transport/test_tbs.dbf
EXPDP> ジョブ"SYS"."TSPITR_EXP_cBsr_aDxa"が土 3月 29 20:41:35 2025 elapsed 0 00:00:30で正常に完了しました
エクスポートが完了しました

Point-in-Timeリカバリ後に表のインポートを実行していません
/*
The following command may be used to import the tablespaces.
Substitute values for <logon> and <directory>.

impdp <logon> directory=<directory> dumpfile= 'test_tbs_meta.dmp' transport_datafiles= /backup/tbs_transport/test_tbs.dbf
*/

--
--
--
--
CREATE DIRECTORY STREAMS$DIROBJ$1 AS '/backup/tbs_transport/';
/* PL/SQL Script to import the exported tablespaces */
DECLARE
--
tbs_files dbms_streams_tablespace_adm.file_set;
cvt_files dbms_streams_tablespace_adm.file_set;

--
dump_file dbms_streams_tablespace_adm.file;
dp_job_name VARCHAR2(30) := NULL;

--
ts_names dbms_streams_tablespace_adm.tablespace_set;
BEGIN
--
dump_file.file_name := 'test_tbs_meta.dmp';
dump_file.directory_object := 'dpump_dir';

--
tbs_files( 1).file_name := 'test_tbs.dbf';
tbs_files( 1).directory_object := 'STREAMS$DIROBJ$1';

--
dbms_streams_tablespace_adm.attach_tablespaces(
datapump_job_name => dp_job_name,
dump_file => dump_file,
tablespace_files => tbs_files,
converted_files => cvt_files,
tablespace_names => ts_names);

--
IF ts_names IS NOT NULL AND ts_names.first IS NOT NULL THEN
FOR i IN ts_names.first .. ts_names.last LOOP
dbms_output.put_line('imported tablespace '|| ts_names(i));
END LOOP;
END IF;
END;
/

--
DROP DIRECTORY STREAMS$DIROBJ$1;
--------------------------------------------------------------
-- End of sample PL/SQL script
--------------------------------------------------------------

自動インスタンスを削除しています
自動インスタンス
Oracleインスタンスがシャットダウンしました
自動インスタンスが削除されました
補助インスタンス・ファイル/backup/aux/V19/datafile/o1_mf_temp_myhq29yp_.tmpを削除しました
補助インスタンス・ファイル/backup/aux/V19/onlinelog/o1_mf_3_myhq25w3_.logを削除しました
補助インスタンス・ファイル/backup/aux/V19/onlinelog/o1_mf_2_myhq24gm_.logを削除しました
補助インスタンス・ファイル/backup/aux/V19/onlinelog/o1_mf_1_myhq248h_.logを削除しました
補助インスタンス・ファイル/backup/aux/V19/datafile/o1_mf_sysaux_myhq1mql_.dbfを削除しました
補助インスタンス・ファイル/backup/aux/V19/datafile/o1_mf_undotbs1_myhq1mqq_.dbfを削除しました
補助インスタンス・ファイル/backup/aux/V19/datafile/o1_mf_system_myhq1mq9_.dbfを削除しました
補助インスタンス・ファイル/backup/aux/V19/controlfile/o1_mf_myhq1fof_.ctlを削除しました

RMAN> exit


Recovery Managerが完了しました。
[oracle@v19single ~]$

Step 2:ファイルを移行先へコピー

生成されたファイルを scp 等でターゲット環境へ転送します。

scp /backup/tbs_transport/* oracle@target:/backup/tbs_transport/

Step 3:SQL*Plusでインポート実行

ターゲットDB側で、RMANが作成してくれた impscrpt.sql を実行します。このスクリプトは、内部で dbms_streams_tablespace_adm.attach_tablespaces を呼び出し、物理ファイルをDBに認識させます。

sqlplus / as sysdba

-- 現状の確認
SQL> SELECT tablespace_name, status FROM dba_tablespaces;

-- インポートスクリプトの実行
SQL> @/backup/tbs_transport/impscrpt.sql

-- インポート直後は READ ONLY なので READ WRITE に変更
SQL> ALTER TABLESPACE test_tbs READ WRITE;

-- 完了確認
SQL> SELECT tablespace_name, status FROM dba_tablespaces;
[oracle@v19single ~]$ ls -l /u01/app/oracle/dpump
total 156
-rw-r--r--. 1 oracle oinstall 839 Mar 29 20:41 rman_test_tbs.log
-rw-r--r--. 1 oracle oinstall 155648 Mar 29 20:41 test_tbs_meta.dmp
[oracle@v19single ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 土 3月 29 21:06:42 2025
Version 19.21.0.0.0

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



Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
に接続されました。
SQL> set lin 1000 pages 1000
SQL> col tablespace_name for a20
SQL> SELECT tablespace_name,status FROM dba_tablespaces;

TABLESPACE_NAME STATUS
-------------------- ---------------------------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS ONLINE

SQL> @/backup/tbs_transport/impscrpt.sql ★インポートスクリプト実行

ディレクトリが作成されました。


PL/SQLプロシージャが正常に完了しました。


ディレクトリが削除されました。

SQL> SELECT tablespace_name,status FROM dba_tablespaces;

TABLESPACE_NAME STATUS
-------------------- ---------------------------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS ONLINE
TEST_TBS READ ONLY

6行が選択されました。

SQL> ALTER TABLESPACE test_tbs READ WRITE;

表領域が変更されました。

SQL> SELECT tablespace_name,status FROM dba_tablespaces;

TABLESPACE_NAME STATUS
-------------------- ---------------------------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS ONLINE
TEST_TBS ONLINE

6行が選択されました。
【参考:インポートスクリプト】
[oracle@v19single ~]$ cat /backup/tbs_transport/impscrpt.sql
/*
The following command may be used to import the tablespaces.
Substitute values for <logon> and <directory>.

impdp <logon> directory=<directory> dumpfile= 'test_tbs_meta.dmp' transport_datafiles= /backup/tbs_transport/test_tbs.dbf
*/

--
--
--
--
CREATE DIRECTORY STREAMS$DIROBJ$1 AS '/backup/tbs_transport/';
/* PL/SQL Script to import the exported tablespaces */
DECLARE
--
tbs_files dbms_streams_tablespace_adm.file_set;
cvt_files dbms_streams_tablespace_adm.file_set;

--
dump_file dbms_streams_tablespace_adm.file;
dp_job_name VARCHAR2(30) := NULL;

--
ts_names dbms_streams_tablespace_adm.tablespace_set;
BEGIN
--
dump_file.file_name := 'test_tbs_meta.dmp';
dump_file.directory_object := 'dpump_dir';

--
tbs_files( 1).file_name := 'test_tbs.dbf';
tbs_files( 1).directory_object := 'STREAMS$DIROBJ$1';

--
dbms_streams_tablespace_adm.attach_tablespaces(
datapump_job_name => dp_job_name,
dump_file => dump_file,
tablespace_files => tbs_files,
converted_files => cvt_files,
tablespace_names => ts_names);

--
IF ts_names IS NOT NULL AND ts_names.first IS NOT NULL THEN
FOR i IN ts_names.first .. ts_names.last LOOP
dbms_output.put_line('imported tablespace '|| ts_names(i));
END LOOP;
END IF;
END;
/

--
DROP DIRECTORY STREAMS$DIROBJ$1;
--------------------------------------------------------------
-- End of sample PL/SQL script
--------------------------------------------------------------
[oracle@v19single ~]$

❓ FAQ:実務での疑問

Q: なぜ impdp を使わないこの方法が便利なのですか?

A: impdp は高機能ですが、実行時にディレクトリ定義や複雑なパラメータ指定が必要です。RMAN生成のSQLスクリプトは、その環境に最適化されたインポート処理がすでに書き込まれているため、単純な「アタッチ」作業においては手順を簡略化でき、ミスを減らせます。

Q: UNTIL TIME を使う際、バックアップは必要ですか?

A: はい、抽出したい時点のアーカイブログとデータファイルのバックアップが必須です。RMANが裏側で「補助インスタンス」を立ち上げ、一時的にリカバリを行ってから抽出するためです。

Q: 実行中にエラーが出た場合、どこを確認すべきですか?

A: RMANの実行ログ(rman_test_tbs.log)に加えて、補助インスタンスのアラートログを確認してください。多くの場合、/backup/aux で指定した領域の不足や、一時的なメモリ不足が原因です。


📝 運用上の注意点

  • スキーマの事前確認: インポート先に同名のユーザーが存在し、必要な権限を持っていることを確認してください。
  • ディレクトリパス: impscrpt.sql 内に記述されているパスが、移行先の実際のパスと一致しているか確認し、必要であれば編集してください。
  • クリーンアップ: 完了後は、/backup/tbs_transport に残ったメタデータダンプやスクリプトを安全に削除してください。

🏁 まとめ

RMAN + impscrpt.sql による移行は、「Data Pumpの手間を省きつつ、RMANの強力なリカバリ機能で過去時点を抽出できる」非常に合理的な手法です。

特にDBAがスクリプトベースで確実な作業を行いたい場合や、本番環境に負荷をかけず(READ ONLYにせず)にデータを抜き出したいシーンで真価を発揮します。


[参考]
Oracle® Databaseユーティリティ 19c

Oracle Data Pump完全ガイド:仕組みと使い方、SCOTTスキーマ導入から実行例まで徹底解説
Oracle Databaseを効率的にバックアップ・移行する際に活用されるツールが「Oracle Data Pump」です。この記事では、SCOTTスキーマの導入からexpdp / impdp の実行例、補足手順(ディレクトリ作成・権限付…

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました