#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