この記事は、JPOUG Advent Calendar 2025 15日目の記事です。14日目は ketsuji1さん の記事『問合せ変換されたSQLの変換後SQLを10053トレースからSELECTで見てみる』でした。
Oracle Cloud Infrastructure Advent Calendar 2025 14日目とのクロスポストになります。
はじめに
EMCC(Enterprise Manager Cloud Control)からポチポチしたり、BaseDBのOCIコンソールからDataGuardアソシエーションの有効化をポチっとしたりする中で、手動で作成したことが無かったのでお勉強がてら作成してみることにした。
他にも既存の記事はあるが、本件いろいろ頑張ってみた上でのメモ。
言っておきたいこと
手動でのDataGuard作成は大変なので、BaseDBではDataGuardアソシエーションの有効化をポチっとすることがおすすめ。
環境
- 東京リージョンと大阪リージョンでクロスリージョンで通信できるようにしておく
- VCNをウィザードからパブリックで作成
- お互いのCIDRは被らないようにする。10.0.0.0/16と10.1.0.0/16
- 動的ルーティングゲートウェイ(DRG)の作成
- 各リージョンのサブネットにアタッチ
- リモートピアリング
- セキュリティリストで互いの1521のイングレスを許可
- 各ルートテーブルで相手のサブネットに行くときはインターネットゲートウェイではなく動的ルーティングゲートウェイに向ける
- 以下のBaseDBを作成しておく
- 東京リージョン(test19c2902t)
- 大阪リージョン(test19c2002o)
- DB 19.29
- GI 19.29
- シングルノード
- CDBTEST1
- TESTPDB1
- 管理者パスワードは同じものを設定
- ※もろもろ一個人のお勉強アカウントで実施
以下、頑張ったこと
ロギングモードが有効であること
$ sudo su -
# su - oracle
$ sqlplus / as sysdba
SQL> set markup csv on;
SQL> select force_logging from v$database;
### 万が一無効の場合
SQL> alter database force logging;
アーカイブログモードが有効であること
SQL> archive log list;
### 万が一の場合
SQL> alter database archivelog;
SQL> archive log list;
db_unique_nameの確認(プライマリ/スタンバイ)
SQL> show parameter db_unique_name;
※ここでは、db_unique_nameは以下の値とする
- 東京リージョン(test19c2902t/CDBTEST1_ckf_nrt)
- 大阪リージョン(test19c2002o/CDBTEST1_8wx_kix)
プライマリのみ初期化パラメータの設定(プライマリの東京からスタンバイの大阪に向ける)
SQL> show parameter log_archive_config;
SQL> alter system set log_archive_config='DG_CONFIG=(CDBTEST1_ckf_nrt,CDBTEST1_8wx_kix)' scope=both;
SQL> show parameter log_archive_config;
SQL> show parameter log_archive_dest_1;
SQL> alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' scope=both;
SQL> show parameter log_archive_dest_1;
SQL> show parameter log_archive_dest_2;
SQL> alter system set log_archive_dest_2='SERVICE=CDBTEST1_8wx_kix ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=CDBTEST1_8wx_kix' scope=both;
SQL> show parameter log_archive_dest_2;
SQL> show parameter fal_server;
SQL> alter system set fal_server='CDBTEST1_8wx_kix' scope=both;
SQL> show parameter fal_server;
### おそらく必要
SQL> show parameter db_file_name_convert;
SQL> alter system set db_file_name_convert='/CDBTEST1_CKF_NRT/','/CDBTEST1_8WX_KIX/' scope=spfile;
SQL> show parameter db_file_name_convert;
### おそらく必要
SQL> show parameter log_file_name_convert;
SQL> alter system set log_file_name_convert='/CDBTEST1_CKF_NRT/','/CDBTEST1_8WX_KIX/' scope=spfile;
SQL> show parameter log_file_name_convert;
SQL> show parameter standby_file_management;
SQL> alter system set standby_file_management=AUTO scope=both;
SQL> show parameter standby_file_management;
SQL> shutdown immediate;
SQL> startup;
SQL> show parameter db_file_name_convert;
SQL> show parameter log_file_name_convert;
プライマリとスタンバイでお互いに通信できるようにtnsnames.oraと/etc/hostsを変更
# su - oracle
$ lsnrctl status
$ cd $ORACLE_HOME/network/admin
$ cat tnsnames.ora
$ vi tnsnames.ora
※プライマリにあるCDBTEST1_CKF_NRTの定義をスタンバイに追記
※スタンバイにあるCDBTEST1_8WX_KIXの定義をプライマリに追記
$ cat tnsname.ora
※イメージ(プライマリの場合)
CDBTEST1_CKF_NRT =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = test19c2902t)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = CDBTEST1_ckf_nrt.sub12070200480.testvcnt.oraclevcn.com)
)
)
LISTENER_CDBTEST1 =
(ADDRESS = (PROTOCOL = TCP)(HOST = test19c2902t)(PORT = 1521))
CDBTEST1_8WX_KIX =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = test19c2902o)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = CDBTEST1_8wx_kix.sub12070201410.testvcno.oraclevcn.com)
)
)
$ exit
# cat /etc/hosts
# vi /etc/hosts
※末尾に相手のホストの定義を追加
# cat /etc/hosts
※プライマリの場合のイメージ
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.49 test19c2902t.sub12070200480.testvcnt.oraclevcn.com test19c2902t
192.168.16.18 test19c2902t-priv.sub12070200480.testvcnt.oraclevcn.com test19c2902t-priv
10.0.0.49 test19c2902t-vip.sub12070200480.testvcnt.oraclevcn.com test19c2902t-vip
10.0.0.49 test19c2902t-scan.sub12070200480.testvcnt.oraclevcn.com test19c2902t-scan
10.1.0.38 test19c2902o
【メイン】アクティブデータベースの複製
大阪にspfileを複製したときに、初期パラを変更しながらspfileも複製したかった。。(失敗)
一番詰まって辛かったところ。以下、ダイジェストで。
### プライマリで実行
# su - oracle
$ rman target sys/Welcome_1_WELCOME_1@CDBTEST1_CKF_NRT auxiliary sys/Welcome_1_WELCOME_1@CDBTEST1_8WX_KIX;
### 大阪にspfileを複製したときに、初期パラを変更しながらspfileも複製したかった。。(失敗)
RMAN> DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
DORECOVER
SPFILE
SET "db_unique_name"="CDBTEST1_8wx_kix"
SET LOG_ARCHIVE_DEST_2="SERVICE=CDBTEST1_ckf_nrt ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=CDBTEST1_ckf_nrt"
SET FAL_SERVER="CDBTEST1_3qb_nrt"
SET db_file_name_convert="'/CDBTEST1_8WX_KIX/','/CDBTEST1_CKF_NRT/'"
SET log_file_name_convert="'/CDBTEST1_8WX_KIX/','/CDBTEST1_CKF_NRT/'"
NOFILENAMECHECK;
↓
RMAN-05537: DUPLICATE without TARGET connection when auxiliary instance is started with spfile cannot use SPFILE clause
↓
スタンバイをpfile起動
SQL> create pfile='/home/oracle/pfile.ora' from spfile;
SQL> shutdown immediate;
SQL> startup pfile='/home/oracle/pfile.ora';
↓
プライマリから複製をリトライするも失敗。
RMAN-05500: the auxiliary database must be not mounted when issuing a DUPLICATE command
↓
スタンバイをpfileでnomount起動
shutdown immediate;
startup nomount pfile='/home/oracle/pfile.ora';
↓
リトライしようとすると、補助インスタンスに接続できなくなる
RMAN-04006: error from auxiliary database: ORA-12528: TNS:listener: all appropriate instances are blocking new connections
↓
確かにスタンバイ側がBLOCKEDになっている
[oracle@test19c2902o ~]$ lsnrctl status
略
Service "CDBTEST1_8wx_kix.sub12070201410.testvcno.oraclevcn.com" has 1 instance(s).
Instance "CDBTEST1", status BLOCKED, has 2 handler(s) for this service...
The command completed successfully
[oracle@test19c2902o ~]$
↓BLOCKEDでも接続できるように(UR=A)を追加。プライマリ/スタンバイの両方
(例:プライマリの場合)
CDBTEST1_CKF_NRT =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = test19c2902t)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = CDBTEST1_ckf_nrt.sub12070200480.testvcnt.oraclevcn.com)
(UR=A) ★
)
)
LISTENER_CDBTEST1 =
(ADDRESS = (PROTOCOL = TCP)(HOST = test19c2902t)(PORT = 1521))
CDBTEST1_8WX_KIX =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = test19c2902o)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = CDBTEST1_8wx_kix.sub12070201410.testvcno.oraclevcn.com)
(UR=A) ★
)
)
↓
一番つらかった。。。spfileをスタンバイにASMのパス指定で作成しようとしてエラー。
contents of Memory Script:
{
backup as copy reuse
passwordfile auxiliary format '/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/orapwCDBTEST1' ;
restore clone from service 'CDBTEST1_CKF_NRT' spfile to
'+DATA/CDBTEST1_8WX_KIX/PARAMETERFILE/spfile.261.1219793771';
sql clone "alter system set spfile= ''+DATA/CDBTEST1_8WX_KIX/PARAMETERFILE/spfile.261.1219793771''";
}
executing Memory Script
Starting backup at 14-DEC-25
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=190 device type=DISK
Finished backup at 14-DEC-25
Starting restore at 14-DEC-25
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service CDBTEST1_CKF_NRT
channel ORA_AUX_DISK_1: restoring SPFILE
output file name=+DATA/CDBTEST1_8WX_KIX/PARAMETERFILE/spfile.261.1219793771
RMAN Command Id : 2025-12-14T01:42:37
RMAN Command Id : 2025-12-14T01:42:37
RMAN Command Id : 2025-12-14T01:42:37
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 12/14/2025 01:42:56
RMAN-05501: aborting duplication of target database
RMAN-03015: error occurred in stored script Memory Script
ORA-19849: error while reading backup piece from service CDBTEST1_CKF_NRT
ORA-32015: unable to restore SPFILE
ORA-17502: ksfdcre:4 Failed to create file +DATA/CDBTEST1_8WX_KIX/PARAMETERFILE/spfile.261.1219793771
ORA-15046: ASM file name '+DATA/CDBTEST1_8WX_KIX/PARAMETERFILE/spfile.261.1219793771' is not in single-file creation form
ORA-19660: some files in the backup set could not be verified
ORA-19685: SPFILE could not be verified
ORA-19849: error while reading backup piece from service CDBTEST1_CKF_NRT
ORA-32015: unable to restore SPFILE
ORA-17502: ksfdcre:4 Failed to create file +DATA/CDBTEST1_8WX_KIX/PARAMETERFILE/spfile.261.1219793771
ORA-15046: ASM file name '+DATA/CDBTEST1_8WX_KIX/PARAMETERFILE/spfile.261.1219793771' is not in single-file creation form
↓
かなり試行錯誤したが、spfileのコピーはあきらめた!!!
・スタンバイをspfile起動に戻す。
SQL> shutdown immediate;
SQL> startup nomount;
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/initCDBTEST1.ora'
SQL>
↓
spfileの読み込みがASMではなくなってしまったので戻す。。(つかれてきた。。)
なぜかASM上のPARAMETERディレクトリがいなかったので手作成。。
# su - grid
$ asmcmd
ASMCMD> cd +DATA/CDBTEST1_8WX_KIX/
ASMCMD> ls
ASMCMD> mkdir PARAMETERFILE
ASMCMD> ls
ASMCMD> exit
$ exit
# su - oracle
$ sqlplus / as sysdba
SQL> CREATE SPFILE='+DATA/CDBTEST1_8WX_KIX/PARAMETERFILE/spfileCDBTEST1.ora' FROM PFILE='/home/oracle/pfile.ora';
SQL> exit
$ srvctl config database -d CDBTEST1_8WX_KIX
$ srvctl modify database -d CDBTEST1_8WX_KIX -p +DATA/CDBTEST1_8WX_KIX/PARAMETERFILE/spfileCDBTEST1.ora
$ sqlplus / as sysdba
SQL> nomount
↓
プライマリから複製リトライ。spfileなし。(今度こそ)
### プライマリで実行
# su - oracle
$ rman target sys/Welcome_1_WELCOME_1@CDBTEST1_CKF_NRT auxiliary sys/Welcome_1_WELCOME_1@CDBTEST1_8WX_KIX;
### spfile無し
RMAN> DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
DORECOVER
NOFILENAMECHECK;
↓
リカバリでウォレットがおかしいとおこられた。(つかれた)
contents of Memory Script:
{
set until scn 1727120;
recover
standby
clone database
delete archivelog
;
}
executing Memory Script
executing command: SET until clause
Starting recover at 14-DEC-25
using channel ORA_AUX_DISK_1
starting media recovery
archived log for thread 1 with sequence 6 is already on disk as file +RECO/CDBTEST1_8WX_KIX/ARCHIVELOG/2025_12_14/thread_1_seq_6.262.1219803865
archived log for thread 1 with sequence 7 is already on disk as file +RECO/CDBTEST1_8WX_KIX/ARCHIVELOG/2025_12_14/thread_1_seq_7.263.1219803865
archived log file name=+RECO/CDBTEST1_8WX_KIX/ARCHIVELOG/2025_12_14/thread_1_seq_6.262.1219803865 thread=1 sequence=6
RMAN Command Id : 2025-12-14T02:22:54
RMAN Command Id : 2025-12-14T02:22:54
RMAN Command Id : 2025-12-14T02:22:54
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 12/14/2025 02:24:31
RMAN-05501: aborting duplication of target database
RMAN-03015: error occurred in stored script Memory Script
ORA-00283: recovery session canceled due to errors
RMAN-11003: failure during parse/execution of SQL statement: alter database recover logfile '+RECO/CDBTEST1_8WX_KIX/ARCHIVELOG/2025_12_14/thread_1_seq_6.262.1219803865'
ORA-00283: recovery session canceled due to errors
ORA-28374: typed master key not found in wallet
↓
いろいろ考えてみた結果、プライマリのwallet_rootに対応するTDEキーたちを、スタンバイにSCP/SSHで持っていく。
スタンバイ
SQL> show parameter wallet;
"NAME","TYPE","VALUE"
"ssl_wallet","string",
"wallet_root","string","/opt/oracle/dcs/commonstore/wallets/CDBTEST1_8wx_kix"
SQL>
プライマリ
SQL> show parameter wallet;
"NAME","TYPE","VALUE"
"ssl_wallet","string",
"wallet_root","string","/opt/oracle/dcs/commonstore/wallets/CDBTEST1_ckf_nrt"
SQL>
$ cd /opt/oracle/dcs/commonstore/wallets/CDBTEST1_ckf_nrt
$ cd tde
$ ls -l
$ tar cfvz /tmp/CDBTEST1_ckf_nrt.tar.gz ./
もっていく。(省略)
スタンバイ
$ cd /opt/oracle/dcs/commonstore/wallets/CDBTEST1_8wx_kix
$ cp -rp tde tde_bk
$ cd tde
$ ls -l
$ rm -f ./*
$ ls -l
$ tar xfvz /tmp/CDBTEST1_ckf_nrt.tar.gz
$ ls -l
↓
スタンバイをnomountにしてから、spfileなしで複製リトライ。
Finished Duplicate Db at 14-DEC-25
やっとで終わった。。(いや、まだまだ)
スタンバイのみ初期化パラメータの設定(スタンバイの大阪からプライマリの東京に向ける)
SQL> show parameter log_archive_config;
SQL> alter system set log_archive_config='DG_CONFIG=(CDBTEST1_8wx_kix, CDBTEST1_ckf_nrt)' scope=both;
SQL> show parameter log_archive_config;
SQL> show parameter log_archive_dest_1;
SQL> alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' scope=both;
SQL> show parameter log_archive_dest_1;
SQL> show parameter log_archive_dest_2;
SQL> alter system set log_archive_dest_2='SERVICE=CDBTEST1_ckf_nrt ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=CDBTEST1_ckf_nrt' scope=both;
SQL> show parameter log_archive_dest_2;
SQL> show parameter fal_server;
SQL> alter system set fal_server='CDBTEST1_ckf_nrt' scope=both;
SQL> show parameter fal_server;
### おそらく必要
SQL> show parameter db_file_name_convert;
SQL> alter system set db_file_name_convert='/CDBTEST1_8WX_KIX/','/CDBTEST1_CKF_NRT/' scope=spfile;
SQL> show parameter db_file_name_convert;
### おそらく必要
SQL> show parameter log_file_name_convert;
SQL> alter system set log_file_name_convert='/CDBTEST1_8WX_KIX/','/CDBTEST1_CKF_NRT/' scope=spfile;
SQL> show parameter log_file_name_convert;
SQL> show parameter standby_file_management;
SQL> alter system set standby_file_management=AUTO scope=both;
SQL> show parameter standby_file_management;
SQL> shutdown immediate;
SQL> startup;
SQL> show parameter db_file_name_convert;
SQL> show parameter log_file_name_convert;
スタンバイでredo適用開始
SQL> alter database recover managed standby database disconnect;
SQL> exit
$ ps -ef | grep mrp
Brokerは構成はさらにいろいろあって諦め。とりあえずBroker無しで手動スイッチオーバが出来ることの動作確認
プライマリ
$ sqlplus / as sysdba
SQL> show pdbs;
SQL> alter session set container=TESTPDB1;
SQL> show pdbs;
SQL> create user user1;
SQL> grant dba to user1;
SQL> create table user1.test(col number);
SQL> insert into user1.test values(100);
SQL> commit;
SQL> select * from user1.test;
### スイッチオーバ実行
プライマリ
SQL> alter database switchover to CDBTEST1_8wx_kix;
新プライマリ
SQL> show pdbs;
SQL> alter database open;
SQL> show pdbs;
新スタンバイ(旧プライマリ)
SQL> show pdbs;
SQL> startup mount;
SQL> show pdbs;
SQL> alter database recover managed standby database disconnect;
SQL> exit
$ ps -ef | grep mrp
新プライマリ
SQL> show pdbs;
SQL> alter session set container=TESTPDB1;
SQL> show pdbs;
SQL> select * from user1.test;
COL
----------
100
SQL> insert into user1.test values(200);
SQL> commit;
SQL> select * from user1.test;
### スイッチオーバ実行
現プライマリ
SQL> alter database switchover to CDBTEST1_ckf_nrt;
新プライマリ
SQL> show pdbs;
SQL> alter database open;
SQL> show pdbs;
新スタンバイ(旧プライマリ)
SQL> show pdbs;
SQL> startup mount;
SQL> show pdbs;
SQL> alter database recover managed standby database disconnect;
SQL> exit
$ ps -ef | grep mrp
新プライマリ
SQL> show pdbs;
SQL> alter session set container=TESTPDB1;
SQL> show pdbs;
SQL> select * from user1.test;
COL
----------
100
200
SQL>
とりあえず
マニュアルや他のQiita等ありつつ、BaseDBではどこまでやれば良いか、私がそもそも手動でDataGuard作ったこと無かったのでお勉強でいろいろ試行錯誤したが、完走出来て良かったです。
1回目が試行錯誤しすぎたので、2回目のトライでエラーの発生箇所を確認しながら、この記事を作成しました。
たぶん、既存のナレッジをもとに素直に実行していれば、もっと楽に出来たはず。(つかれすぎた。。)
さいごに
手動でのDataGuard作成は大変なので、BaseDBではDataGuardアソシエーションの有効化をポチっとすることがおすすめ。
参考文献
3 フィジカル・スタンバイ・データベースの作成
https://docs.oracle.com/cd/F19136_01/sbydb/creating-oracle-data-guard-physical-standby.html071C37550170
E.3.1 アクティブ・データベース複製を使用したスタンバイ・データベースまたは遠隔同期インスタンスの作成
https://docs.oracle.com/cd/E82638_01/sbydb/creating-data-guard-standby-database-using-RMAN.html#GUID-D1694762-4B53-4828-B094-874DB1A6FC81