~Data Pumpを使わず、自動生成スクリプトでスマートに移行する~
Oracleのトランスポータブル表領域(TTS)は大量データ移行の最適解ですが、実はData Pump(impdp)を使わずにインポートする方法があるのをご存知でしょうか。
RMANの TRANSPORT TABLESPACE コマンドを使用すると、メタデータをインポートするためのSQLスクリプト(impscrpt.sql)が自動生成されます。これを利用すれば、表領域を READ ONLY にすることなく、過去の特定時点(UNTIL TIME)の状態をSQLベースで取り込むことが可能です。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
✅ この手法のメリット
| 項目 | 内容 |
| 運用の柔軟性 | 表領域を READ ONLY にする必要がない(RMANが補助インスタンスで処理するため) |
| Data Pump不要 | RMANが生成した impscrpt.sql を SQL*Plus から実行するだけで完了 |
| 特定時点の復元 | UNTIL TIME 指定により、昨日の時点、パッチ適用前の時点などを抽出可能 |
| 自動変換 | クロスプラットフォーム移行時、RMANがエンディアン変換を代行する |
🛠 実行手順の流れ
- RMANで抽出: データファイルとインポート用SQLスクリプトを生成
- ファイル転送: 生成されたファイルを移行先サーバへコピー
- 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

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


コメント