#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

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS