#pre{{ SQL> alter database force logging;
データベースが変更されました。 }}
パスワードファイル認証。
#pre{{ [oracle@ora1 ~]$ sqlplus sys/oracle@orcl as sysdba (接続できることを確認) }}
マニュアルに従って書きます。
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
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 }}
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> }}
インスタンスが上がるだけのものを作っておきます。
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
VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orclsby'
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl'
}}
#pre{{ [oracle@ora1 2_DataGuard]$ orapwd file=$ORACLE_HOME/dbs/orapworclsby
Enter password for SYS: }}
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 }}
listener.ora と tnsnames.ora を編集して、 @orclsby でアクセスできるようにします。
#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)))
}}
#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))に接続中 コマンドは正常に終了しました。 }}
リスナー経由でアクセスできることと、 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 にしてはいけません。
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;
ファイルが作成されました。
}}
orclsby を MOUNT で起動します。
ここでは1つのサーバに2つインスタンスを立ち上げているので、 メモリが足りないと言われたら メモリの設定 を見直してください。
#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> }}
スタンバイ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
データベースが変更されました。 ... }}
コマンドが長いので別に書いておいて流すのがいいでしょう。
#pre{{ [oracle@ora1 2_DataGuard]$ cat redoapply.sql alter database recover managed standby database using current logfile disconnect from session;
}}
#pre{{ SQL> @redoapply
データベースが変更されました。
SQL> }}
#pre{{ SQL> archive log list データベース・ログ・モード アーカイブ・モード 自動アーカイブ 有効 アーカイブ先 /u02/oradata/arch/orcl/ 最も古いオンライン・ログ順序 17 アーカイブする次のログ順序 19 現行のログ順序 19 }}
いま19です。
#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まで反映されていました。
ログスイッチします。
#pre{{ SQL> alter system switch logfile;
システムが変更されました。
SQL> archive log list データベース・ログ・モード アーカイブ・モード 自動アーカイブ 有効 アーカイブ先 /u02/oradata/arch/orcl/ 最も古いオンライン・ログ順序 18 アーカイブする次のログ順序 20 現行のログ順序 20 }}
#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行が選択されました。 }}
アーカイブされたものは反映されてます。
プライマリ側で表領域を作ってみます。
#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
SQL> }}
ちゃんと出来てます。
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 にて。
#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
データベースが変更されました。 }}
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をプライマリ側と同じファイルで指定してしまっているのが原因みたいで、 復旧するのがなかなか難しいです。
ここを間違えると全部作り直しになります。 RMAN でのスクリプトで変換するときは 何がどう変わるのかをよく考えないと失敗します。