Active Data Guard の検証 その1(環境構築編)

投稿日: 2011年4月28日

Active Data Guard とは、Physical Standby データべースを READ ONLY でオープンして利用できるという 11g からの新機能です。
先日参加した IOUG のセッションの中で、自分が最も興味を持った機能「Automatic Block Repair(ABR)」が動作する条件が Active Data Guard ということなので、まずは Active Data Guard 環境を構築したいと思います。

尚、過去の「おら! オラ! Oracle」では RMAN のバックアップから Standby データべースを構築していましたが、今回は RMAN の duplicate コマンドを使って構築してみます。
これ、とっても楽ちんです♪

■検証環境

【Primary】
OS      :RHEL5.5
hostname:srv1
Oracle  :11.2.0.2
SID     :dg112(シングルインスタンスの DB として構築済)

【Standby】
OS      :RHEL5.5
hostname:srv2
Oracle  :11.2.0.2(ソフトウェアのみインストール済)
SID     :db112as(未構成)

■準備1(ディレクトリ作成、Oracle*Net 環境設定)

【Standby】

Physical Standby の SID を静的登録するリスナーを構成し、起動する。

$ vi $ORACLE_HOME/network/admin/listener.ora
$ lsnrctl start LISTENER_DG
LISTENER_DG=
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=srv2)(PORT=1522))
  )

SID_LIST_LISTENER_DG=
  (SID_DESC=
    (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)
    (SID_NAME=dg112as)
  )

【Primary & Standby】

Primary & Standby 接続用のネットサービス名を構成する。

$ vi $ORACLE_HOME/network/admin/tnsnames.ora
DG112 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = srv1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dg112)
    )
  )

DG112AS =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = srv2)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dg112as)
    )
  )

■準備2(DB 環境設定)

【Primary】

初期化パラメータファイル(pfile)を作成する。

$ export ORACLE_SID=dg112
$ sqlplus / as sysdba

SQL> create pfile from spfile;

ファイルが作成されました。

SQL> exit

初期化パラメータファイル(pfile)を編集する。

$ vi $ORACLE_HOME/dbs/initdg112.ora
audit_file_dest='/u01/app/oracle/admin/dg112/adump'
audit_trail='db'
compatible='11.2.0.0.0'
control_files='/u01/app/oracle/oradata/DG112/controlfile/o1_mf_6vc2m3tz_.ctl'
db_block_size=8192
db_create_file_dest='/u01/app/oracle/oradata'
db_domain=''
db_name='dg112'
db_unique_name='dg112'
diagnostic_dest='/u01/app/oracle'
memory_target=838860800
nls_language='JAPANESE'
nls_territory='JAPAN'
open_cursors=300
processes=150
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
##### for Data Guard #####
log_archive_config='dg_config=(dg112,dg112as)'
log_archive_dest_1='location=/u01/app/oracle/oradata/DG112/arch VALID_FOR=(all_logfiles,all_roles) DB_UNIQUE_NAME=dg112'
log_archive_dest_2='SERVICE=dg112as LGWR SYNC VALID_FOR=(online_logfile,primary_role) DB_UNIQUE_NAME=dg112as REOPEN=30'
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
db_file_name_convert='/u01/app/oracle/oradata/DG112AS/datafile/','/u01/app/oracle/oradata/DG112/datafile/'
log_file_name_convert='/u01/app/oracle/oradata/DG112AS/onlinelog/','/u01/app/oracle/oradata/DG112/onlinelog/'
fal_server=dg112as
fal_client=dg112
standby_file_management='AUTO'

初期化パラメータファイル(pfile)とパスワードファイルをスタンバイ環境にコピーする。

$ scp -p $ORACLE_HOME/dbs/initdg112.ora srv2:$ORACLE_HOME/dbs/initdg112as.ora
$ scp -p $ORACLE_HOME/dbs/orapwdg112 srv2:$ORACLE_HOME/dbs/orapwdg112as

修正した pfile から spfile を作成する。

$ sqlplus / as sysdba

SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。

SQL> create spfile from pfile;

ファイルが作成されました。

アーカイブログモードに設定する。

SQL> startup mount
ORACLEインスタンスが起動しました。

Total System Global Area  835104768 bytes
Fixed Size                  2231088 bytes
Variable Size             490734800 bytes
Database Buffers          335544320 bytes
Redo Buffers                6594560 bytes
データベースがマウントされました。

SQL> alter database archivelog;

データベースが変更されました。

SQL> archive log list;
データベース・ログ・モード     アーカイブ・モード
自動アーカイブ                 有効
アーカイブ先                    /u01/app/oracle/oradata/DG112/arch
最も古いオンライン・ログ順序   46
アーカイブする次のログ順序    48
現行のログ順序               48

SQL> alter database open;

データベースが変更されました。

強制ロギングモードにする。

SQL> alter database force logging;

データベースが変更されました。

SQL> select force_logging from v$database;

FORCE_LOG
---------
YES
SQL> exit

【Standby】

必要なディレクトリ(データベースファイルの格納先、及び adump)を作成する。

$ mkdir -p /u01/app/oracle/oradata/DG112AS/arch
$ mkdir -p /u01/app/oracle/oradata/DG112AS/controlfile
$ mkdir -p /u01/app/oracle/oradata/DG112AS/datafile
$ mkdir -p /u01/app/oracle/oradata/DG112AS/onlinelog
$ mkdir -p /u01/app/oracle/oradata/DG112AS/standbylog
$ mkdir -p /u01/app/oracle/admin/dg112as/adump

プライマリDBからコピーした初期化パラメータファイル(pfile)を編集する。

$ vi $ORACLE_HOME/dbs/initdg112as.ora
audit_file_dest='/u01/app/oracle/admin/dg112as/adump'
audit_trail='db'
compatible='11.2.0.0.0'
control_files='/u01/app/oracle/oradata/DG112AS/controlfile/o1_mf_6vc2m3tz_.ctl'
db_block_size=8192
db_create_file_dest='/u01/app/oracle/oradata'
db_domain=''
db_name='dg112'
db_unique_name='dg112as'
diagnostic_dest='/u01/app/oracle'
memory_target=838860800
nls_language='JAPANESE'
nls_territory='JAPAN'
open_cursors=300
processes=150
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
##### for Data Guard
log_archive_config='dg_config=(dg112,dg112as)'
log_archive_dest_1='location=/u01/app/oracle/oradata/DG112AS/arch VALID_FOR=(all_logfiles,all_roles) DB_UNIQUE_NAME=dg112as'
log_archive_dest_2='SERVICE=dg112 ASYNC VALID_FOR=(online_logfiles,primary_role) DB_UNIQUE_NAME=dg112'
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
db_file_name_convert='/u01/app/oracle/oradata/DG112/datafile/','/u01/app/oracle/oradata/DG112AS/datafile/'
log_file_name_convert='/u01/app/oracle/oradata/DG112/onlinelog/','/u01/app/oracle/oradata/DG112AS/onlinelog/'
fal_server='dg112'
fal_client='dg112as'
standby_file_management='AUTO'
※網掛け箇所が Primary との相違箇所

インスタンスを nomount で起動する。

$ export ORACLE_SID=dg112as
$ sqlplus / as sysdba

SQL> startup nomount
ORACLEインスタンスが起動しました。

Total System Global Area  835104768 bytes
Fixed Size                  2231088 bytes
Variable Size             490734800 bytes
Database Buffers          335544320 bytes
Redo Buffers                6594560 bytes

■構築

ちょっと準備が面倒でした。。。
ここからはとっても簡単です。

【Primary】

まず、RMAN で Primary と Standby データベースに接続します。

$ rman target sys/password@dg112 auxiliary sys/password@dg112as

Recovery Manager: Release 11.2.0.2.0 - Production on 水 4月 26 22:30:21 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

ターゲット・データベース: DG112 (データベースID=2642084339)に接続されました
補助データベース: DG112に接続されました(マウントされていません)

RMAN>

次に duplicate コマンドで Standby データベースを作成します。

RMAN> duplicate target database for standby from active database;

Primary と Standby のデータファイル名が同じ(同じディレクトリ構成)になる場合、nofilenamecheck オプションを付けます。
(今回はディレクトリ構成が異なる為、nofilenamecheck オプションは付けていません。)

duplicate コマンドの詳細は、以下のマニュアルを参照下さい。
DUPLICATEコマンドを使用したスタンバイ・データベースの作成

RMAN> duplicate target database for standby from active database;

Duplicate Dbが開始されました(開始時間: 11-04-26)
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_AUX_DISK_1が割り当てられました
チャネルORA_AUX_DISK_1: SID=137 デバイス・タイプ=DISK

メモリー・スクリプトの内容:
{
   backup as copy reuse
   targetfile  '/u01/app/oracle/product/11.2.0/db_1/dbs/orapwdg112' auxiliary format
 '/u01/app/oracle/product/11.2.0/db_1/dbs/orapwdg112as'   ;
}
メモリー・スクリプトを実行しています

backupが開始されました(開始時間: 11-04-26)
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=17 デバイス・タイプ=DISK
backupが完了しました(完了時間: 11-04-26)

メモリー・スクリプトの内容:
{
   backup as copy current controlfile for standby auxiliary format  '/u01/app/oracle/oradata/DG112AS/controlfile/o1_mf_6vc2m3tz_.ctl';
   sql clone "create spfile from memory";
   shutdown clone immediate;
   startup clone nomount;
   sql clone "alter system set  control_files =
  ''/u01/app/oracle/oradata/DG112AS/controlfile/o1_mf_6vc2m3tz_.ctl'' comment=
 ''Set by RMAN'' scope=spfile";
   shutdown clone immediate;
   startup clone nomount;
}
メモリー・スクリプトを実行しています

backupが開始されました(開始時間: 11-04-26)
チャネルORA_DISK_1の使用
チャネルORA_DISK_1: データファイルのコピーを開始しています
スタンバイ制御ファイルをコピー中です
出力ファイル名=/u01/app/oracle/product/11.2.0/db_1/dbs/snapcf_dg112.f タグ=TAG20110426T223039 レコードID=9 スタンプ=749644239
チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:01
backupが完了しました(完了時間: 11-04-26)

SQL文: create spfile from memory

Oracleインスタンスがシャットダウンしました

補助データベースに接続されました(開始されていません)
Oracleインスタンスが起動しました

システム・グローバル領域の合計は、    835104768バイトです。

Fixed Size                     2231088バイト
Variable Size                494929104バイト
Database Buffers             331350016バイト
Redo Buffers                   6594560バイト

SQL文: alter system set  control_files =   ''/u01/app/oracle/oradata/DG112AS/controlfile/o1_mf_6vc2m3tz_.ctl'' comment= ''Set by RMAN'' scope=spfile

Oracleインスタンスがシャットダウンしました

補助データベースに接続されました(開始されていません)
Oracleインスタンスが起動しました

システム・グローバル領域の合計は、    835104768バイトです。

Fixed Size                     2231088バイト
Variable Size                494929104バイト
Database Buffers             331350016バイト
Redo Buffers                   6594560バイト

メモリー・スクリプトの内容:
{
   sql clone 'alter database mount standby database';
}
メモリー・スクリプトを実行しています

SQL文: alter database mount standby database

メモリー・スクリプトの内容:
{
   set newname for tempfile  1 to
 "/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_temp_6vc2nrm3_.tmp";
   switch clone tempfile all;
   set newname for datafile  1 to
 "/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_system_6vc2mc9p_.dbf";
   set newname for datafile  2 to
 "/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_sysaux_6vc2n6qh_.dbf";
   set newname for datafile  3 to
 "/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_undotbs1_6vc2nn0p_.dbf";
   set newname for datafile  4 to
 "/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_users_6vhs4xvr_.dbf";
   backup as copy reuse
   datafile  1 auxiliary format
 "/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_system_6vc2mc9p_.dbf"   datafile
 2 auxiliary format
 "/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_sysaux_6vc2n6qh_.dbf"   datafile
 3 auxiliary format
 "/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_undotbs1_6vc2nn0p_.dbf"   datafile
 4 auxiliary format
 "/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_users_6vhs4xvr_.dbf"   ;
   sql 'alter system archive log current';
}
メモリー・スクリプトを実行しています

実行コマンド: SET NEWNAME

制御ファイルで一時ファイル1の名前を/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_temp_6vc2nrm3_.tmpに変更しました

実行コマンド: SET NEWNAME

実行コマンド: SET NEWNAME

実行コマンド: SET NEWNAME

実行コマンド: SET NEWNAME

backupが開始されました(開始時間: 11-04-26)
チャネルORA_DISK_1の使用
チャネルORA_DISK_1: データファイルのコピーを開始しています
入力データファイル・ファイル番号=00001 名前=/u01/app/oracle/oradata/DG112/datafile/o1_mf_system_6vc2mc9p_.dbf
出力ファイル名=/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_system_6vc2mc9p_.dbf タグ=TAG20110426T223123
チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:36
チャネルORA_DISK_1: データファイルのコピーを開始しています
入力データファイル・ファイル番号=00002 名前=/u01/app/oracle/oradata/DG112/datafile/o1_mf_sysaux_6vc2n6qh_.dbf
出力ファイル名=/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_sysaux_6vc2n6qh_.dbf タグ=TAG20110426T223123
チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:25
チャネルORA_DISK_1: データファイルのコピーを開始しています
入力データファイル・ファイル番号=00003 名前=/u01/app/oracle/oradata/DG112/datafile/o1_mf_undotbs1_6vc2nn0p_.dbf
出力ファイル名=/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_undotbs1_6vc2nn0p_.dbf タグ=TAG20110426T223123
チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:07
チャネルORA_DISK_1: データファイルのコピーを開始しています
入力データファイル・ファイル番号=00004 名前=/u01/app/oracle/oradata/DG112/datafile/o1_mf_users_6vhs4xvr_.dbf
出力ファイル名=/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_users_6vhs4xvr_.dbf タグ=TAG20110426T223123
チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:01
backupが完了しました(完了時間: 11-04-26)

SQL文: alter system archive log current

メモリー・スクリプトの内容:
{
   switch clone datafile all;
}
メモリー・スクリプトを実行しています

データファイル1はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=9 スタンプ=749644355 ファイル名=/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_system_6vc2mc9p_.dbf
データファイル2はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=10 スタンプ=749644355 ファイル名=/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_sysaux_6vc2n6qh_.dbf
データファイル3はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=11 スタンプ=749644355 ファイル名=/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_undotbs1_6vc2nn0p_.dbf
データファイル4はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=12 スタンプ=749644355 ファイル名=/u01/app/oracle/oradata/DG112AS/datafile/o1_mf_users_6vhs4xvr_.dbf
Duplicate Dbが完了しました(完了時間: 11-04-26)

【Standby】

duplicate が完了すると、Standby データベースが mount 状態で起動します。
インスタンスに接続し、Standby Redo ログファイルを構成します。

※ Standby Redo ログのグループは、Primary のグループ数 + 1 とします。
今回は Primary のグループ数は 3 の為、4 グループ作成します。
また、サイズは Primary と同じサイズにします。

$ sqlplus / as sysdba

SQL> select database_role,open_mode from v$database;

DATABASE_ROLE      OPEN_MODE
------------------ ---------------------
PHYSICAL STANDBY   MOUNTED

SQL> alter database add standby logfile
     group 4 '/u01/app/oracle/oradata/DG112AS/standbylog/standbyredo04.log' size 50M,
     group 5 '/u01/app/oracle/oradata/DG112AS/standbylog/standbyredo05.log' size 50M,
     group 6 '/u01/app/oracle/oradata/DG112AS/standbylog/standbyredo06.log' size 50M,
     group 7 '/u01/app/oracle/oradata/DG112AS/standbylog/standbyredo07.log' size 50M;

データベースが変更されました。

【Primary】

Primary にも Standby Redo ログファイルを構成します。

$ mkdir /u01/app/oracle/oradata/DG112/standbylog
$ sqlplus / as sysdba

SQL> alter database add standby logfile
     group 4 '/u01/app/oracle/oradata/DG112/standbylog/standbyredo04.log' size 50M,
     group 5 '/u01/app/oracle/oradata/DG112/standbylog/standbyredo05.log' size 50M,
     group 6 '/u01/app/oracle/oradata/DG112/standbylog/standbyredo06.log' size 50M,
     group 7 '/u01/app/oracle/oradata/DG112/standbylog/standbyredo07.log' size 50M;

データベースが変更されました。

【Standby】

Active Data Guard は READ ONLY でオープンして利用できるというものです。
データベースをオープンした状態で管理リカバリモードを開始します。

SQL> alter database open;

データベースが変更されました。

SQL> alter database recover managed standby database
     using current logfile disconnect from session;

データベースが変更されました。

SQL> select database_role,open_mode from v$database;

DATABASE_ROLE      OPEN_MODE
------------------ ---------------------
PHYSICAL STANDBY   READ ONLY WITH APPLY

OPEN_MODE が “READ ONLY WITH APPLY” となっています。
これで完成!

簡単に動作を確認してみます。
まずは、アーカイブ適用状況の確認。

【Primary】

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
            57

SQL> alter system archive log current;

システムが変更されました。

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
            58

【Standby】

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
            58

アーカイブの最終シーケンス番号が同じ(=アーカイブの同期が取れている)。

次に DML。

【Primary】

SQL> create table test_tab1 (col1 number) tablespace users;

表が作成されました。

SQL> insert into test_tab1 values (999);

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> select * from test_tab1;

COL1
----------
999

1行が選択されました。

【Standby】

SQL> select * from test_tab1;

COL1
----------
999

1行が選択されました。

Standby 環境から Primary 環境と同じデータを読むことが出来ました!

次回、魅惑(?)の Automatic Block Repair(ABR)機能を確認します。