#topicpath
----
[[マルチマスタレプリケーション>技術文書/Oracle/マルチマスタレプリケーション]] で作った環境について、
いくつか管理コマンドを実施してみます。
#contents
* 参考文献 [#y5cddb5f]
- [[Oracle Databaseアドバンスト・レプリケーション・マネージメントAPIリファレンス 10g リリース2(10.2):http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19220-02/toc.htm]]
- [[Oracle Databaseアドバンスト・レプリケーション 10gリリース2(10.2):http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19219-02/toc.htm]]
* マスター定義サイトの変更 [#u68ab568]
マルチマスタレプリケーション環境では、
それぞれのサイトがマスター・サイトです。
マスター・サイトのうち、マスター・グループを定義したサイトをマスター定義サイトと言います。
何かの管理の都合で他のマスター・サイトをマスター定義サイトとしたい場合は、この処理を行います。
- SDB1 : マスター定義サイト
- SDB2 : マスター・サイト
このような状態になっているとき、SDB2 をマスター定義サイトにしてみます。
** マスター定義サイトかどうかの確認 [#w4506177]
dba_repsites に問い合わせます。master.sql として書きました。
#pre{{
-bash-3.00$ cat master.sql
col gname format a20
col dblink format a20
select gname, dblink, masterdef from dba_repsites;
}}
#pre{{
-bash-3.00$ sqlplus repadmin/repadmin@sdb1 @master
...
GNAME DBLINK MAS
-------------------- -------------------- ---
SCOTT_REPG SDB1.SUGIMURA.CC Y
SCOTT_REPG SDB2.SUGIMURA.CC N
SQL>
}}
SDB1.SUGIMURA.CC がマスター定義サイトになっていることがわかります。
** マスター定義サイトの変更 [#a2fb50b4]
SDB1 で DBMS_REPCAT.RELOCATE_MASTERDEF を実行します。
#pre{{
BEGIN
DBMS_REPCAT.RELOCATE_MASTERDEF (
gname => 'scott_repg',
old_masterdef => 'sdb1.sugimura.cc',
new_masterdef => 'sdb2.sugimura.cc',
notify_masters => TRUE,
include_old_masterdef => TRUE);
END;
/
}}
移っていることが確認できました。
#pre{{
SQL> @master
GNAME DBLINK MAS
-------------------- -------------------- ---
SCOTT_REPG SDB1.SUGIMURA.CC N
SCOTT_REPG SDB2.SUGIMURA.CC Y
SQL>
}}
ここでは元に戻しておきます。SDB2 で実行します。
#pre{{
BEGIN
DBMS_REPCAT.RELOCATE_MASTERDEF (
gname => 'scott_repg',
old_masterdef => 'sdb2.sugimura.cc',
new_masterdef => 'sdb1.sugimura.cc',
notify_masters => TRUE,
include_old_masterdef => TRUE);
END;
/
}}
* マスター・サイトの削除 [#wcb899a8]
マスター定義サイトではない、SDB2 を削除してみます。
** レプリケーションの静止とサイトの削除 [#ma1fa91e]
remove.sql を書きます。
#pre{{
BEGIN
DBMS_REPCAT.SUSPEND_MASTER_ACTIVITY (
gname => 'scott_repg');
END;
/
BEGIN
DBMS_REPCAT.REMOVE_MASTER_DATABASES (
gname => 'scott_repg',
master_list => 'sdb2.sugimura.cc');
END;
/
}}
SDB1 で実行します。
#pre{{
-bash-3.00$ sqlplus repadmin/repadmin@sdb1 @remove
}}
消えました。
#pre{{
SQL> @master
GNAME DBLINK MAS
-------------------- -------------------- ---
SCOTT_REPG SDB1.SUGIMURA.CC Y
SQL>
}}
その後しばらくたってから dba_repcatlog を見て、
空であることを確認すれば削除終了です。
#pre{{
-bash-3.00$ sqlplus repadmin/repadmin@sdb1
...
SQL> select status, message from dba_repcatlog;
レコードが選択されませんでした。
SQL>
}}
なかなか空にならないときは、急かすことも可能です。
下記のプロシージャを何度か実行します。
#pre{{
BEGIN
DBMS_REPCAT.DO_DEFERRED_REPCAT_ADMIN (
gname => 'scott_repg',
all_sites => TRUE);
END;
/
}}
これは問題の切り分けが必要ならば、
all_sites を FALSE にしてそれぞれのサイトで呼んでもいいでしょう。
削除がちゃんと終わったらレプリケーションを再開しておかないと、
表への更新ができなくなります。
#pre{{
-bash-3.00$ sqlplus scott/tiger
...
SQL> insert into dept values (60, 'WORK2', 'TABATA');
insert into dept values (60, 'WORK2', 'TABATA')
*
行1でエラーが発生しました。:
ORA-23326: オブジェクト・グループ"PUBLIC"."SCOTT_REPG"は静止中です。
SQL>
}}
DBMS_REPCAT.RESUME_MASTER_ACTIVITY を呼んで再開します。
#pre{{
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'scott_repg');
END;
/
}}
* マスター・サイトの追加 [#a3c7ebb0]
外してみた SDB2 を再度追加してみます。SDB1 で実行します。
#pre{{
BEGIN
DBMS_REPCAT.ADD_MASTER_DATABASE (
gname => 'scott_repg',
master => 'sdb2.sugimura.cc',
use_existing_objects => TRUE,
copy_rows => FALSE,
propagation_mode => 'ASYNCHRONOUS');
END;
/
}}
実行すると怒られました。
#pre{{
BEGIN
*
行1でエラーが発生しました。:
ORA-23374: オブジェクト・グループ"PUBLIC"."SCOTT_REPG"はすでに存在しています。 ORA-06512:
"SYS.DBMS_SYS_ERROR", 行95
ORA-06512: "SYS.DBMS_REPCAT_MAS", 行2227
ORA-06512: "SYS.DBMS_REPCAT", 行146
ORA-06512: 行2
}}
SDB2 側で dba_repsites を見てみます。
#pre{{
-bash-3.00$ sqlplus repadmin/repadmin@sdb2 @master
...
GNAME DBLINK MAS
-------------------- -------------------- ---
SCOTT_REPG SDB2.SUGIMURA.CC N
SCOTT_REPG SDB1.SUGIMURA.CC Y
SQL>
}}
なぜか消えずに残っています。
DBMS_REPCAT.DROP_MASTER_REPGROUP を呼んで、
SDB2 では初めからなかったことにしてみます。
SDB2 で実行します。
#pre{{
BEGIN
DBMS_REPCAT.DROP_MASTER_REPGROUP (
gname => 'scott_repg',
drop_contents => FALSE,
all_sites => FALSE);
END;
/
}}
dba_repsites を確認してみます。
#pre{{
SQL> @master
レコードが選択されませんでした。
SQL>
}}
これで再度追加してみました。SDB1 で実行します。
#pre{{
BEGIN
DBMS_REPCAT.ADD_MASTER_DATABASE (
gname => 'scott_repg',
master => 'sdb2.sugimura.cc',
use_existing_objects => TRUE,
copy_rows => FALSE,
propagation_mode => 'ASYNCHRONOUS');
END;
/
}}
それぞれで dba_repsites を確認してみます。
#pre{{
-bash-3.00$ sqlplus repadmin/repadmin@sdb1 @master
...
GNAME DBLINK MAS
-------------------- -------------------- ---
SCOTT_REPG SDB1.SUGIMURA.CC Y
SCOTT_REPG SDB2.SUGIMURA.CC N
SQL>
}}
#pre{{
-bash-3.00$ sqlplus repadmin/repadmin@sdb2 @master
...
GNAME DBLINK MAS
-------------------- -------------------- ---
SCOTT_REPG SDB2.SUGIMURA.CC N
SCOTT_REPG SDB1.SUGIMURA.CC Y
SQL>
}}
無事追加できました。
レプリケーションを再開して終了です。
#pre{{
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'scott_repg');
END;
/
}}
** レプリケーションの再開 [#y1e177dd]
静止状態にあるので、再開して完了です。
#pre{{
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'scott_repg');
END;
/
}}
* レプリケーションの状態 [#d534b31c]
静止なのか再開されているのかを知るには、
dba_repgroup を見ます。
#pre{{
-bash-3.00$ cat repgroup.sql
col gname format a20
col status format a20
select gname, status from dba_repgroup;
}}
** 静止したとき [#m39ce61f]
#pre{{
BEGIN
DBMS_REPCAT.SUSPEND_MASTER_ACTIVITY (
gname => 'scott_repg');
END;
/
}}
NORMAL → QUIESCING → QUIESCED と移るようです。
静止するには何かと時間が掛かるようなので、
両ノードの状態を見ながら気長に待ちましょう。
#pre{{
-bash-3.00$ sqlplus repadmin/repadmin@sdb1 @repgroup
...
GNAME STATUS
-------------------- --------------------
SCOTT_REPG QUIESCED
SQL>
}}
あまりにも QUIESCING の状態が長ければ、
DBMS_REPCAT.DO_DEFERRED_REPCAT_ADMIN
を実行すれば大丈夫です。
ここでは all_sites => FALSE にして、
それぞれのサイトで実行しました。
#pre{{
BEGIN
DBMS_REPCAT.DO_DEFERRED_REPCAT_ADMIN (
gname => 'scott_repg',
all_sites => FALSE);
END;
/
}}
** 再開したとき [#x4863002]
#pre{{
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'scott_repg');
END;
/
}}
#pre{{
-bash-3.00$ sqlplus repadmin/repadmin@sdb1 @repgroup
...
GNAME STATUS
-------------------- --------------------
SCOTT_REPG NORMAL
SQL>
}}
----
#comment