ORACLE RMANで複製データベースの作成
RMANでアクティブなデータベースから同じSIDを持った複製データベースを作成したのでメモ。
複製先サーバ側の設定
以下ファイルを複製元から複製先へコピー、配置する。
- 初期化パラメータ(initSID.ora)
- パスワードファイル(orapwSID)
- リスナー構成ファイル(listener.ora)
静的リスナーを設定
$ vim $ORACLE_HOME/network/admin/listener.ora LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 複製先サーバIP)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER= (SID_LIST= (SID_DESC= (SID_NAME=orcl) (ORACLE_HOME=/opt/app/oracle/product/11.2.0/dbhome_1) ) )
- リスナー起動
$ lsnrctl start
複製元サーバでの作業
- 複製先サーバに接続してインスタンス起動
$ sqlplus sys/oraora@複製先IP:1521/orcl as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 木 4月 7 14:03:52 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. アイドル・インスタンスに接続しました。 sql>startup nomount
RMANからデータベースの複製を行う。
- RMAN接続
$ rman target / Recovery Manager: Release 11.2.0.4.0 - Production on 金 4月 8 15:28:01 2016 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. ターゲット・データベース: ORCL (データベースID=3408942822)に接続されました
- RMANから複製先へ接続
RMAN> connect auxiliary sys/oraora@複製先IP:1521/orcl 補助データベース: ORCLに接続されました(マウントされていません)
- 複製データベース作成する
RMAN> duplicate target database to orcl from active database spfile NOFILENAMECHECK;
これで完了。
標準出力からわかるざっくりな流れとして、
1. SPFILEのコピー
2. 制御ファイルのコピー
3. データファイルのリストア
4. アーカイブログを使用したリカバリ
5. resetlogしてデータベースOPEN
- どの時点のデータまで複製されるのか。
アクティブなデータベースから作成しているので、どの時点のデータまでが複製されるのか気になった。
複製元データベースで↓実施しながら複製開始。
$ watch -n 1 "echo \"insert into duplicate_test values (1,sysdate);\" | sqlplus orcl/orcl"
複製が完了した時点でのデータ
ID D ---------- ------------------- 1 2016/04/08 18:33:43 1 2016/04/08 18:33:44 1 2016/04/08 18:33:45 1 2016/04/08 18:33:46 1 2016/04/08 18:33:47 1 2016/04/08 18:33:48 ←ここまで反映
duplicateコマンドのログ情報
チャネルORA_DISK_1: データファイルのコピーを開始しています 入力データファイル・ファイル番号=00004 名前=/opt/app/oracle/oradata/orcl/users01.dbf 出力ファイル名=/opt/app/oracle/oradata/orcl/users01.dbf タグ=TAG20160408T181846 チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:01 backupが完了しました(完了時間: 2016-04-08 18:33:48) ←リストア完了時刻 SQL文: alter system archive log current ←ログスイッチ実行 メモリー・スクリプトの内容: { backup as copy reuse archivelog like "/opt/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_12114_cjgyknf3_.arc" auxiliary format "/opt/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_12114_%u_.arc" archivelog like "/opt/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_12115_cjgyqwxc_.arc" auxiliary format "/opt/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_12115_%u_.arc" ; catalog clone recovery area; switch clone datafile all; } メモリー・スクリプトを実行しています backupが開始されました(開始時間: 2016-04-08 18:33:49) ・ ・ ・ Duplicate Dbが完了しました(完了時間: 2016-04-08 18:34:33) ←Duplicateコマンド完了時刻
というようにデータ登録時刻とリストア完了の時刻はほぼ一緒で、
リストア完了後にログのスイッチが行われている。
そこで生成されたアーカイブログまで適用されているよう。
SQL文: alter system archive log current
複製されたデータベースで一時表領域がエラー
一時表領域のデータファイルを確認しようするとエラーが発生。
SQL> select * from dba_temp_files; select * from dba_temp_files * 行1でエラーが発生しました。: ORA-01187: ファイルが検査を通過しなかったため、このファイルから読み込むことができません。 ORA-01110: データファイル201: '/opt/app/oracle/oradata/orcl/temp01.dbf'
ステータスはオンライン
SQL> select tablespace_name, status from dba_tablespaces; TABLESPACE_NAME STATUS ------------------------------ --------- TEMP ONLINE
ファイルはちゃんと複製されていたので一時表領域から一度dropしてaddしてあげることで直った。
SQL> alter database tempfile '/opt/app/oracle/oradata/orcl/temp01.dbf' drop; データベースが変更されました。 SQL> alter tablespace TEMP add tempfile '/opt/app/oracle/oradata/orcl/temp01.dbf' REUSE; 表領域が変更されました。 SQL> select * from dba_temp_files; FILE_NAME -------------------------------------------------------------------------------- FILE_ID TABLESPACE_NAME BYTES BLOCKS STATUS ---------- ------------------------------ ---------- ---------- ------- RELATIVE_FNO AUT MAXBYTES MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS ------------ --- ---------- ---------- ------------ ---------- ----------- /opt/app/oracle/oradata/orcl/temp01.dbf 1 TEMP 3.4359E+10 4194176 ONLINE 1 NO 0 0 0 3.4358E+10 4194048