>> はじめに

前回は、非同期の状態を作り出して、エラーの状況を確認するところまでご紹介しました。今回は、そこで発生したエラーの状況を解消していく方法について、ご案内したいと思います。

>> エラーの原因を特定するには?

論理レプリケーションの特徴として、ソース側で発生したトランザクションの内容を、ターゲットへ転送して処理するというのがありますが、そのターゲット側で反映する際に、何が原因でエラーとなったか確認するために、<SID名_errlog.sql>というファイルをlogディレクトリ以下で確認することができます。


[splex@rhel5spotrg1 log]$ cat trg1_errlog.sql -- Host (rhel5sposrc1) Sid (src1) -- session 2, 1 error -- -- -- [1] Thu Jan 24 17:36:01 2013 -- redolog seq#/offset 565/4774416 -- redolog timestamp 805570552 (01/24/13 17:35:52) -- original rowid AAAToeAAEAAAA0jAAA -- Row Not Found-- NOT FOUND update "TEST"."SALARY" t set "BALANCE"='12e2' where rownum = 1 and "BALANCE"='08e2' and "KEY"='1234'; --

このログの中には、ソース側で発生したトランザクションの詳細として、REDOログやオリジナルのROWIDに関する情報、そしてターゲット側で実行しようとしたSQL文と、エラーの内容が記載されています。

>> エラー内容を修正するには?

<SID名_errlog.sql>というファイル名には、理論的にはエラーとなったSQL文が格納されていきますので、それらをすべてターゲット側に再適用できればエラーは解消するはずです。しかし、そもそもその適用でエラーが出てしまっています。

今回のように、自分で非同期の状態を作り出したのであれば、例えばエラーとなったSQL文から、BALANCE列のチェックを外すなどすれば、更新できることは簡単に想像できますが、一般的に非同期状態は予期しない原因によって引き起こされるため、修正するのが難しい状況も考えられます。

そんなとき、SharePlexでは簡単に同期状態を修復することが可能です!

>> SharePlexの比較&修復機能がすごい訳

完全に無料で使える

SharePlexと同種の考え方を持つ論理レプリケーションソフトは、いくつかの会社からリリースされていますが、比較機能が標準搭載されている製品はSharePlexだけです。論理レプリケーションの場合、データが同期されていない可能性というのを排除するのが難しいのですが、そんなときにも比較機能が搭載されていることで、健全性を確認することが容易になっています。

1対1のノードで動作し、第3のサーバが必要ない

データの比較を行う際に、SharePlexは、レプリケーションを実施しているサーバ間だけで、動作します。一部の製品で比較機能を別製品としてリリースしているところでは、別途有償の第3の比較専用サーバを構築しなければならないものもあります。

チェックだけでなく、修復も可能

データを比較して、問題が見つかった際に、それを発見して終わりということにはなりません。問題を修復して、そこから通常通りにレプリケーションを再開する必要があります。

SharePlexでは、通常のレプリケーション動作と、比較および修復機能が完全に統合されており、すべてSharePlexの動作の管理下でシームレスに動作し、整合性のあるデータによって非同期状態の解消を実現します。

もちろん日本語文字列対応

テーブルに格納されたデータ自体はもちろんのこと、日本の環境ではテーブル名等に日本語文字列が使用されることもあります。SharePlexでは、これらの日本語文字列に対して、正しくレプリケーションおよび比較&修復機能が動作します。

>> 実際に非同期状態を確認および修復してみる

使い方自体は、第10回の講座でも少しご紹介していて、それほど大きな違いはありません。

ソース側のsp_ctrlから、compareコマンドを使用して、今回の場合test.salaryテーブルを指定して実行することになります。compare statusで状況を確認すると、最終的にOut Syncの状態が確認できます。


sp_ctrl (rhel5sposrc1:2100)> compare test.salary comparing 1 of 1 objects compare started; job id 5 sp_ctrl (rhel5sposrc1:2100)> compare status Job ID : 5 PID : 14611 Host : rhel5sposrc1 Started : 25-FEB-13 16:09:35 Job Type : Compare Status : Processing ID Tablename Status Time Total Rows %Comp Total Time ------ ------------------------------------ ---------- ---------- ---------- ----- ---------- 1 "TEST"."SALARY" WaitMarker 0:16 1 0:18 sp_ctrl (rhel5sposrc1:2100)> compare status Job ID : 5 PID : 14611 Host : rhel5sposrc1 Started : 25-FEB-13 16:09:35 Job Type : Compare Status : Done ID Tablename Status Time Total Rows %Comp Total Time

ターゲット側のVARDIR/log以下のcompareによって生成されたsqlスクリプトを確認すると、ターゲット側でこれを実行することで非同期状態を修正することが可能です。


[splex@rhel5spotrg1 log]$ cat trg1_TEST-SALARY-14611-14603.sql /* * Compare Report * * Session ID : 14611 * Schema : TEST * Table : SALARY * Repair : Off * Target Route: rhel5spotrg1@trg1 * Key Compare : Off * Select Hint : * Log File : /home/splex/vardir/log/trg1_TEST-SALARY-14611-14603.sql * Date : Mon Feb 25 16:10:06 2013 * */ /* source rowid='AAATqmAAEAAAA1DAAA' */ update "TEST"."SALARY" set "NAME" = 'hiro',"BALANCE" = '2000' where rowid = 'AAAULuAAEAAAAL9AAA'; /* * Compare Results * * 1 source and 1 target rows compared successfully. * 1 out-of-sync row(s) found in this table. * The SQL statements above are needed to bring this * table back in sync. * * To bring this table back in sync, run the compare * command again with the repair option. * See SharePlex documentation for more details. * * Inserts : 0 * Updates : 1 * Deletes : 0 * */

もしくは、repair機能を使用して修復するのもよいでしょう。


sp_ctrl (rhel5sposrc1:2100)> repair test.salary repairing 1 of 1 objects repair started; job id 6 sp_ctrl (rhel5sposrc1:2100)> repair status Job ID : 6 PID : 14734 Host : rhel5sposrc1 Started : 25-FEB-13 16:17:28 Job Type : Repair Status : Processing ID Tablename Status Time Total Rows %Comp Total Time ------ ------------------------------------ ---------- ---------- ---------- ----- ---------- 1 "TEST"."SALARY" Repaired 0:19 1 100 0:53

どちらの方法でも最終的に、ソースとターゲットで値が同じになっていることが確認できます。より慎重に確認したいという場合には、repair後にもう一度compareを実行することも可能です。


SQL> select * from salary; KEY NAME BALANCE ---- ------------------------------ ---------- 1234 hiro 2000

 

>> まとめ

以上、比較と修復機能の特徴と簡単な使い方をご紹介しました。

次回は、SharePlexの監視をGUIでわかりやすくするSharePlex Managerについて取り上げます。