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 を静的登録するリスナーを構成し、起動する。
[perl gutter=”false”]
$ vi $ORACLE_HOME/network/admin/listener.ora
$ lsnrctl start LISTENER_DG
[/perl]
[perl collapse=”true” title=”今回設定したリスナー定義の詳細はここをクリック” classname=”titleHidden” gutter=”false”]
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)
)
[/perl]
【Primary & Standby】
Primary & Standby 接続用のネットサービス名を構成する。
[perl gutter=”false”]
$ vi $ORACLE_HOME/network/admin/tnsnames.ora
[/perl]
[perl collapse=”true” title=”今回設定したネットサービス定義の詳細はここをクリック” classname=”titleHidden” gutter=”false”]
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)
)
)
[/perl]
■準備2(DB 環境設定)
【Primary】
初期化パラメータファイル(pfile)を作成する。
[sql gutter=”false”]
$ export ORACLE_SID=dg112
$ sqlplus / as sysdba
SQL> create pfile from spfile;
ファイルが作成されました。
SQL> exit
[/sql]
初期化パラメータファイル(pfile)を編集する。
[perl gutter=”false”]
$ vi $ORACLE_HOME/dbs/initdg112.ora
[/perl]
[perl collapse=”true” title=”今回設定したパラメータ(primary 用)の詳細はこちらをクリック” classname=”titleHidden” gutter=”false”]
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’
[/perl]
初期化パラメータファイル(pfile)とパスワードファイルをスタンバイ環境にコピーする。
[perl gutter=”false”]
$ scp -p $ORACLE_HOME/dbs/initdg112.ora srv2:$ORACLE_HOME/dbs/initdg112as.ora
$ scp -p $ORACLE_HOME/dbs/orapwdg112 srv2:$ORACLE_HOME/dbs/orapwdg112as
[/perl]
修正した pfile から spfile を作成する。
[sql gutter=”false”]
$ sqlplus / as sysdba
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> create spfile from pfile;
ファイルが作成されました。
[/sql]
アーカイブログモードに設定する。
[sql gutter=”false”]
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]
強制ロギングモードにする。
[sql gutter=”false”]
SQL> alter database force logging;
データベースが変更されました。
SQL> select force_logging from v$database;
FORCE_LOG
———
YES
SQL> exit
[/sql]
【Standby】
必要なディレクトリ(データベースファイルの格納先、及び adump)を作成する。
[perl gutter=”false”]
$ 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
[/perl]
プライマリDBからコピーした初期化パラメータファイル(pfile)を編集する。
[perl gutter=”false”]
$ vi $ORACLE_HOME/dbs/initdg112as.ora
[/perl]
[perl collapse=”true” title=”今回設定したパラメータ(standby 用)の詳細はこちらをクリック” classname=”titleHidden” highlight=”1,4,9,20,21,24-27″ gutter=”false”]
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 との相違箇所
[/perl]
インスタンスを nomount で起動する。
[sql gutter=”false”]
$ 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
[/sql]
■構築
ちょっと準備が面倒でした。。。
ここからはとっても簡単です。
【Primary】
まず、RMAN で Primary と Standby データベースに接続します。
[perl gutter=”false”]
$ 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>
[/perl]
次に duplicate コマンドで Standby データベースを作成します。
[sql gutter=”false”]
RMAN> duplicate target database for standby from active database;
[/sql]
Primary と Standby のデータファイル名が同じ(同じディレクトリ構成)になる場合、nofilenamecheck オプションを付けます。
(今回はディレクトリ構成が異なる為、nofilenamecheck オプションは付けていません。)
duplicate コマンドの詳細は、以下のマニュアルを参照下さい。
DUPLICATEコマンドを使用したスタンバイ・データベースの作成
[perl collapse=”true” title=”duplicate の実行ログを確認したい場合はここをクリック” classname=”titleHidden” gutter=”false”]
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)
[/perl]
【Standby】
duplicate が完了すると、Standby データベースが mount 状態で起動します。
インスタンスに接続し、Standby Redo ログファイルを構成します。
※ Standby Redo ログのグループは、Primary のグループ数 + 1 とします。
今回は Primary のグループ数は 3 の為、4 グループ作成します。
また、サイズは Primary と同じサイズにします。
[sql gutter=”false”]
$ 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;
データベースが変更されました。
[/sql]
【Primary】
Primary にも Standby Redo ログファイルを構成します。
[sql gutter=”false”]
$ 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;
データベースが変更されました。
[/sql]
【Standby】
Active Data Guard は READ ONLY でオープンして利用できるというものです。
データベースをオープンした状態で管理リカバリモードを開始します。
[sql gutter=”false”]
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
[/sql]
OPEN_MODE が “READ ONLY WITH APPLY” となっています。
これで完成!
簡単に動作を確認してみます。
まずは、アーカイブ適用状況の確認。
【Primary】
[sql gutter=”false”]
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
[/sql]
【Standby】
[sql gutter=”false”]
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
————–
58
[/sql]
アーカイブの最終シーケンス番号が同じ(=アーカイブの同期が取れている)。
次に DML。
【Primary】
[sql gutter=”false”]
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行が選択されました。
[/sql]
【Standby】
[sql gutter=”false”]
SQL> select * from test_tab1;
COL1
———-
999
1行が選択されました。
[/sql]
Standby 環境から Primary 環境と同じデータを読むことが出来ました!
次回、魅惑(?)の Automatic Block Repair(ABR)機能を確認します。