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

Oracle Master Gold

~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

コメント

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