Oracleでは取得したバックアップを利用して、データベースを比較的簡単に複製することができます。
主な用途としては、バックアップから災対サイト(Data Guard構成でのスタンバイ・データベース)を作ったり、データベース移行などでの利用などがありますが、データベース全体の複製だけでなく、PDB単位、または、表単位での複製もできますので、ある時点の必要な表だけ取り出す。といったことも可能になっています。
本記事では、取得したRMANバックアップを利用した、データベースの複製手順を解説します。

できるだけシンプルに解説したいと思います。
本記事の前提
本記事の前提を解説します。
複製元のデータベース
- バージョン:DB19c(19.21)
- ORACLE_HOME:/u01/app/oracle/product/19.0.0.0/db_home1
- ORACLE_SID:ru21db
/backup にフルバックアップを取得済みの状態とします。
バックアップ取得はこちらの記事を参考にしてください。
『[Oracle] シンプルなRMANバックアップの取得方法』
複製先のデータベース
異なるRUにも複製できることを解説したかったので、あえてバージョンを変えています。
RMANはRUが異なるデータベースにも対応できます。
もちろん同じORACLE_HOME上にも複製できますので、ORACLE_HOMEは読み替えてください。
- バージョン:DB19c(19.22)
- ORACLE_HOME:/u01/app/oracle/product/19.0.0.0/db_home2
- ORACLE_SID:cp19c (複製先のDB名をcp19cとします)
データベースを複製する
では、実際にデータベースを複製してみましょう。
初期化パラメータファイル(pfile)を作成する
pfileを作成します。
本記事では分かりやすいように「/tmp/cp19c.ini」というファイルに以下の内容を保存しておきます。
*.audit_file_dest='/u01/app/oracle/admin/cp19c/adump'
*.audit_trail='db'
*.db_name='cp19c'
*.db_unique_name='cp19c'
*.diagnostic_dest='/u01/app/oracle'
*.pga_aggregate_target=1g
*.sga_target=2g
*.undo_tablespace='UNDOTBS1'
*.db_create_file_dest='/u01/app/oracle/oradata/CP19C'
*.enable_pluggable_database=true
必要なディレクトリを作成する
audit_file_destおよびdb_create_file_destで指定したディレクトリについては、事前に作成しておく必要があります。
存在しない場合は作成しておきます。
$ mkdir -p /u01/app/oracle/admin/cp19c/adump
$ mkdir -p /u01/app/oracle/oradata/CP19C
環境変数を設定する
データベースを複製する前に必要な環境変数を設定しておきます。
export NLS_LANG=American_America.AL32UTF8
export ORACLE_SID=cp19c
export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/db_home2
export PATH=$PATH:$ORACLE_HOME/bin
export NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'
複製先データベースを起動する
複製先データベースをnomountモードで起動します。
起動時に作成したpfileを指定します。
$ sqlplus / as sysdba
SQL> startup nomount pfile='/tmp/cp19c.ini'
実行例はこちらです。
SQL> startup nomount pfile='/tmp/cp19c.ini'
ORACLE instance started.
Total System Global Area 2147480472 bytes
Fixed Size 9180056 bytes
Variable Size 486539264 bytes
Database Buffers 1644167168 bytes
Redo Buffers 7593984 bytes
RMANでデータベースを複製する
RMANでデータベースを複製します。
コマンドも複雑ではありませんが、データベース名やバックアップ先のディレクトリパスは読み替えてください。
コマンドとしては、/backupに保存されているバックアップを利用して、ru21dbをcp19cとしてコピーするという意味になります。
$ rman auxiliary / nocatalog
RMAN> duplicate database ru21db to cp19c backup location '/backup';
実行例はこちらになります。少し長いですが全部載せておきます。
$ rman auxiliary / nocatalog
Recovery Manager: Release 19.0.0.0.0 - Production on Wed Oct 8 22:25:19 2025
Version 19.22.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
connected to auxiliary database: CP19C (not mounted)
RMAN> duplicate database ru21db to cp19c backup location '/backup';
Starting Duplicate Db at 2025/10/08 22:25:44
searching for database ID
found backup of database ID 3272260048
contents of Memory Script:
{
sql clone "create spfile from memory";
}
executing Memory Script
sql statement: create spfile from memory
contents of Memory Script:
{
shutdown clone immediate;
startup clone nomount;
}
executing Memory Script
Oracle instance shut down
connected to auxiliary database (not started)
Oracle instance started
Total System Global Area 2147480472 bytes
Fixed Size 9180056 bytes
Variable Size 486539264 bytes
Database Buffers 1644167168 bytes
Redo Buffers 7593984 bytes
contents of Memory Script:
{
sql clone "alter system set control_files =
''/u01/app/oracle/oradata/CP19C/CP19C/controlfile/o1_mf_ngdsmg5v_.ctl'' comment=
''Set by RMAN'' scope=spfile";
sql clone "alter system set db_name =
''RU21DB'' comment=
''Modified by RMAN duplicate'' scope=spfile";
sql clone "alter system set db_unique_name =
''cp19c'' comment=
''Modified by RMAN duplicate'' scope=spfile";
shutdown clone immediate;
startup clone force nomount
restore clone primary controlfile from '/backup/FULL_RU21DB_20251008_0t45ob7c_29_1_1';
alter clone database mount;
}
executing Memory Script
sql statement: alter system set control_files = ''/u01/app/oracle/oradata/CP19C/CP19C/controlfile/o1_mf_ngdsmg5v_.ctl'' comment= ''Set by RMAN'' scope=spfile
sql statement: alter system set db_name = ''RU21DB'' comment= ''Modified by RMAN duplicate'' scope=spfile
sql statement: alter system set db_unique_name = ''cp19c'' comment= ''Modified by RMAN duplicate'' scope=spfile
Oracle instance shut down
Oracle instance started
Total System Global Area 2147480472 bytes
Fixed Size 9180056 bytes
Variable Size 486539264 bytes
Database Buffers 1644167168 bytes
Redo Buffers 7593984 bytes
Starting restore at 2025/10/08 22:26:30
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=11 device type=DISK
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u01/app/oracle/oradata/CP19C/CP19C/controlfile/o1_mf_ngdsmg5v_.ctl
Finished restore at 2025/10/08 22:26:32
database mounted
released channel: ORA_AUX_DISK_1
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=11 device type=DISK
duplicating Online logs to Oracle Managed File (OMF) location
duplicating Datafiles to Oracle Managed File (OMF) location
contents of Memory Script:
{
set until scn 937231;
set newname for clone datafile 1 to new;
set newname for clone datafile 2 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 4 to new;
set newname for clone datafile 5 to new;
set newname for clone datafile 6 to new;
set newname for clone datafile 7 to new;
restore
clone database
;
}
executing Memory Script
executing command: SET until clause
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
Starting restore at 2025/10/08 22:26:37
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00005 to /u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_users_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /backup/FULL_RU21DB_20251008_0r45ob64_27_1_1
channel ORA_AUX_DISK_1: piece handle=/backup/FULL_RU21DB_20251008_0r45ob64_27_1_1 tag=TAG20251008T221844
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:35
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00002 to /u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00006 to /u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece /backup/FULL_RU21DB_20251008_0s45ob6t_28_1_1
channel ORA_AUX_DISK_1: piece handle=/backup/FULL_RU21DB_20251008_0s45ob6t_28_1_1 tag=TAG20251008T221844
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:25
Finished restore at 2025/10/08 22:27:38
contents of Memory Script:
{
switch clone datafile all;
}
executing Memory Script
datafile 1 switched to datafile copy
input datafile copy RECID=8 STAMP=1214000858 file name=/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_system_ngdsng2m_.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=9 STAMP=1214000858 file name=/u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_system_ngdsokc8_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=10 STAMP=1214000858 file name=/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_sysaux_ngdsng33_.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=11 STAMP=1214000858 file name=/u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_sysaux_ngdsokcw_.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=12 STAMP=1214000858 file name=/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_undotbs1_ngdsng37_.dbf
datafile 6 switched to datafile copy
input datafile copy RECID=13 STAMP=1214000858 file name=/u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_undotbs1_ngdsokcr_.dbf
datafile 7 switched to datafile copy
input datafile copy RECID=14 STAMP=1214000858 file name=/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_users_ngdsng3s_.dbf
contents of Memory Script:
{
set until scn 937231;
recover
clone database
delete archivelog
;
}
executing Memory Script
executing command: SET until clause
Starting recover at 2025/10/08 22:27:38
using channel ORA_AUX_DISK_1
starting media recovery
channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=29
channel ORA_AUX_DISK_1: reading from backup piece /backup/ARCH_RU21DB_20251008_0v45ob7g_31_1_1
channel ORA_AUX_DISK_1: piece handle=/backup/ARCH_RU21DB_20251008_0v45ob7g_31_1_1 tag=TAG20251008T221927
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
archived log file name=/u01/app/oracle/product/19.0.0.0/db_home2/dbs/arch/1_29_1162895184.dbf thread=1 sequence=29
channel clone_default: deleting archived log(s)
archived log file name=/u01/app/oracle/product/19.0.0.0/db_home2/dbs/arch/1_29_1162895184.dbf RECID=1 STAMP=1214000859
media recovery complete, elapsed time: 00:00:01
Finished recover at 2025/10/08 22:27:41
Oracle instance started
Total System Global Area 2147480472 bytes
Fixed Size 9180056 bytes
Variable Size 486539264 bytes
Database Buffers 1644167168 bytes
Redo Buffers 7593984 bytes
contents of Memory Script:
{
sql clone "alter system set db_name =
''CP19C'' comment=
''Reset to original value by RMAN'' scope=spfile";
sql clone "alter system reset db_unique_name scope=spfile";
}
executing Memory Script
sql statement: alter system set db_name = ''CP19C'' comment= ''Reset to original value by RMAN'' scope=spfile
sql statement: alter system reset db_unique_name scope=spfile
Oracle instance started
Total System Global Area 2147480472 bytes
Fixed Size 9180056 bytes
Variable Size 486539264 bytes
Database Buffers 1644167168 bytes
Redo Buffers 7593984 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "CP19C" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 1024
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 SIZE 200 M ,
GROUP 2 SIZE 200 M ,
GROUP 3 SIZE 200 M
DATAFILE
'/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_system_ngdsng2m_.dbf',
'/u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_system_ngdsokc8_.dbf'
CHARACTER SET AL32UTF8
contents of Memory Script:
{
set newname for clone tempfile 1 to new;
set newname for clone tempfile 2 to new;
switch clone tempfile all;
catalog clone datafilecopy "/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_sysaux_ngdsng33_.dbf",
"/u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_sysaux_ngdsokcw_.dbf",
"/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_undotbs1_ngdsng37_.dbf",
"/u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_undotbs1_ngdsokcr_.dbf",
"/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_users_ngdsng3s_.dbf";
switch clone datafile all;
}
executing Memory Script
executing command: SET NEWNAME
executing command: SET NEWNAME
renamed tempfile 1 to /u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_temp_%u_.tmp in control file
renamed tempfile 2 to /u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_temp_%u_.tmp in control file
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_sysaux_ngdsng33_.dbf RECID=1 STAMP=1214000892
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_sysaux_ngdsokcw_.dbf RECID=2 STAMP=1214000892
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_undotbs1_ngdsng37_.dbf RECID=3 STAMP=1214000892
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_undotbs1_ngdsokcr_.dbf RECID=4 STAMP=1214000892
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_users_ngdsng3s_.dbf RECID=5 STAMP=1214000892
datafile 3 switched to datafile copy
input datafile copy RECID=1 STAMP=1214000892 file name=/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_sysaux_ngdsng33_.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=2 STAMP=1214000892 file name=/u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_sysaux_ngdsokcw_.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=3 STAMP=1214000892 file name=/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_undotbs1_ngdsng37_.dbf
datafile 6 switched to datafile copy
input datafile copy RECID=4 STAMP=1214000892 file name=/u01/app/oracle/oradata/CP19C/CP19C/1300950626C0E064E0650A0027BC8706/datafile/o1_mf_undotbs1_ngdsokcr_.dbf
datafile 7 switched to datafile copy
input datafile copy RECID=5 STAMP=1214000892 file name=/u01/app/oracle/oradata/CP19C/CP19C/datafile/o1_mf_users_ngdsng3s_.dbf
contents of Memory Script:
{
Alter clone database open resetlogs;
}
executing Memory Script
database opened
Cannot remove created server parameter file
Finished Duplicate Db at 2025/10/08 22:28:35
PL/SQL package SYS.DBMS_BACKUP_RESTORE version 19.21.00.00 in AUXILIARY database is not current
PL/SQL package SYS.DBMS_RCVMAN version 19.21.00.00 in AUXILIARY database is not current
RMAN>
エラーなく「Finished Duplicate Db」メッセージが出力されたら、データベースの複製は完了です。

RUが異なる場合は追加の作業も必要になるのですが、一旦ここでは割愛します。
まとめ
本記事ではRMANバックアップからのデータベース複製について解説しました。
コマンドを見ていただければ分かる通り、比較的簡単にデータベースを複製できるようになっています。
ただ、フルバックアップが不足していたりすると、リストア+リカバリ時にエラーになってしまいますので、上手く複製できない場合は、まずはきちんとフルバックアップが取得できていることをご確認ください。

コメント