#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

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS