#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