Infra DevOps

インフラ構築のナレッジや、運用の自動簡易化に関する記事を書いていこうと思います

Oracle 12c環境下でのDataGuard構築

フィジカルスタンバイ構成でのDataGuardを構成。
それぞれなぜやっている手順か不明だったりしたので
手順に勝手な解釈入れて備忘録として記載。

■作業前提
・ホスト名はadg-01,adg-02でインスタンス名はそれぞれorcl01,orcl02
Oracle 12c環境
Oracleはnode1,node2でインストール済み
・DB作成自体はnode1のみで実施済み。node2のDBはrmanの複製で作る。

■作業手順
1.force loggingモード設定
  (node1)
  DataGuardがREDOを使った動機を行うため、nologgingによる更新で
 プライマリ、スタンバイ間での不整合を防ぐためだと思われる。

SQL> alter database force logging;

 


2.アーカイブログモード設定
  (node1)

SQL> archive log list;
SQL> alter database archivelog;


3.パスワードファイルをスタンバイ側に転送
  (node1)
 これをやらないと後続で実施するrmanによるスタンバイ側への接続が少なくともできない。
  /u01/app/oracle/product/12.1.0/dbhome_1/dbs/orapworcl01
  を
 /u01/app/oracle/product/12.1.0/dbhome_1/dbs/orapworcl02
 としてnode2に転送。


4.スタンバイREDOログファイル作成
  (node1)
 プライマリ側で実施しているが、最終的にDBの複製が行われるためスタンバイDB側にこのREDO設定が反映される。
 プライマリ側はスタンバイREDOログ不要っぽく感じるが、切替が発生した場合にプライマリ側も
 スタンバイとして動く可能性があるから作ると勝手に想像してる。
SQL> ALTER DATABASE ADD standby logfile
  2  group 4('/DATA/orcl01/stnby04.log') size 100M,
  3  group 5('/DATA/orcl01/stnby05.log') size 100M,
  4  group 6('/DATA/orcl01/stnby06.log') size 100M,
  5  group 7('/DATA/orcl01/stnby07.log') size 100M;


5.スタンバイ用pfile作成
  (node1)
  プライマリ側でパラメータファイル出力させることで、スタンバイ側の
 パラメータファイルを一からつくる手間を減らすためにやってるのかな。たぶん。
 スタンバイ用の初期化パラメータファイルを作成する理由は、
 とりあえずrmanのためのnomount状態での起動実現を確保するため。

SQL> create pfile from spfile;
を実行後に
  /u01/app/oracle/product/12.1.0/dbhome_1/dbs/initorcl01.ora
  を
 /u01/app/oracle/product/12.1.0/dbhome_1/dbs/initorcl02.ora
 としてnode2に転送。

■スタンバイデータベース側のpfile
.__data_transfer_cache_size=0
.__db_cache_size=1275068416
.__java_pool_size=16777216
.__large_pool_size=33554432
.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
.__pga_aggregate_target=1207959552
.__sga_target=1811939328
.__shared_io_pool_size=83886080
.__shared_pool_size=385875968
.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/orcl02/adump'
*.audit_trail='db'
*.compatible='12.1.0.2.0'
*.control_files='/DATA/orcl02/control01.ctl','/DATA/orcl02/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl01'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orcl02XDB)'
*.encrypt_new_tablespaces='DDL'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=2880m
*.nls_language='JAPANESE'
*.nls_territory='JAPAN'
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

###
# changing parameter for Data Guard
# refer https://docs.oracle.com/cd/E57425_01/121/SBYDB/create_ps.htm
###
*.db_unique_name='orcl02'
*.log_archive_config='dg_config=(orcl01,orcl02)'
*.log_archive_dest_1='LOCATION=/DATA/archive VALID_FOR=(all_logfiles,all_roles) DB_UNIQUE_NAME=orcl02'
*.log_archive_dest_2='SERVICE=orcl01 ASYNC VALID_FOR=(online_logfiles,primary_role) DB_UNIQUE_NAME=orcl01'
*.fal_server='orcl01'
*.db_file_name_convert='/DATA/orcl01','/DATA/orcl02'
*.log_file_name_convert='/DATA/orcl01','/DATA/orcl02'
*.standby_file_management='AUTO'

■プライマリデータベース側のpfile
.__data_transfer_cache_size=0
.__db_cache_size=1275068416
.__java_pool_size=16777216
.__large_pool_size=33554432
.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
.__pga_aggregate_target=1207959552
.__sga_target=1811939328
.__shared_io_pool_size=83886080
.__shared_pool_size=385875968
.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/orcl01/adump'
*.audit_trail='db'
*.compatible='12.1.0.2.0'
*.control_files='/DATA/orcl01/control01.ctl','/DATA/orcl01/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl01'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orcl01XDB)'
*.local_listener='LISTENER_ORCL01'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=2880m
*.nls_language='JAPANESE'
*.nls_territory='JAPAN'
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

###
# changing parameter for Data Guard
# refer https://docs.oracle.com/cd/E57425_01/121/SBYDB/create_ps.htm
###
*.log_archive_config='dg_config=(orcl02,orcl01)'
*.log_archive_dest_1='LOCATION=/DATA/archive VALID_FOR=(all_logfiles,all_roles) DB_UNIQUE_NAME=orcl01'
*.log_archive_dest_2='SERVICE=orcl02 ASYNC VALID_FOR=(online_logfiles,primary_role) DB_UNIQUE_NAME=orcl02'
*.remote_login_passwordfile='EXCLUSIVE'
*.fal_server='orcl02'
*.db_file_name_convert='/DATA/orcl02','/DATA/orcl01'
*.log_file_name_convert='/DATA/orcl02','/DATA/orcl01'
*.standby_file_management='AUTO'

6.スタンバイ側にlistner.oraファイルとtnsnames.oraファイル作成
(node2)
$ vi listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = adg-02)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (SID_NAME=orcl02)
      (ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1)
    )
  )

$ vi tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

ORCL01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = adg-01)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl01)
    )
  )

ORCL02 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = adg-02)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl02)
    )
  )

$ lsnrctl start

7.プライマリ側のtnsnames.oraファイル修正
$ vi tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_ORCL01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = adg-01.compute-a15933.oraclecloud.internal)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl01)
    )
  )

ORCL01 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = adg-01)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl01)
    )
  )

ORCL02 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = adg-02)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl02)
    )
  )

8.pfileからspfile作成
(node1,node2両方)
$ sqlplus / as sysdba
SQL> create spfile froafile;


9.rmanによる接続用にnomount起動
(node2)
!mkdir -p /u01/app/oracle/admin/orcl02/adump
!mkdir -p /DATA/orcl02/controlfile
startup nomount

10.rmanによる複製
(node1)
$ rman target 'sys/WS@orcl01' auxiliary 'sys/WS@orcl02'
RMAN> duplicate target database for standby from active database;


11.DBロールの確認
(node1,node2)
select database_role from v$database;
プライマリ側は
DATABASE_ROLE
----------------
PRIMARY
と表示されて
スタンバイ側は
DATABASE_ROLE
------------------------------------------------
PHYSICAL STANDBY
と表示されるはず。


11.REDO適用の開始
スタンバイ側をOPENでなおかつバックグラウンドでREDO適用が開始されるような状況にする。
(node2)
ALTER DATABASE OPEN ;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

SQL> select process,pid,status,thread#,sequence# from v$managed_standby where process='MRP0';

PROCESS
---------------------------
PID
------------------------------------------------------------------------
STATUS                                  THREAD#  SEQUENCE#
------------------------------------ ---------- ----------
MRP0
15497
APPLYING_LOG                                  1         22

SQL>  SELECT open_mode FROM v$database;

OPEN_MODE
------------------------------------------------------------
READ ONLY WITH APPLY