Active Data Guard の検証 その1(環境構築編)
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)機能を確認します。