RACとRACでData Guard構成

以下のようなData Guard環境を構築する手順のメモ。

  • プライマリ、スタンバイ共に2ノードのRAC。バージョンは19c(19.16)を使用。
  • プライマリとスタンバイは別筐体
  • プライマリとスタンバイはどちらもOracle Managed Files(OMF)でのファイル管理
  • ASM上の高速リカバリ領域を使用
  • データファイルなどの格納先ディスクグループ名はどちらも同一の「+DATA」
  • データベースはマルチテナントコンテナデータベースで、PDBを一つ含む。
  • DB_NAMEとプライマリのDB_UNIQUE_NAMEはcdb19pr
  • スタンバイのDB_UNIQUE_NAMEはcdb19st
  • OSはOracle Linux(プライマリが7、スタンバイが8)
  • アクティブデータベース複製を使用

特殊な設定などは行っていない、極めてプレーンなRAC環境同士を想定している。

プライマリ側の設定

事前にデータベースは作成済みの前提。

データベースをアーカイブログモードに変更し、強制ロギングを有効化する。

$ srvctl stop database -db cdb19pr
$ srvctl start database -db cdb19pr -startoption mount
SQL> alter database archivelog;
SQL> alter database force logging;

スタンバイREDOログを作成する。既存のREDOログと同じサイズのものを、既存のREDOロググループの数+1となるように作成する。プライマリがRACの場合、各Thread毎にそれぞれ+1とする必要があるので注意。

-- 既存のREDOログの確認
SQL> select group#, thread#, bytes/1024/1024 MB from v$log;

        GROUP#    THREAD#         MB
    ---------- ---------- ----------
             1          1        200
             2          1        200
             3          2        200
             4          2        200
SQL> alter database add standby logfile thread 1 
     group 5  ('+DATA') size 200M, group 6  ('+DATA') size 200M, group 7  ('+DATA') size 200M;

SQL> alter database add standby logfile thread 2
     group 8  ('+DATA') size 200M, group 9  ('+DATA') size 200M, group 10 ('+DATA') size 200M;

tnsnames.ora にスタンバイへの接続設定を追記。RACの全ノードに追記することを忘れないこと。

cdb19st =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = racstb-scan.dn.home)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cdb19st)
    )
  )

関連する初期化パラメータを変更し、再起動する。

SQL> alter system set log_archive_config='dg_config=(cdb19pr,cdb19st)';
SQL> alter system set log_archive_dest_1='location=use_db_recovery_file_dest valid_for=(all_logfiles,all_roles) db_unique_name=cdb19pr';
SQL> alter system set log_archive_dest_2='service=cdb19st async valid_for=(online_logfiles,primary_role) db_unique_name=cdb19st';
SQL> alter system set log_archive_dest_state_1=enable;
SQL> alter system set log_archive_dest_state_2=enable;
SQL> alter system set fal_client='cdb19pr';
SQL> alter system set fal_server='cdb19st';
SQL> alter system set standby_file_management=auto;
SQL> alter system set remote_login_passwordfile=exclusive scope=spfile;
$ srvctl stop database -db cdb19pr
$ srvctl start database -db cdb19pr

パスワードファイルをスタンバイに転送するため、ASMからファイルシステムへコピーする。
事前にASM上のファイル名を確認しておく。

$ asmcmd ls +data/cdb19pr/password
pwdcdb19pr.274.1134208767

asmcmdのpwcopy コマンドでパスワードファイルを一旦ファイルシステム上にコピーする。

$ asmcmd pwcopy +data/cdb19pr/password/pwdcdb19pr.274.1134208767 /tmp

スタンバイ側にパスワードファイルをコピーする。コピー先は$ORACLE_HOME/dbs/orapw<SID名> で、複製を実行するスタンバイの一つのノードのみでよい。

$ scp /tmp/pwdcdb19pr.274.1134208767 oracle@racstb1.dn.home:/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwcdb19st1

プライマリがRACのため、リスナーの静的構成を行う必要はない。

スタンバイ側の設定

特に補足がない限り、スタンバイのどれか一つのノードで行う。

複製時に一時的に使用するリスナーを作成する。GridではなくDB側にlistener.oraを作成。
Grid側で起動しているリスナーと被らない別のポート番号を指定する必要があるので注意。

LISTENER_DUP =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = racstb1.dn.home)(PORT = 9999))
    )
  )

SID_LIST_LISTENER_DUP =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = cdb19st)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = cdb19st1)
    )
  )

複製用のリスナーをDB側から起動しておく。

$ lsnrctl start LISTENER_DUP

tnsnames.ora にプライマリへの接続設定を追記。これは両ノードに対して行う。

cdb19pr =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = racprm-scan.dn.home)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cdb19pr)
    )
  )

DB_NAMEだけ記載した初期化パラメータファイルを $ORACLE_HOME/dbs/init<SID名>.ora に作成する。

$ cat <<EOF > $ORACLE_HOME/dbs/initcdb19st1.ora
db_name='cdb19pr'
EOF

両ノードに監査ファイルの出力先のディレクトリを作成する。

$ mkdir -p $ORACLE_BASE/admin/cdb19st/adump

ORACLE_SID を設定して、インスタンスを nomount で起動。

$ export ORACLE_SID=cdb19st1
$ sqlplus / as sysdba
SQL> startup nomount

RMANでDuplicateコマンドを実行し、スタンバイデータベースを作成する。この時、補助インスタンスの接続記述子には先ほど一時的に作成したリスナーのポートを指定する。
OMFを使用しているので control_files にはディスクグループ名だけを指定している(自動的に適切なパスに制御ファイルが作られる)。ディスクグループ名が同じであれば、db_file_name_convert や log_file_name_convert の指定も不要。

$ rman target sys/oracle@cdb19pr auxiliary sys/oracle@racstb1.dn.home:9999/cdb19st
RMAN> run {
  duplicate target database for standby from active database
  spfile
  parameter_value_convert 'cdb19pr','cdb19st'
  set db_name='cdb19pr'
  set db_unique_name='cdb19st'
  set log_archive_config='dg_config=(cdb19pr,cdb19st)'
  set log_archive_dest_1='location=use_db_recovery_file_dest valid_for=(all_logfiles,all_roles) db_unique_name=cdb19st'
  set log_archive_dest_2='service=cdb19pr async valid_for=(online_logfiles,primary_role) db_unique_name=cdb19pr'
  set fal_client='cdb19st'
  set fal_server='cdb19pr'
  set cluster_database='false'
  set control_files='+DATA';
}

特にエラーがなければスタンバイデータベースの複製作業は終了。

複製に使用したリスナーは停止して削除しておく。

$ lsnrctl stop LISTENER_DUP
$ rm $ORACLE_HOME/network/admin/listener.ora

この時点ではまだデータベースはシングルインスタンスの状態であり、Clusterwareで管理されていないため、RACデータベースへの変更・クラスタリソースへの登録作業を行う。

パラメータをRAC構成に変更する。

SQL> alter system set cluster_database=TRUE scope=spfile;
SQL> alter system set instance_number=1 sid='cdb19st1' scope=spfile;
SQL> alter system set instance_number=2 sid='cdb19st2' scope=spfile;
SQL> alter system set thread=1 sid='cdb19st1' scope=spfile;
SQL> alter system set thread=2 sid='cdb19st2' scope=spfile;
SQL> alter system set undo_tablespace='UNDOTBS1' sid='cdb19st1' scope=spfile;
SQL> alter system set undo_tablespace='UNDOTBS2' sid='cdb19st2' scope=spfile;

ASM上にSPFILEを作成する。

SQL> create pfile='/tmp/pfile.ora' from spfile;
SQL> create spfile='+DATA' from pfile='/tmp/pfile.ora';

ASM上に作成されたSPFILEのパスを確認しておく。

$ asmcmd ls +data/cdb19st/parameterfile
spfile.321.1134225347

ここで、データベースは一旦シャットダウンする。

パスワードファイルをASM上に移動する。

$ asmcmd mkdir +DATA/CDB19ST/PASSWORD
$ asmcmd pwcopy --dbuniquename cdb19st /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwcdb19st1 +DATA/CDB19ST/PASSWORD/pwcdb19st

PRCD-1120、PRCR-1001、ASMCMD-9453 が出るが、クラスタリソースとしてまだ登録されていないためと思われるので無視。作成されたパスワードファイルのパスを確認しておく。

$ asmcmd ls +data/cdb19st/password
pwcdb19st
pwdcdb19st.320.1134227283

クラスタリソースにデータベースとインスタンスを追加する。

$ srvctl add database -db cdb19st -dbname cdb19pr -oraclehome /u01/app/oracle/product/19.0.0/dbhome_1 -role physical_standby -spfile +data/cdb19st/parameterfile/spfile.321.1134225347 -pwfile +DATA/CDB19ST/PASSWORD/pwdcdb19st.320.1134227283

$ srvctl add instance -db cdb19st -instance cdb19st1 -node racstb1.dn.home
$ srvctl add instance -db cdb19st -instance cdb19st2 -node racstb2.dn.home

データベースを起動する。

$ srvctl start database -db cdb19st

管理リカバリモードを開始し、プライマリとの同期が取れれば完成。

CDB構成のData Guardの注意点

SCAN経由でPDBに接続する場合、PDBがOPENしていないノードがあっても、お構いなしに接続に行きエラーになる。CDB自体がOPENしていない場合、SCANがリダイレクト対象から外してくれるが、PDBに関してはOPEN状態を考慮してくれないようだ。

コメント