RACとRestartでDataGuard構成(Windows)

以下のようなDataGuard環境を作成する手順のメモ。

  • プライマリがRAC、スタンバイがRestart(スイッチオーバー/フェイルオーバー時は逆となる)
  • プライマリとスタンバイは別筐体
  • 高速リカバリ領域を使用
  • どちらもOracle Managed Files(OMF)でのファイル管理
  • データファイルなどの格納先ディスクグループ名はどちらも同一の「+DATA」
  • DB_NAMEとプライマリのDB_UNIQUE_NAMEはdb19p
  • スタンバイのDB_UNIQUE_NAMEはdb19s
  • OSがWindows
  • アクティブデータベース複製を使用

こんな構成をわざわざWindowsで行う酔狂なプロジェクトはそうそうないと思うが。

プライマリ側の設定

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

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

srvctl stop database -db db19p
srvctl start database -db db19p -startoption mount
alter database archivelog;
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
alter database add standby logfile thread 1 group 5  ('+DATA') size 200M;
alter database add standby logfile thread 1 group 6  ('+DATA') size 200M;
alter database add standby logfile thread 1 group 7  ('+DATA') size 200M;
alter database add standby logfile thread 2 group 8  ('+DATA') size 200M;
alter database add standby logfile thread 2 group 9  ('+DATA') size 200M;
alter database add standby logfile thread 2 group 10 ('+DATA') size 200M;

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

db19s =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = res19win)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db19s)
    )
  )

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

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

パスワードファイルをスタンバイに転送するため、ASMからファイルシステムへコピーする。

事前にASM上のファイル名を確認しておく。

C:\Users\Administrator\Desktop>asmcmd ls +data/db19p/password
pwddb19p.333.1112205315

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

asmcmd pwcopy +data/db19p/password/pwddb19p.333.1112205315 C:\work\backup

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

スタンバイ側の設定

プライマリで出力したパスワードファイルをスタンバイの %ORACLE_HOME%\database 配下にコピーしてリネームする(PWDdb19s.ora)
なお、Restartではパスワードファイルはファイルシステムに格納するため、後でASM上に移動する必要はない。

複製時に一時的に使用するリスナーを作成する。GridではなくDB側にlistener.oraを作成。

Grid側で起動しているリスナーと被らない別のポート番号を指定する必要があるので注意。

LISTENER_DUP =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = res19win)(PORT = 1525))
    )
  )

SID_LIST_LISTENER_DUP =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = db19s)
      (ORACLE_HOME = C:\app\oracle\product\19.0.0\dbhome_1)
      (SID_NAME = db19s)
    )
  )

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

lsnrctl start LISTENER_DUP

tnsnames.ora に動的構成用の設定とプライマリへの接続設定を追記。

db19p =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac19wscan.dn.home)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db19p)
    )
  )

LISTENER_DB19S =
  (ADDRESS = (PROTOCOL = TCP)(HOST = res19win)(PORT = 1521))

スタンバイのインスタンス用にWindowsサービスを作成する。

oradim -new -sid db19s -startmode manual

DB_NAMEだけ記載した初期化パラメータファイルを %ORACLE_HOME%\database\initdb19s.ora に作成する。

db_name='db19p'

必要なディレクトリを作成。監査ファイルの出力先。

mkdir %ORACLE_BASE%\admin\db19s\adump

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

set ORACLE_SID=db19s
sqlplus / as sysdba
startup nomount

RMANでDuplicateコマンドを実行し、スタンバイデータベースを作成する。この時、補助インスタンスの接続記述子には先ほど一時的に作成したリスナーを指定する。

スタンバイがRestartなので、set句を使って cluster_database を false にする。また、OMFを使用しているので control_files にはディスクグループ名だけを指定している(自動的に適切なパスに制御ファイルが作られる)。ディスクグループ名が同じであれば、db_file_name_convert や log_file_name_convert の指定も不要。

rman target sys/oracle@db19p auxiliary sys/oracle@res19win:1525/db19s

run {
  duplicate target database for standby from active database
  spfile
  parameter_value_convert 'db19p','db19s'
  set db_name='db19p'
  set db_unique_name='db19s'
  set log_archive_config='dg_config=(db19p,db19s)'
  set log_archive_dest_1='location=use_db_recovery_file_dest valid_for=(all_logfiles,all_roles) db_unique_name=db19s'
  set log_archive_dest_2='service=db19p async valid_for=(online_logfiles,primary_role) db_unique_name=db19p'
  set fal_client='db19s'
  set fal_server='db19p'
  set control_files='+DATA'
  set cluster_database='false'
  set local_listener='LISTENER_DB19S';
}

特にエラーがなければスタンバイデータベースの複製作業は終了。ただし、この時点ではまだデータベースがRestartで管理されていないため、続けてクラスタリソースへの登録作業を行う。

SPFILEをASM上に作成する。

create spfile='+DATA' from memory;

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

C:\Users\Administrator\Desktop>asmcmd ls +data/db19s/parameterfile
spfile.283.1112212969

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

srvctl add database -db db19s -dbname db19p -oraclehome C:\app\oracle\product\19.0.0\dbhome_1 -role physical_standby -spfile +data/db19s/parameterfile/spfile.283.1112212969 -diskgroup "DATA"

crsctl stat res -t でリソースが追加されたことを確認する。追加直後はsrvctlコマンドでインスタンスの操作ができないようなので、sqlplus でインスタンスを一度停止してから、srvctl で起動できることを確認すれば作業は完了。

最後に、複製用に使ったリスナーを停止して設定(listener.ora)を削除しておく。

lsnrctl stop LISTENER_DUP

コメント