はじめに
作りたい環境
- Linux(Oracle Linux Server release 7.3)
- Oracle Database 12cR1
- フィジカルスタンバイ
- 非同期適用
- リアルタイム適用
- ファイルのディレクトリパスはプライマリとスタンバイで異なる
- スイッチオーバー可能な構成
作りたい作り方
- RMANのバックアップを使用する
- Active Duplicateは行わない(作成時にターゲット側からソース側につなぎに行かない)
- 初期化パラメータファイルは手動で作成
- スタンバイ制御ファイルはRMANで作成
今回作る環境まとめ
首都オーディンにあるデータベース(odin)の災対環境として、イゼルローン要塞上にフィジカルスタンバイデータベース(iserlohn)を作成する。いろいろ問題がありそうだけど、それはまた別の話。
項目 | プライマリ | スタンバイ |
---|---|---|
DB_NAME | odin | odin |
DB_UNIQUE_NAME | odin | iserlohn |
hostname | ol121p | ol121s |
service_names | odin.us.oracle.com | iserlohn.us.oracle.com |
プライマリデータベース作成手順
プライマリデータベースの設定
強制ロギングの有効化
強制ロギングの有効化を行う。
SQL> ALTER DATABASE FORCE LOGGING;
Database altered.
アーカイブログモードを有効化
アーカイブログモードでない場合は、アーカイブログモードを有効にする。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> create spfile from pfile='/tmp/pfile_mod.ora';
File created.
SQL> startup mount
ORACLE instance started.
Total System Global Area 729808896 bytes
Fixed Size 2928680 bytes
Variable Size 562040792 bytes
Database Buffers 159383552 bytes
Redo Buffers 5455872 bytes
Database mounted.
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 16
Current log sequence 18
SQL>
SQL> ALTER DATABASE ARCHIVELOG;
Database altered.
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 16
Next log sequence to archive 18
Current log sequence 18
SQL> alter database open;
Database altered.
リスナーの構成
リスナーが構成されており、プライマリデータベースのサービスが登録されていることを確認する。
$ lsnrctl status
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 10-SEP-2018 19:32:40
Copyright (c) 1991, 2014, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ol121p)(PORT=1521)))
<中略>
Services Summary...
Service "odin.us.oracle.com" has 1 instance(s).
Instance "odin", status READY, has 1 handler(s) for this service...
Service "odinXDB.us.oracle.com" has 1 instance(s).
Instance "odin", status READY, has 1 handler(s) for this service...
The command completed successfully
tnsnames.oraの設定
プライマリデータベース(odin)およびスタンバイデータベース(iserlohn)接続用のネットサービス名を定義する。
odin =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol121p)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = odin.us.oracle.com)
)
)
iserlohn =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol121s)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = iserlohn.us.oracle.com)
)
)
初期化パラメータの設定
ALTER SYSTEM文やSPFILEの再作成で以下の設定を反映させる。
最初から入ってるかも
DB_NAME=odin
CONTROL_FILES='/u01/app/oracle/oradata/odin/control01.ctl', '/u01/app/oracle/fast_recovery_area/odin/control02.ctl'
DB_UNIQUE_NAME=odin
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
変更・追加する想定
LOG_ARCHIVE_CONFIG='DG_CONFIG=(odin,iserlohn)'
LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=odin'
LOG_ARCHIVE_DEST_2='SERVICE=iserlohn ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=iserlohn'
FAL_SERVER=iserlohn
DB_FILE_NAME_CONVERT='/iserlohn/','/odin/'
LOG_FILE_NAME_CONVERT='/iserlohn/','/odin/'
STANDBY_FILE_MANAGEMENT=AUTO
スタンバイREDOログの構成
スタンバイREDOログを作成する。オンラインREDOログのグループ数+1で作成する。
ここではオンラインREDOログが3グループであるため、4つ作成する。
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/odin/redo04.log') SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/odin/redo05.log') SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/odin/redo06.log') SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/odin/redo07.log') SIZE 50M;
Database altered.
プライマリデータベースのバックアップ取得
$ rman target /
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
<中略>
Finished backup at 2018/09/16 00:20:50
プライマリデータベースからスタンバイデータベースへのファイル転送
- プライマリデータベースのパスワードファイルをスタンバイデータベースにファイル転送
ただしファイル名はorapwとなるように変更する。
$ORACLE_HOME/dbs/orapwodin → $ORACLE_HOME/dbs/orapwodin/orapwiserlohn
- プライマリデータベースからPFILEを作って、スタンバイデータベースに転送
SQL> CREATE PFILE='/tmp/initiserlohn.ora' FROM SPFILE;
- プライマリデータベースのバックアップ一式
スタンバイデータベースの設定
リスナーの構成
スタンバイ側でリスナーを起動する。
$ lsnrctl start listener
tnsnames.oraの設定
プライマリデータベース(odin)およびスタンバイデータベース(iserlohn)接続用のネットサービス名を定義する。
odin =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol121p)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = odin.us.oracle.com)
)
)
iserlohn =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol121s)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = iserlohn.us.oracle.com)
)
)
ディレクトリ作成
必要なディレクトリを作成する。
監査ログのディレクトリは忘れがちなので気をつける。
mkdir -p /u01/app/oracle/oradata/iserlohn
mkdir -p /u01/app/oracle/fast_recovery_area/iserlohn/
mkdir -p /u01/app/oracle/admin/iserlohn/adump
初期化パラメータの設定と作成
プライマリデータベースからコピーした/tmp/initiserlohn.ora
を以下の内容に編集する。
DB_NAME=odin
control_files='/u01/app/oracle/oradata/iserlohn/control01.ctl','/u01/app/oracle/fast_recovery_area/iserlohn/control02.ctl'
DB_UNIQUE_NAME=iserlohn
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_CONFIG='DG_CONFIG=(odin,iserlohn)'
LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=iserlohn'
LOG_ARCHIVE_DEST_2='SERVICE=odin ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=odin'
FAL_SERVER='odin'
DB_FILE_NAME_CONVERT='/odin/','/iserlohn/'
LOG_FILE_NAME_CONVERT='/odin/','/iserlohn/'
STANDBY_FILE_MANAGEMENT=AUTO
編集した内容で、SPFILEを作成する。
$ sqlplus / as sysdba
SQL> create spfile from pfile='/tmp/initiserlohn.ora';
File created.
データ同期の開始
スタンバイ側でRMANによるデータベースの複製
スタンバイデータベースのNOMOUNTでの起動。
SQL> startup nomount
ORACLE instance started.
Total System Global Area 729808896 bytes
Fixed Size 2928680 bytes
Variable Size 562040792 bytes
Database Buffers 159383552 bytes
Redo Buffers 5455872 bytes
補助データベース(auxiliary)としてスタンバイデータベースに接続して、DUPLICATEを行う。
バックアップセットの場所はBACKUP LOCATIONで指定する。ここでは/backupsetを指定する。
$ rman auxiliary /
connected to auxiliary database: ODIN (not mounted)
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY BACKUP LOCATION '/backupset' DORECOVER NOFILENAMECHECK;
Starting Duplicate Db at 2018/09/16 23:14:54
<中略>
Finished recover at 2018/09/16 23:17:54
Finished Duplicate Db at 2018/09/16 23:18:07
スタンバイDB側にスタンバイREDOログの作成
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo04.log') SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo05.log') SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo06.log') SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo07.log') SIZE 50M;
Database altered.
適用プロセスの開始
以下のコマンドを実行する。12cからは「USING CURRENT LOGFILE」は不要。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Database altered.
確認
フィジカルスタンバイのロールを確認する。
DATABASE_ROLE列がPHYSICAL STANDBYであること。
SQL> select DBID,NAME,LOG_MODE,OPEN_MODE,DATABASE_ROLE,FORCE_LOGGING,CURRENT_SCN from v$database;
DBID NAME LOG_MODE OPEN_MODE DATABASE_ROLE FORCE_LOGGING CURRENT_SCN
---------- --------- ------------ -------------------- ---------------- --------------------------------------- -----------
884158366 ODIN ARCHIVELOG MOUNTED PHYSICAL STANDBY YES 3118450
MRP0が稼働していることを確認する。
SQL> SELECT PROCESS, STATUS, THREAD#, SEQUENCE#,BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;
PROCESS STATUS THREAD# SEQUENCE# BLOCK# BLOCKS
--------- ------------ ---------- ---------- ---------- ----------
ARCH CLOSING 1 82 79872 986
ARCH CONNECTED 0 0 0 0
ARCH CLOSING 1 86 92160 787
ARCH CLOSING 1 85 79872 102
RFS IDLE 1 87 34099 1
RFS IDLE 0 0 0 0
MRP0 APPLYING_LOG 1 87 34099 102400
RFS IDLE 0 0 0 0
参考
参考ドキュメント
Oracle® Data Guard概要および管理 12c リリース1 (12.1) B71304-07
10 フィジカルおよびスナップショット・スタンバイ・データベースの管理
https://docs.oracle.com/cd/E57425_01/121/SBYDB/manage_ps.htm
Oracle® Databaseバックアップおよびリカバリ・ユーザーズ・ガイド 12c リリース1 (12.1) B71297-08
25 データベースの複製
https://docs.oracle.com/cd/E57425_01/121/BRADV/rcmdupdb.htm
Oracle® Databaseバックアップおよびリカバリ・リファレンス 12cリリース1 (12.1) B71298-08
DUPLICATE
https://docs.oracle.com/cd/E57425_01/121/RCMRF/rcmsynta020.htm
Oracle® Database高可用性ベスト・プラクティス 12cリリース1 (12.1) E57730-02
8 Oracle Data Guardの構成
https://docs.oracle.com/cd/E57425_01/121/HABPT/config_dg.htm
つまったところ
「DUPLICATE TARGET DATABASE FOR STANDBY」の実行時に「NOFILENAMECHECK句」をつける
つけない場合、以下のエラーで失敗する。
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 09/16/2018 23:07:48
RMAN-05501: aborting duplication of target database
RMAN-05001: auxiliary file name /u01/app/oracle/oradata/iserlohn/users01.dbf conflicts with a file used by the target database
RMAN-05001: auxiliary file name /u01/app/oracle/oradata/iserlohn/undotbs01.dbf conflicts with a file used by the target database
RMAN-05001: auxiliary file name /u01/app/oracle/oradata/iserlohn/sysaux01.dbf conflicts with a file used by the target database
RMAN-05001: auxiliary file name /u01/app/oracle/oradata/iserlohn/system01.dbf conflicts with a file used by the target database
参考
RMAN-05001: Auxiliary Filename Conflicts with a File Used by the Target Database Tips
http://www.dba-oracle.com/t_rman_05001_auxiliary_filename_conflicts_with_file_used_by_target_database.htm
スタンバイREDOログの作成はMRPが起動していない状態で実行する
MRP起動後に実行すると以下のエラーが発生する。
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo04.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo04.log') SIZE 50M
*
ERROR at line 1:
ORA-01156: recovery or flashback in progress may need access to files