#topicpath
#contents
* 目的 [#bdef7125]
- DataGuard でフィジカルスタンバイデータベースの構築
- REDOのリアルタイム適用
- スイッチオーバー
- スナップショットスタンバイ
* 環境 [#ab15326f]
- CentOS 5.3(x86_64) + 11gR2
- インスタンス
-- primary: orcl
--- data: /u02/oradata/orcl/
--- archive: /u02/oradata/arch/orcl/
-- standby: orclsby
--- data: /u02/oradata/orclsby/
--- archive: /u02/oradata/arch/orclsby/
* 参考文献 [#s274b5b5]
- [[Oracle Data Guard 概要および管理 11gリリース1(11.1):http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05755-03/toc.htm]]
- [[Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド 11g リリース1(11.1):http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/backup.111/E05700-03/toc.htm]]
* 準備 [#f2adc44a]
** 3.1.1 強制ロギングの有効化 [#s1b8c709]
#pre{{
SQL> alter database force logging;
データベースが変更されました。
}}
** 3.1.2 REDO転送の認証の構成 [#r7250528]
パスワードファイル認証。
- $ORACLE_HOME/network/admin/listener.ora
- $ORACLE_HOME/network/admin/tnsnames.ora
- $ORACLE_HOME/dbs/orapworcl
#pre{{
[oracle@ora1 ~]$ sqlplus sys/oracle@orcl as sysdba
(接続できることを確認)
}}
** 3.1.4 プライマリ・データベースの初期化パラメータの構成 [#vdc8db43]
マニュアルに従って書きます。
spfile にしてあるので pfile を作ります。
#pre{{
SQL> create pfile from spfile;
ファイルが作成されました。
}}
$ORACLE_HOME/dbs/initorcl.ora に作成されるので、
これを編集します。
空行より下の行が今回追記したところですが、
その上の spfile から作ったところも必要があれば変更します。
#pre{{
orcl.__oracle_base='/u01/app/oracle'
orcl.__shared_io_pool_size=0
orcl.__streams_pool_size=0
*.audit_file_dest='/u02/oradata/admin/orcl/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u02/oradata/orcl/control01.ctl','/u02/oradata/orcl/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/u02/oradata/flash_recovery_area'
*.db_recovery_file_dest_size=4294967296
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.memory_target=500M
*.nls_language='JAPANESE'
*.nls_territory='JAPAN'
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
log_archive_config='DG_CONFIG=(orcl,orclsby)'
log_archive_dest_1=
'LOCATION=/u02/oradata/arch/orcl/
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=orcl'
log_archive_dest_2=
'SERVICE=orclsby ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=orclsby'
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
log_archive_format=%t_%s_%r.arc
log_archive_max_processes=30
fal_server=orclsby
fal_client=orcl
db_file_name_convert='/u02/oradata/orclsby/','/u02/oradata/orcl/'
log_file_name_convert='/u02/oradata/arch/orclsby/','/u02/oradata/arch/orcl/'
standby_file_management=AUTO
}}
** 3.1.5 アーカイブの有効化 [#ab8dc2b0]
pfileを指定して起動します。
NOARCHIVELOGモードだったので変更します。
#pre{{
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup mount pfile=$ORACLE_HOME/dbs/initorcl.ora
ORACLEインスタンスが起動しました。
Total System Global Area 521936896 bytes
Fixed Size 2214936 bytes
Variable Size 314573800 bytes
Database Buffers 201326592 bytes
Redo Buffers 3821568 bytes
データベースがマウントされました。
SQL> alter database archivelog;
データベースが変更されました。
SQL> alter database open;
データベースが変更されました。
SQL>
}}
アーカイブログが作られていることを確認します。
#pre{{
SQL> !ls /u02/oradata/arch/orcl/
1_6_697420466.arc 1_7_697420466.arc
SQL> alter system switch logfile;
システムが変更されました。
SQL> !ls /u02/oradata/arch/orcl/
1_6_697420466.arc 1_7_697420466.arc 1_8_697420466.arc
SQL>
}}
#pre{{
SQL> archive log list
データベース・ログ・モード アーカイブ・モード
自動アーカイブ 有効
アーカイブ先 /u02/oradata/arch/orcl/
最も古いオンライン・ログ順序 7
アーカイブする次のログ順序 9
現行のログ順序 9
SQL> alter system switch logfile;
システムが変更されました。
SQL> archive log list
データベース・ログ・モード アーカイブ・モード
自動アーカイブ 有効
アーカイブ先 /u02/oradata/arch/orcl/
最も古いオンライン・ログ順序 8
アーカイブする次のログ順序 10
現行のログ順序 10
SQL>
}}
正しくアーカイブログモードになっていることが確認できたら、
spfile にして起動しなおしておきます。
#pre{{
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> create spfile from pfile;
ファイルが作成されました。
SQL> startup
ORACLEインスタンスが起動しました。
Total System Global Area 521936896 bytes
Fixed Size 2214936 bytes
Variable Size 314573800 bytes
Database Buffers 201326592 bytes
Redo Buffers 3821568 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL>
}}
* フィジカルスタンバイデータベースの構築 [#x824cabc]
** orclsby インスタンスの設定 [#v376ab1a]
インスタンスが上がるだけのものを作っておきます。
*** 初期化パラメータファイルの作成 [#o8e11b09]
initorcl.ora からコピーして作ります。
orcl → orclsby のものと、orclsby → orcl のものが
混在しているので注意しましょう。
#pre{{
[oracle@ora1 2_DataGuard]$ cat initorclsby.ora
orclsby.__oracle_base='/u01/app/oracle'
orclsby.__shared_io_pool_size=0
orclsby.__streams_pool_size=0
*.audit_file_dest='/u02/oradata/admin/orclsby/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u02/oradata/orclsby/control01.ctl','/u02/oradata/orclsby/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/u02/oradata/flash_recovery_area'
*.db_recovery_file_dest_size=4294967296
*.db_unique_name='orclsby'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.memory_target=500M
*.nls_language='JAPANESE'
*.nls_territory='JAPAN'
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
*.log_archive_config='DG_CONFIG=(orcl,orclsby)'
*.log_archive_dest_1='LOCATION=/u02/oradata/arch/orclsby/
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=orclsby'
*.log_archive_dest_2='SERVICE=orcl ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=orcl'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_archive_format='%t_%s_%r.arc'
*.log_archive_max_processes=30
*.fal_server='orcl'
*.fal_client='orclsby'
*.db_file_name_convert='/u02/oradata/orcl/','/u02/oradata/orclsby/'
*.log_file_name_convert='/u02/oradata/orcl/','/u02/oradata/orclsby/'
*.standby_file_management='AUTO'
}}
*** パスワードファイルの作成 [#vb64ecc4]
#pre{{
[oracle@ora1 2_DataGuard]$ orapwd file=$ORACLE_HOME/dbs/orapworclsby
Enter password for SYS:
}}
*** ディレクトリの作成 [#n70f063b]
orclsby 用の必要なディレクトリも作っておきます。
#pre{{
[oracle@ora1 2_DataGuard]$ mkdir -p /u02/oradata/admin/orclsby/adump
[oracle@ora1 2_DataGuard]$ mkdir -p /u02/oradata/orclsby
[oracle@ora1 2_DataGuard]$ mkdir -p /u02/oradata/arch/orclsby
}}
** ネットワークの設定 [#h1af7a45]
listener.ora と tnsnames.ora を編集して、
@orclsby でアクセスできるようにします。
*** $ORACLE_HOME/network/admin/listener.ora [#x24fea1c]
#pre{{
LISTENER =
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=ora1)(PORT=1521))
(ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY)))
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=orcl)
(SID_NAME=orcl)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1))
(SID_DESC=
(GLOBAL_DBNAME=orclsby)
(SID_NAME=orclsby)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)))
}}
*** $ORACLE_HOME/network/admin/tnsnames.ora [#g13fda5e]
#pre{{
orcl=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=ora1)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=orcl)))
orclsby=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=ora1)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=orclsby)))
}}
編集したら設定を読み込みます。
#pre{{
[oracle@ora1 2_DataGuard]$ lsnrctl reload
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 12-9月 -2009 17:09:34
Copyright (c) 1991, 2009, Oracle. All rights reserved.
(ADDRESS=(PROTOCOL=tcp)(HOST=ora1)(PORT=1521))に接続中
コマンドは正常に終了しました。
}}
** orclsby インスタンスの起動 [#c64d739b]
リスナー経由でアクセスできることと、
NOMOUNTで起動できることを確認しておきます。
#pre{{
[oracle@ora1 2_DataGuard]$ sqlplus sys/oracle@orclsby as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 日 9月 13 01:42:32 2009
Copyright (c) 1982, 2009, Oracle. All rights reserved.
アイドル・インスタンスに接続しました。
SQL> startup nomount pfile=$ORACLE_HOME/dbs/initorclsby.ora
ORACLEインスタンスが起動しました。
Total System Global Area 521936896 bytes
Fixed Size 2214936 bytes
Variable Size 314573800 bytes
Database Buffers 201326592 bytes
Redo Buffers 3821568 bytes
SQL>
}}
これは spfile にしてはいけません。
** データベースの複製 [#c2597cc8]
RMANのマニュアルにあるサンプルを利用して、
RMANのスクリプトを用意しておきます。
初期化パラメータファイルはもう設定してあるため、
ここは簡単になっています。
#pre{{
[oracle@ora1 2_DataGuard]$ cat rman.txt
run {
duplicate target database
for standby
from active database
db_file_name_convert '/u02/oradata/orcl/','/u02/oradata/orclsby/'
;
}
}}
rman で両方のインスタンスに接続して、
このスクリプトを流します。
#pre{{
[oracle@ora1 2_DataGuard]$ rman
Recovery Manager: Release 11.2.0.1.0 - Production on 日 9月 13 01:55:30 2009
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
RMAN> connect target sys/oracle@orcl
ターゲット・データベース: ORCL (データベースID=1225201194)に接続されました
RMAN> connect auxiliary sys/oracle@orclsby
補助データベースに接続されました(開始されていません)
RMAN> @rman.txt
...
データファイル1はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=5 スタンプ=697430331 ファイル名=/u02/oradata/orclsby/system01.dbf
データファイル2はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=6 スタンプ=697430331 ファイル名=/u02/oradata/orclsby/sysaux01.dbf
データファイル3はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=7 スタンプ=697430331 ファイル名=/u02/oradata/orclsby/undotbs01.dbf
データファイル4はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=8 スタンプ=697430331 ファイル名=/u02/oradata/orclsby/users01.dbf
データファイル5はデータファイル・コピーに切り替えられました
入力データファイル・コピー レコードID=9 スタンプ=697430331 ファイル名=/u02/oradata/orclsby/example01.dbf
Duplicate Dbが完了しました(完了時間: 09-09-13)
RMAN>
RMAN> **end-of-file**
}}
ここまでできたらインスタンスを止めて、
一貫性バックアップを取っておくといいと思います。
#pre{{
SQL> shutdown immediate
ORA-01109: データベースがオープンされていません。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> create spfile from pfile;
ファイルが作成されました。
}}
** 3.2.6 フィジカルスタンバイデータベースの起動 [#w2c5ceec]
orclsby を MOUNT で起動します。
ここでは1つのサーバに2つインスタンスを立ち上げているので、
メモリが足りないと言われたら
[[メモリの設定>技術文書/Oracle/11g/メモリの設定]] を見直してください。
#pre{{
[oracle@ora1 2_DataGuard]$ sqlplus sys/oracle@orclsby as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 土 9月 12 19:19:08 2009
Copyright (c) 1982, 2009, Oracle. All rights reserved.
アイドル・インスタンスに接続しました。
SQL> startup mount
ORACLEインスタンスが起動しました。
Total System Global Area 521936896 bytes
Fixed Size 2214936 bytes
Variable Size 314573800 bytes
Database Buffers 201326592 bytes
Redo Buffers 3821568 bytes
データベースがマウントされました。
SQL>
}}
*** 3.2.6 → 6.2.3 スタンバイREDOログの作成 [#i561f4e3]
スタンバイREDOログを作っておきます。
#pre{{
[oracle@ora1 2_DataGuard]$ cat standbyredo-orclsby.sql
alter database add standby logfile
('/u02/oradata/orclsby/sbyredo01.log') size 50M;
alter database add standby logfile
('/u02/oradata/orclsby/sbyredo02.log') size 50M;
alter database add standby logfile
('/u02/oradata/orclsby/sbyredo03.log') size 50M;
alter database add standby logfile
('/u02/oradata/orclsby/sbyredo04.log') size 50M;
}}
orclsby で流します。
#pre{{
SQL> @standbyredo-orclsby
データベースが変更されました。
...
}}
*** REDO Apply の開始 [#m0f4ebd5]
コマンドが長いので別に書いておいて流すのがいいでしょう。
#pre{{
[oracle@ora1 2_DataGuard]$ cat redoapply.sql
alter database recover managed standby database
using current logfile disconnect from session;
}}
#pre{{
SQL> @redoapply
データベースが変更されました。
SQL>
}}
** 3.2.7 動作確認 [#yae6d028]
*** プライマリ側 [#x6ddb689]
#pre{{
SQL> archive log list
データベース・ログ・モード アーカイブ・モード
自動アーカイブ 有効
アーカイブ先 /u02/oradata/arch/orcl/
最も古いオンライン・ログ順序 17
アーカイブする次のログ順序 19
現行のログ順序 19
}}
いま19です。
*** スタンバイ側 [#icda068e]
#pre{{
SQL> select sequence#,applied from v$archived_log order by sequence#;
SEQUENCE# APPLIED
---------- ---------------------------
14 YES
15 YES
16 YES
17 YES
18 YES
}}
18まで反映されていました。
*** プライマリ側 [#nf6ec494]
ログスイッチします。
#pre{{
SQL> alter system switch logfile;
システムが変更されました。
SQL> archive log list
データベース・ログ・モード アーカイブ・モード
自動アーカイブ 有効
アーカイブ先 /u02/oradata/arch/orcl/
最も古いオンライン・ログ順序 18
アーカイブする次のログ順序 20
現行のログ順序 20
}}
*** スタンバイ側 [#x4c7f688]
#pre{{
SQL> select sequence#,applied from v$archived_log order by sequence#;
SEQUENCE# APPLIED
---------- ---------------------------
14 YES
15 YES
16 YES
17 YES
18 YES
19 IN-MEMORY
6行が選択されました。
}}
アーカイブされたものは反映されてます。
** 動作確認続き [#va75ef7e]
プライマリ側で表領域を作ってみます。
#pre{{
SQL> create tablespace testtbs datafile '/u02/oradata/orcl/testtbs01.dbf'
2 size 10M
3 extent management local autoallocate;
表領域が作成されました。
SQL>
}}
スタンバイ側で確認してみます。
dba_tablespaces は見れないようなのでファイルで確認しました。
#pre{{
SQL> !ls -l /u02/oradata/orclsby/
合計 1782800
-rw-r----- 1 oracle oinstall 10043392 9月 13 04:17 control01.ctl
-rw-r----- 1 oracle oinstall 10043392 9月 13 04:17 control02.ctl
-rw-r----- 1 oracle oinstall 104865792 9月 13 04:15 example01.dbf
-rw-r----- 1 oracle oinstall 52429312 9月 13 04:08 redo01.log
-rw-r----- 1 oracle oinstall 52429312 9月 13 04:08 redo02.log
-rw-r----- 1 oracle oinstall 52429312 9月 13 04:08 redo03.log
-rw-r----- 1 oracle oinstall 52429312 9月 13 04:17 sbyredo01.log
-rw-r----- 1 oracle oinstall 52429312 9月 13 04:15 sbyredo02.log
-rw-r----- 1 oracle oinstall 52429312 9月 13 04:13 sbyredo03.log
-rw-r----- 1 oracle oinstall 52429312 9月 13 04:13 sbyredo04.log
-rw-r----- 1 oracle oinstall 513810432 9月 13 04:15 sysaux01.dbf
-rw-r----- 1 oracle oinstall 713039872 9月 13 04:16 system01.dbf
-rw-r----- 1 oracle oinstall 10493952 9月 13 04:16 testtbs01.dbf
-rw-r----- 1 oracle oinstall 89137152 9月 13 04:16 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5251072 9月 13 04:15 users01.dbf
SQL>
}}
ちゃんと出来てます。
* 8.2.1 スイッチオーバー [#ac6a4476]
** orcl→orclsby [#q8126272]
orcl が切り替え可能かどうか見てみます。
#pre{{
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
------------------------------------------------------------
TO STANDBY
}}
切り替えてみます。
#pre{{
SQL> alter database commit to switchover to physical standby with session shutdown;
データベースが変更されました。
}}
停止してMOUNTにします。
#pre{{
SQL> shutdown immediate
ORA-01507: データベースがマウントされていません。
ORACLEインスタンスがシャットダウンされました。
SQL> startup mount
ORACLEインスタンスが起動しました。
Total System Global Area 521936896 bytes
Fixed Size 2214936 bytes
Variable Size 360711144 bytes
Database Buffers 155189248 bytes
Redo Buffers 3821568 bytes
データベースがマウントされました。
SQL>
}}
同様に、orclsby で切り替え準備を確認します。
#pre{{
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
------------------------------------------------------------
TO PRIMARY
}}
切り替えます。
#pre{{
SQL> alter database commit to switchover to primary with session shutdown;
データベースが変更されました。
SQL> alter database open;
データベースが変更されました。
SQL>
}}
旧プライマリの orcl では REDO Apply を動かします。
#pre{{
SQL> @redoapply
alter database recover managed standby database
*
行1でエラーが発生しました。:
ORA-38500: USING CURRENT LOGFILE option not available without standby redo logs
}}
スタンバイREDOログファイルを作っていませんでした。
#pre{{
[oracle@ora1 2_DataGuard]$ cat standbyredo-orcl.sql
alter database add standby logfile
('/u02/oradata/orcl/sbyredo01.log') size 50M;
alter database add standby logfile
('/u02/oradata/orcl/sbyredo02.log') size 50M;
alter database add standby logfile
('/u02/oradata/orcl/sbyredo03.log') size 50M;
alter database add standby logfile
('/u02/oradata/orcl/sbyredo04.log') size 50M;
}}
このように作ったのを流します。
#pre{{
SQL> @standbyredo-orcl
データベースが変更されました。
データベースが変更されました。
データベースが変更されました。
データベースが変更されました。
}}
今度は REDO Apply もちゃんと動きます。
#pre{{
SQL> @redoapply
データベースが変更されました。
}}
** orclsby→orcl [#m02d078c]
今度は逆に切り戻してみます。
まずはプライマリになっている orclsby にて。
#pre{{
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
------------------------------------------------------------
TO STANDBY
SQL> alter database commit to switchover to physical standby with session shutdown;
データベースが変更されました。
SQL> shutdown immediate
ORA-01507: データベースがマウントされていません。
ORACLEインスタンスがシャットダウンされました。
SQL> startup mount
ORACLEインスタンスが起動しました。
Total System Global Area 521936896 bytes
Fixed Size 2214936 bytes
Variable Size 318768104 bytes
Database Buffers 197132288 bytes
Redo Buffers 3821568 bytes
データベースがマウントされました。
}}
orcl をプライマリに戻します。
#pre{{
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
------------------------------------------------------------
TO PRIMARY
SQL> alter database commit to switchover to primary with session shutdown;
データベースが変更されました。
SQL> alter database open;
データベースが変更されました。
}}
orclsby で REDO Apply を有効にします。
#pre{{
SQL> @redoapply
データベースが変更されました。
}}
* 9.7 スナップショットスタンバイ [#c3356615]
(TODO)
* 問題 [#ba8313ca]
** ORA-03113 [#pc02194f]
alter system switch logfile; 直後に ORA-03113 が出ることがあります。
#pre{{
SQL> alter system switch logfile;
alter system switch logfile
*
行1でエラーが発生しました。:
ORA-03113: 通信チャネルでend-of-fileが検出されました プロセスID:
4983
セッションID: 1、シリアル番号: 5
}}
こうなるとリカバリしてスタンバイ側も再構成の必要があり、
かなりやっかいです。
スタンバイ側でのREDOをプライマリ側と同じファイルで指定してしまっているのが原因みたいで、
復旧するのがなかなか難しいです。
** convertの設定 [#hbc9eec5]
ここを間違えると全部作り直しになります。
RMAN でのスクリプトで変換するときは
何がどう変わるのかをよく考えないと失敗します。
----
#comment