~Data Pumpを使わずSQLで取り込む実践的アプローチ~
Oracleのトランスポータブル表領域は、大量データを高速かつ安全に移行するための強力な手段です。
特に RMANを用いたトランスポート処理では、表領域をREAD ONLYにせず、指定時点の状態をそのまま抽出し、SQLスクリプト(impscrpt.sql)で手動インポートすることも可能です。
この記事では、RMANでトランスポート用ファイルを作成し、Data Pumpを使わずにSQLスクリプトでインポートする方法を、UNTIL TIME
指定を使った実践形式で解説します。
✅ この方法の特徴
項目 | 内容 |
---|---|
表領域の抽出 | RMANの TRANSPORT TABLESPACE を使用 |
インポート方法 | RMANが生成したSQLスクリプト(impscrpt.sql )を @ コマンドで実行 |
Data Pump使用 | 不要 |
表領域READ ONLY化 | 不要 |
クロスプラットフォーム | 自動変換対応(RMANが実施) |
過去時点の取得 | UNTIL TIME で対応可能 |
✅ 前提条件
項目 | 内容 |
---|---|
Oracleバージョン | 11g 以降(12c 以降推奨) |
DIRECTORY オブジェクト | Oracle 上で作成済 |
バックアップ | UNTIL TIME 時点の RMAN バックアップが存在すること |
表領域制約 | 複数スキーマまたぎの制約に注意(1スキーマ推奨) |
✅ 実行手順の流れ
① RMANでトランスポータブル表領域をエクスポート(データファイル + メタデータSQL)
② 生成されたファイルを移行先へコピー
③ SQL*Plusでimpscrpt.sqlを実行してインポート
🔹 ① RMANでトランスポータブル表領域を出力
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_tbs01.dbf
(表領域のデータファイル)test_tbs_meta.dmp
(Data Pump用メタデータ)※今回は使用しないimpscrpt.sql
(今回使用するSQLインポートスクリプト)rman_test_tbs.log
(ログファイル)
✅
impscrpt.sql
は、スキーマ作成やインポートをSQL文で行うスクリプトです。
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 ~]$
🔹 ② ファイルを移行先にコピー
scp /backup/tbs_transport/* oracle@target:/backup/tbs_transport/
コピー対象ファイル:
test_tbs01.dbf
impscrpt.sql
🔹 ③ SQL*Plusでimpscrpt.sqlを実行(インポート)
sqlplus / as sysdba
SQL> @/backup/tbs_transport/impscrpt.sql
このスクリプトでは以下の処理が行われます:
- 対象ユーザーの作成または存在確認
- 表領域のマウント
- オブジェクト定義(テーブル・インデックスなど)のインポート
- 制約や依存オブジェクトの再作成
✅
impscrpt.sql
は、環境によって多少内容が異なります。実行前に内容確認をおすすめします。
[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行が選択されました。
📘 テキスト図:RMAN + impscrpt.sqlによる移行フロー
送信元DB(Source) 受信先DB(Target)
┌─────────────────────┐ ┌────────────────────┐
│ TRANSPORT TABLESPACE test_tbs │ │ SQL> @impscrpt.sql │
│ → test_tbs01.dbf │→scp→│ test_tbs01.dbf を使用 │
│ → impscrpt.sql │ │ スキーマ/オブジェクト再作成 │
└─────────────────────┘ └────────────────────┘
【参考:インポートスクリプト】
[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 ~]$
✅ よくある注意点
項目 | 内容 |
---|---|
スキーマ名の衝突 | 移行先DBに同名のユーザーやオブジェクトがないことを確認 |
表領域のパス | データファイルのパスを CREATE TABLESPACE 内で変更可能 |
SQLスクリプトの編集 | 必要に応じて impscrpt.sql のパスやユーザー名を編集 |
権限不足 | SYSDBA でSQL*Plusに接続して実行するのが確実 |
✅ まとめ
この方法は、RMANでトランスポータブル表領域を抽出し、Data Pumpを使わずにSQLスクリプトで取り込む実用的な方式です。
シーン | この手法が向いている理由 |
---|---|
Data Pumpを使いたくない場合 | ✅ SQLスクリプトで完結できる |
表領域をREAD ONLYにできない | ✅ RMANが一貫性を確保 |
過去の状態を再現したい | ✅ UNTIL TIME で対応可能 |
クロスプラットフォーム移行 | ✅ RMANが自動変換してくれる |
[参考]
Oracle® Databaseユーティリティ 19c
コメント