Comments
Transcript
DB2 V9.7新機能ワークショップ Replication/Federation機能強化
DB2 V9.7新機能ワークショップ <第1.00版 2009年 7月> Replication/Federation機能強化 本書に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、暗黙的にしろ、なんらの保証もなしに配布されるものです。 この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用する環境に統合する 使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べられていますが、他のところで同じまたは同 様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使用先は、自己の責任において行う必要があります。 © Copyright IBM Japan Systems Engineering Co., Ltd. 2009 目次 • Range partition表 表のサポート • Compression表 表のサポート • Option to replicate Loadの のサポート • Multiple Restart Queue のサポート • ConcurrentAccessResolution for Load • XML列 列のTransformationサポート サポート • フェデレーテッド・ フェデレーテッド・クエリーの クエリーのキャンセルサポート キャンセルサポート • 全体まとめ 全体まとめ 2 © 2009 ISE Corporation Range partition表のサポート partition表のサポート Range 3 © 2009 ISE Corporation Range partition表のサポート 当機能の目的と使用方法 目的 Range partition表 表をソースとした ソースとした差分 とした差分レプリケーション 差分レプリケーションの レプリケーションのサポート 使用方法と 使用方法と変更点 Qcaptureが が自動的に 自動的に使用 DB2の のLOG read APIの の機能拡張による 機能拡張による 使用可能な 使用可能なレベル IRS V9.7 GA ~ 対象プラットフォーム 対象プラットフォーム Linux, Unix, Windows 4 © 2009 ISE Corporation Range Partition表(テーブル・パーティショニング) V9からの機能 • データの データの範囲によって 範囲によって、 によって、ひとつの表 ひとつの表を複数の 複数のパーティションに パーティションに 物理的に 物理的に分割して 分割して保存 して保存 • 新しいパーティション しいパーティションの パーティションのアタッチ/デタッチ アタッチ デタッチが デタッチが可能 履歴表A 履歴表 JAN01 JAN02 JAN03 JAN04 JAN05 区分の 区分の アタッチ 区分の 区分の デタッチ JAN01 5 JAN05 © 2009 ISE Corporation Range Partition表のメリット • ①保存期間を 保存期間を過ぎた行 ぎた行の高速な 高速な削除 • 従来はDELETEによる大量行の削除 • 低速、大量のログを発生、表の再編成必要 • ②新しいデータ しいデータの データのオンラインでの オンラインでの高速 での高速ロード 高速ロード • LOAD済みの表をアタッチする • 読み書き不能になるのはアタッチ処理の瞬間的時点のみ • ③データアクセスの データアクセスの性能向上 • 指定された条件によって、特定パーティションのみアクセス • ④故障範囲の 故障範囲の局所化 • • V9からの機能 ① ② ある表スペースがアクセス不能になっても、その他の表スペースに配 置されたパーティションへのアクセスは可能 ⑤バックアップ性能 バックアップ性能の 性能の向上 • 複数の表スペースに分割配置し、並列バックアップ可能 • BACKUPコマンドのPARALLELISMオプション ④ ③ 6 ⑤ © 2009 ISE Corporation 新機能( 新機能(LUW) Range Partition表サポート • V9.7より よりRange Partition表 表をソース表 より ソース表としたレプリケーション としたレプリケーション が可能 • 従来までは、Range Partition表を使用できたのはターゲット表 の場合のみ DB2 ログ 履歴表A 履歴表 INSERT UPDATE JAN01 JAN02 ・・・・ JAN05 DELETE Log Read API SQLCapture 7 QCapture © 2009 ISE Corporation Range Partition表サポート • ターゲット表 表であっても、 ターゲット表はRange Partition表 であっても、通常表であってもよい 通常表であってもよい • Qcapture、 、SQLcaptureは はパーティションの パーティションのアタッチ・ アタッチ・デタッチの デタッチの検知が 検知が可能 • • ASN7184W “Q Capture” : “<キャプチャー・スキーマ>” : “WorkerThread” : ソース表 “<ソース表名>” にデータ・パーティション “< パーティション番号>" がアタッチされました。 ASN7185W "Q Capture" : "<キャプチャー・スキーマ> " : "WorkerThread" : ソース表 "<ソース表名>” からデータ・パーティション “<パーティション番号>" がデタッチされました。 • 注意事項 • ソース表とアタッチする表の双方にData Capture Changesオプションの指 定が必要 • ただしINCLUDE LONGVAR COLUMNSオプションの有無も一致していなければ ならない • 一致していない場合、SQL20307Nの理由コード 9のエラー • ソース表にデータが入った表をアタッチしても、そのデータは自動的にはレ プリケーション(INSERT)されない • ターゲット表に手動でデータを挿入、あるいは同じデータが入った表をアタッチして おく必要あり • ソース表からパーティションをデタッチしても、そのデータは自動的には削 除されない • ターゲット表からも削除したい場合は、手動でデータを削除、あるいは同じレンジ のデータが入ったパーティションをデタッチしておく必要あり 8 © 2009 ISE Corporation 検証: 差分レプリケーションの確認 • ソース表 ソース表のDDL CREATE TABLE DB2INST1.PARTTAB (pk int, rk int) IN USERSPACE1 PARTITION BY RANGE (rk) (PART p0 STARTING 0, PART p1 STARTING 100, PART p2 STARTING 200 ENDING 299) ; CREATE UNIQUE INDEX DB2INST1.IX_PARTTAB ON DB2INST1.PARTTAB ( PK ASC ); ALTER TABLE DB2INST1.PARTTAB DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS; パーティション表 パーティション表の確認 • db2 DESCRIBE DATA PARTITIONS FOR TABLE PARTTAB SHOW DETAIL PartitionId Inclusive (y/n) Low Value ----------- - ------------------------------0 Y 0 1 Y 100 2 Y 200 PartitionId PartitionName ----------0 1 2 9 Inclusive (y/n) High Value - ------------------------------N 100 N 200 Y 299 TableSpId PartObjId ------------------------------- ----------- ----------P0 2 4 P1 2 5 P2 2 6 IndexTblSpId LongTblSpId AccessMode Status ------------ ----------- - -----2 2 F 2 2 F 2 2 F © 2009 ISE Corporation 検証: 差分レプリケーションの確認 ターゲット表 (サブスクリプションの ターゲット表のDDL( サブスクリプションの作成によって 作成によって新規表作成 によって新規表作成を 新規表作成を選択) 選択) • • ターゲット表に対しては、パーティション表のDDLは生成されない CREATE TABLE DB2INST1.TG_PARTTAB (PK INTEGER, RK INTEGER) IN TSTG_PARTTAB; CREATE UNIQUE INDEX DB2INST1.IXTG_PARTTAB ON DB2INST1.TG_PARTTAB ( PK ASC ); ソース表 しておく ソース表にデータを データをINSERTしておく • >db2 insert into parttab values (1,1) DB20000I SQL コマンドが正常に完了しました。 >db2 select * from parttab PK RK ----------- ----------1 1 1 レコードが選択されました。 10 © 2009 ISE Corporation 検証: 差分レプリケーションの確認 • Qcaptureの のスタート asnqcap capture_server=QREPDB capture_schema=QREP3 ASN0600I "Q Capture" : "" : "Initial" : プログラム "mqpub 9.7.4" は開始中です。 ASN0594I "Q Capture" : "QREP3" : "Initial" プログラムは、キーが "(Global¥OSSEIPC48tempDB2_03 QREPDB.QREP3.QCAP.IPC, Global¥OSSEIPC49tempDB2_03.QREPDB.QREP3.QCAP.IPC, Global¥OSSEIPC50tempDB2_03.Q" の IPC キューを作成しました。 ASN7010I “Q Capture” Capture” : “QREP3” QREP3” : “WorkerThread” WorkerThread” : プログラムは プログラムは、ソース表 ソース表 “MANA.PARTTAB” MANA.PARTTAB” の発行または 発行または Q サブスクリプション “PARTTAB0001” PARTTAB0001” (送信キュー 送信キュー “Q3” Q3”、発行または 発行またはレプリケーション またはレプリケーション・ レプリケーション・キュー・ キュー・マップ "QREPDB_QREP3_T_QREPDB_QREP3") を正常に 正常に活動化しました 活動化しました。 しました。 ASN7000I "Q Capture" : "QREP3" : "WorkerThread" : "1" サブスクリプションがアクティブです。 " “ サブスクリプションは非アクティブです。新しい ”0“ サブスクリプションは、正常に活動化されました。 新しい "0" サブスクリプションは、活動化できず非アクティブになっています。 ASN0572I "Q Capture" : "QREP3" : "WorkerThread" : "mqpub 9.7.4" プログラムは正常に初期化され ました。 11 © 2009 ISE Corporation 検証: 差分レプリケーションの確認 • QApplyの のスタート asnqapp apply_server=QREPDB apply_schema=QREP3 LOGSTDOUT=Y ASN0600I “Q Apply” : “” : “Initial” : プログラム “mqapply 9.7.4” は開始中です (中略) ASN7606I "Q Apply" : "QREP3" : "BR00000" : Q サブスクリプション "PARTTAB0001" (受信 (受信キュー 受信キュー "Q3"、 "Q3"、レプリケー ション・ ション・キュー・ キュー・マップ "QREPDB_QREP3_TO_QREPDB_QREP3") がアクティブです アクティブです。 です。 ASN7526I "Q Apply" : "QREP3" : "BR00000" : Q アプライ・プログラムが、レプリケーション・キュー・マップ “QREPDB_QREP3_TO_QREPDB_QREP3” の受信キュー “Q3” の処理を開始しました。 (中略) ASN7607I "Q Apply" : "QREP3" : "BR00000" : Q サブスクリプション "PARTTAB0001" (受信キュー "Q3"、レプリケー ション・キュー・マップ "QREPDB_QREP3_TO_QREPDB_QREP3") がターゲットのロードを終了しました。変更は、スピル・ キュー "IBMQREP.SPILL.MODELQ.0.1.1" から適用されます。 ASN8999D Browser for queue 'Q3' received a 'ASNMQ_LOADDONE_RCVD' message. ASN7606I "Q Apply" : "QREP3" : "BR00000" : Q サブスクリプション "PARTTAB0001" (受信キュー "Q3"、レプリケー ション・キュー・マップ "QREPDB_QREP3_TO_QREPDB_QREP3") がアクティブです。 12 © 2009 ISE Corporation 検証: 差分レプリケーションの確認 • ソース表 とレプリケーションの ソース表へのINSERTと への レプリケーションの確認 >db2 insert into parttab values (100,100) DB20000I SQL コマンドが正常に完了しました。 >db2 select * from parttab PK RK ----------- ----------1 1 100 100 2 レコードが選択されました。 >db2 select * from tg_parttab PK RK ----------- ----------1 1 100 100 差分レプリケーションの 確認 2 レコードが選択されました。 13 © 2009 ISE Corporation 参考:V9.5の場合 • V9.5でも でもRange Partition表 表をソース表 でも ソース表として登録 として登録はできてしまうが 登録はできてしまうが、 はできてしまうが、 QCaptureで でエラーになり 直後に エラーになり、 になり、CAPSTART直後 直後にサブスクリプションが サブスクリプションが非 活動化される 活動化される • IBMQREP_SENDQUEUESのERROR_ACTIONが‘S’であっても、 QCaptureは停止はしない asnqcap capture_server=QREPDB capture_schema=QREP3 LOGSTDOUT=Y 009-04-14-03.09.14.546000 ASN0600I "Q Capture" : "" : "Initial" : Program "mqpub 9.5.0" is starting. (中略) ASN0630E "Q Capture" :"QREP3" : "WorkerThread" : Table "DB2INST1.PARTTAB" is a partitioned table . ASN0589I "Q Capture" : "QREP3" : "WorkerThread" The program received an unexpected return code "6020" from routine "masterSub::masterSub". ASN7133I “Q Capture” :“QREP3” : “WorkerThread” : The publication or Q subscription “PARTTAB0001” was stopped. ASN7006E "Q Capture" : "QREP3" : "WorkerThread" : The publication or Q subscription "PARTTAB0001" was deactivated due to an error. IBMQREP_SUBS表のSTATE 14 N(新規登録) => I(非活動) © 2009 ISE Corporation 検証: ATTACH Partitionの確認 • 新しいパーティション しいパーティションの パーティションのアタッチ CREATE TABLE WORKTAB (pk int,rk int) IN USERSPACE1 ; INSERT INTO WORKTAB VALUES (300,300); ALTER TABLE WORKTAB DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS; ALTER TABLE PARTTAB ATTACH PARTITION p3 STARTING (300) ENDING (399) FROM WORKTAB; => SQL3601W ステートメントにより 1 つ以上の表が自動的に SET INTEGRITY ペンディング状態になりました。 SQLSTATE=01586 Qcaptureが がパーティションの パーティションのアタッチを アタッチを検知 • (Qcaptureが停止していた場合は、次回のWARMスタート時に検知する) ASN7184W “Q Capture” : “QREP3” : “WorkerThread” : ソース表 “MANA.PARTTAB” にデータ・パーティション "3" がアタッチ アタッチされました アタッチされました。 されました しかし、 しかし、アタッチした アタッチした表 した表にデータが データが入っていても、 っていても、それはレプリケーション それはレプリケーションされない レプリケーションされない • >db2 select * from tg_parttab PK RK ----------- ----------1 1 100 100 2 レコードが選択されました。 15 © 2009 ISE Corporation 検証: ATTACH Partitionの確認 • アタッチした とレプリケーションの アタッチしたパーティション したパーティションに パーティションに含まれる行 まれる行のINSERTと レプリケーションの確認 set integrity ペンディ ング状態のため、新し い行の追加不可 >db2 insert into parttab values (350,350) DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQLステートメントとして処理 されました。 SQL 処理中に、そのコマンドが返されました。 SQL0327N 定義済みデータ・パーティションの範囲外であるため、行を表“MANA.PARTTAB” に挿入できません。 SQLSTATE=22525 >db2 set integrity for parttab allow write access immediate checked DB20000I SQL コマンドが正常に完了しました。 set integrityの実行 >db2 insert into parttab values (350,350) DB20000I SQL コマンドが正常に完了しました。 >db2 select * from parttab 新しい行の追加 PK RK ----------- ----------1 1 100 100 300 300 350 350 ソース表に追加確認 4 レコードが選択されました。 >db2 select * from tg_parttab PK RK ----------- ----------パーティションをアタッチ後に挿入した行(350) は、レ 1 1 プリケーションされたが、アタッチ前に既存であった行 100 100 (300)は、自動的にはレプリケーションされていない 350 350 3 レコードが選択されました。 16 © 2009 ISE Corporation 検証: ADD Partitionの確認 • 新しいパーティション しいパーティションの パーティションの追加( 追加(ADD) • パーティション表はATTACHの検証時と同じPARTTAB ALTER TABLE PARTTAB ADD PARTITION p3 STARTING (300) ENDING (399) Qcaptureが がパーティションの パーティションの追加を 追加を検知 • (Qcaptureが停止していた場合は、次回のWARMスタート時に検知する) ASN7184W “Q Capture” : “QREP3” : “WorkerThread” : ソース表 “MANA.PARTTAB” にデータ・パーティション “3” が追加 追加されました 追加されました。 されました • パーティションの パーティションの追加は 追加は、データの データの追加を 追加を伴わないので、 わないので、ソース表 ソース表、ターゲット表 ターゲット表とも変化 とも変化なし 変化なし >db2 select * from parttab PK RK ----------- ----------1 1 100 100 2 レコードが選択されました。 17 >db2 select * from tg_parttab PK RK ----------- ----------1 1 100 100 2 レコードが選択されました。 © 2009 ISE Corporation 検証: ADD Partitionの確認 • 追加した とレプリケーションを 追加したパーティション したパーティションに パーティションに含まれるデータ まれるデータの データのINSERTと レプリケーションを確認 ADDの場合は、set integrityの実行は不要 のため、すぐにデータ 挿入可能 >db2 insert into parttab values (350,350) >db2 select * from parttab PK RK ----------- ----------1 1 100 100 350 350 ソース表へのデータ挿入の確認 3 レコードが選択されました。 >db2 select * from tg_parttab PK RK ----------- ----------1 1 100 100 350 350 ターゲット表へも レプリケーションされている 3 レコードが選択されました。 18 © 2009 ISE Corporation 検証: DETACH Partitionの確認 • パーティションの パーティションのデタッチ • パーティション表はADDの検証後の状態のPARTTAB(P3のパーティションが追加済み) ALTER TABLE PARTTAB DETACH PARTITION p3 INTO WORKTAB2 Qcaptureが がパーティションの パーティションのデタッチを デタッチを検知 • (Qcaptureが停止していた場合は、次回のWARMスタート時に検知する) ASN7184W “Q Capture” : “QREP3” : “WorkerThread” : ソース表 “MANA.PARTTAB” からデータ・パーティション “3” がデタッチ デタッチされました デタッチされました。 されました • ソース表 の行が見えなくなる (デタッチは は不要) ソース表は、p3に 、p に入っていた350の っていた デタッチはset integrityは 不要) >db2 select * from parttab PK RK ----------- ----------1 1 100 100 350 350 3 レコードが選択されました。 19 p3のDETACH >db2 select * from parttab PK RK ----------- ----------1 1 100 100 2 レコードが選択されました。 © 2009 ISE Corporation 検証: DETACH Partitionの確認 • デタッチで デタッチで見えなくなった行 えなくなった行は、ターゲット表 ターゲット表の方はそのまま残 はそのまま残る >db2 select * from parttab PK RK ----------- ----------1 1 100 100 350 350 3 レコードが選択されました。 20 ソース表の p3のDETACH 変化なし >db2 select * from tg_parttab PK RK ----------- ----------1 1 100 100 350 350 3 レコードが選択されました。 © 2009 ISE Corporation 運用上の考慮点 • ATTACH • データの入った表をアタッチする場合は、ターゲット表にも同じデー タを挿入するか、ターゲット表もパーティション表の場合は同じように アタッチしてからレプリケーションを再開 • ADD • ターゲット表がパーティション表の場合は、同じレンジのパーティショ ンをADDしてからレプリケーションを再開 • DETACH • ターゲット表からもデータを削除したい場合は、手動で削除するか、 ターゲット表もパーティション表の場合は同じようにデタッチしてから レプリケーションを再開 • ターゲット表は履歴としてデータを残しておきたい場合は、そのまま でよい 21 © 2009 ISE Corporation ATTACHの場合の注意事項 • ATTACHする する表 Capture Changes (DCC)の の付加は する表へのData への 付加は、 ATTACHの の直前に 直前に行うこと • 即ち、DCCの付加とATTACHの の間にデータの データの更新が 更新が発生しないよう 発生しないよう にすること! • DCCをつけてからATTACHするまでにデータの挿入や更新があると、そ の変更がATTACH後にレプリケーションされてしまうことがある • レプリケーションされる条件 • Capture停止中 停止中に、DCCがついている表のデータの更新し、ATTACHを実行 停止中 • その後 その後Captureを開始 • Capture起動時にATTACHを検知するが、Capture停止中の更新も収集 対象の更新として扱ってしまう • Capture起動後にATTACHが発行された場合は、収集しない • DETACHに に関してもDELETEおよび およびDETACHを をCapture停止中 停止中に しても および 停止中に 実施すると が収集されない 検討 実施するとDELETEが すると 収集されない問題 されない問題がある 問題がある(WARNING検討 がある 中) 22 © 2009 ISE Corporation :Attach操作の考慮点 • Capture停止中 停止中に 停止中に収集してしまう 収集してしまう例 してしまう例 create table temp (pk smallint not null,rk smallint,description char(20)) in userspace1 DATA CAPTURE CHANGES insert into temp ; values (46,46,null); alter table test_source attach partition part4 starting (41) ending (50) from temp; • Capture停止中 停止中に 停止中に収集しない 収集しない例 しない例 create table temp (pk smallint not null,rk smallint,description char(20)) in userspace1; insert into temp values (46,46,null); Data Capture Changesを Alter table temp data capture changes; Attachの直前に実行 alter table test_source attach partition part4 starting (41) ending (50) from temp; 23 © 2009 ISE Corporation Range partition表のサポートはBiDir、P2Pでも使用可能 • BiDir、 、P2Pの の双方向レプリケーション 双方向レプリケーションでも レプリケーションでも、 でも、 Range partition表 表をサポート • ただし、 の場合は ただし、P2Pの 場合は以下の 以下の考慮点あり 考慮点あり • ATTACHの場合、P2P用の追加列とデフォルト値を含む 表を作成して、ATTACHする必要がある • IBMQREPVERTIME • TIMESTAMP NOT NULL WITH DEFAULT '0001-01-0100.00.00.000000‘ • IBMQREPVERNODE • SMALLINT NOT NULL WITH DEFAULT 0 24 © 2009 ISE Corporation 検証: 差分レプリケーションの確認 PARTTAB2表 表のDDL • CREATE TABLE YANAV97.PARTTAB2 (pk int, rk int) IN USERSPACE1 PARTITION BY RANGE (rk) (PART p0 STARTING 0, PART p1 STARTING 100, PART p2 STARTING 200 ENDING 299) ; CREATE UNIQUE INDEX YANAV97.IX_PARTTAB2 ON DB2INST1.PARTTAB ( PK ASC ); ALTER TABLE YANAV97.PARTTAB2 DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS; • パーティション表 パーティション表の確認 DB2 DESCRIBE DATA PARTITIONS FOR TABLE PARTTAB2 SHOW DETAIL PartitionId Inclusive (y/n) Low Value ----------- - ------------------------------0 Y 0 1 Y 100 2 Y 200 PartitionId PartitionName ----------0 1 2 25 Inclusive (y/n) High Value - ------------------------------N 100 N 200 Y 299 TableSpId PartObjId ------------------------------- ----------- ----------P0 2 19 P1 2 281 P2 2 512 IndexTblSpId LongTblSpId AccessMode Status ------------ ----------- - -----2 2 F 2 2 F 2 2 F © 2009 ISE Corporation 検証: 差分レプリケーションの確認 TG_PARTTAB2表 表のDDL • CREATE TABLE YANAV97.TG_PARTTAB2 (pk int, rk int) IN USERSPACE1 PARTITION BY RANGE (rk) (PART p0 STARTING 0, PART p1 STARTING 100, PART p2 STARTING 200 ENDING 299) ; CREATE UNIQUE INDEX YANAV97.IX_TG_PARTTAB2 ON YANAV97.TG_PARTTAB2 ( PK ASC ); ALTER TABLE YANAV97.TG_PARTTAB2 DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS; パーティション表 パーティション表の確認 • DB2 DESCRIBE DATA PARTITIONS FOR TABLE TG_PARTTAB2 SHOW DETAIL PartitionId Inclusive (y/n) Low Value ----------- - ------------------------------0 Y 0 1 Y 100 2 Y 200 PartitionId PartitionName ----------0 1 2 26 Inclusive (y/n) High Value - ------------------------------N 100 N 200 Y 299 TableSpId PartObjId ------------------------------- ----------- ----------P0 2 18 P1 2 280 P2 2 281 IndexTblSpId LongTblSpId AccessMode Status ------------ ----------- - -----2 2 F 2 2 F 2 2 F © 2009 ISE Corporation 検証: 差分レプリケーションの確認 ASNCLPで で定義すると 、IBMQREPVERNODEをそれぞれの をそれぞれの表 定義すると IBMQREPVERTIME、 をそれぞれの表に追加 • ALTER TABLE YANAV97.PARTTAB2 ADD IBMQREPVERTIME TIMESTAMP NOT NULL WITH DEFAULT '0001-01-01-00.00.00' ADD IBMQREPVERNODE SMALLINT NOT NULL WITH DEFAULT 0 DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS ALTER TABLE YANAV97.TG_PARTTAB2 ADD IBMQREPVERTIME TIMESTAMP NOT NULL WITH DEFAULT '0001-01-01-00.00.00' ADD IBMQREPVERNODE SMALLINT NOT NULL WITH DEFAULT 0 DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS PARTTAB2表 表にデータを データをINSERTしておく しておく • >db2 insert into parttab2 values (1,1) DB20000I SQL コマンドが正常に完了しました。 >db2 select * from parttab2 PK RK IBMQREPVERTIME IBMQREPVERNODE ----------- ----------- -------------------------- -------------1 1 0001-01-01-00.00.00.000000 0 1 record(s) selected. 27 © 2009 ISE Corporation 検証: 差分レプリケーションの確認 • PARTTAB2表 表へのINSERTと とレプリケーションの への レプリケーションの確認 >db2 insert into parttab2(pk,rk) values (100,100) DB20000I SQL コマンドが正常に完了しました。 >select * from parttab2 PK RK ----------- ----------1 1 100 100 IBMQREPVERTIME IBMQREPVERNODE -------------------------- -------------0001-01-01-00.00.00.000000 0 2009-04-30-02.37.48.402853 4 2 record(s) selected. >select * from tg_parttab2 PK RK ----------- ----------1 1 100 100 IBMQREPVERNODE=0: フルリフレッシュ時に挿入 IBMQREPVERNODE=4: 差分レプリケーションの確認 IBMQREPVERTIME IBMQREPVERNODE -------------------------- -------------0001-01-01-00.00.00.000000 0 2009-04-30-02.37.48.402853 4 2 record(s) selected. 28 © 2009 ISE Corporation 検証: ATTACH Partitionの確認 新しいパーティション しいパーティションの パーティションのアタッチ • Attatchする表に、P2P用の列 を作成することを忘れずに! CREATE TABLE WORKTAB (pk int,rk int, ibmqrepvertime timestamp not null with default '0001-01-01-00.00.00.000000', ibmqrepvernode smallint not null with default 0) IN USERSPACE1 ; ALTER TABLE WORKTAB DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS; INSERT INTO WORKTAB(pk,rk) VALUES (300,300); ALTER TABLE PARTTAB2 ATTACH PARTITION p3 STARTING (300) ENDING (399) FROM WORKTAB; => SQL3601W The statement caused one or more tables to automatically be placed in the Set Integrity Pending state. SQLSTATE=01586 Qcaptureが がパーティションの パーティションのアタッチを アタッチを検知 • 2009-04-30-11.40.12.935445 ASN7184W "Q Capture" : "QREP1" : "WorkerThread" : Data partition "3" was attached to the source table "YANAV97.PARTTAB2". SET INTEGRITY を実行 • set integrity を忘れずに! >db2 set integrity for parttab2 allow write access immediate checked DB20000I The SQL command completed successfully. >db2 select * from parttab2 PK RK IBMQREPVERTIME IBMQREPVERNODE ----------- ----------- -------------------------- -------------1 1 0001-01-01-00.00.00.000000 0 100 100 2009-04-30-02.37.48.402853 4 300 300 0001-01-01-00.00.00.000000 0 3 record(s) selected. 29 © 2009 ISE Corporation 検証: ATTACH Partitionの確認 • 片方の 片方の表にも新 にも新しいパーティション しいパーティションの パーティションのアタッチ Attatchする表に、P2P用の列 を作成することを忘れずに! CREATE TABLE WORKTAB (pk int,rk int, ibmqrepvertime timestamp not null with default '0001-01-01-00.00.00.000000', ibmqrepvernode smallint not null with default 0) IN USERSPACE1 ; ALTER TABLE WORKTAB DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS; INSERT INTO WORKTAB(pk,rk) VALUES (300,300); ALTER TABLE TG_PARTTAB2 ATTACH PARTITION p3 STARTING (300) ENDING (399) FROM WORKTAB; => SQL3601W The statement caused one or more tables to automatically be placed in the Set Integrity Pending state. SQLSTATE=01586 Qcaptureが がパーティションの パーティションのアタッチを アタッチを検知 • 2009-04-30-11.47.13.250920 ASN7184W “Q Capture” : “QREP2” : “WorkerThread” : Data partition "3" was attached to the source table "YANAV97.TG_PARTTAB2" • SET INTEGRITY を実行 set integrity を忘れずに! >db2 set integrity for tg_parttab2 allow write access immediate checked DB20000I The SQL command completed successfully. >db2 select * from tg_parttab2 PK RK IBMQREPVERTIME IBMQREPVERNODE ----------- ----------- -------------------------- -------------1 1 0001-01-01-00.00.00.000000 0 100 100 2009-04-30-02.37.48.402853 4 300 300 0001-01-01-00.00.00.000000 0 3 record(s) selected. 30 © 2009 ISE Corporation 検証: ATTACH Partitionの確認 • アタッチした とレプリケーションの アタッチしたパーティション したパーティションに パーティションに含まれる行 まれる行のINSERTと レプリケーションの確認 >db2 insert into parttab2(pk,rk) values (350,350) DB20000I The SQL command completed successfully. >db2 select * from parttab2 PK RK IBMQREPVERTIME IBMQREPVERNODE ----------- ----------- -------------------------- -------------1 1 0001-01-01-00.00.00.000000 0 100 100 2009-04-30-02.37.48.402853 4 300 300 0001-01-01-00.00.00.000000 0 350 350 2009-04-30-02.44.12.706994 4 4 record(s) selected. 新しい行の追加 レプリケーション確認 >db2 select * from tg_parttab2 PK RK IBMQREPVERTIME IBMQREPVERNODE ----------- ----------- -------------------------- -------------1 1 0001-01-01-00.00.00.000000 0 100 100 2009-04-30-02.37.48.402853 4 300 300 0001-01-01-00.00.00.000000 0 350 350 2009-04-30-02.44.12.706994 4 4 record(s) selected. 31 © 2009 ISE Corporation 検証: ADD Partitionの確認 • 新しいパーティション しいパーティションの パーティションの追加( 追加(ADD) • パーティション表はATTACHの検証時と同じPARTTAB2 ALTER TABLE PARTTAB2 ADD PARTITION p3 STARTING (300) ENDING (399) Qcaptureが がパーティションの パーティションの追加を 追加を検知 • 2009-05-01-10.45.54.365061 ASN7183W "Q Capture" : "QREP1" : "WorkerThread" : Data partition "3" was added to the source table "YANAV97.PARTTAB2". • 同様にもう 同様にもう片方 にもう片方の 片方の表に対してもパーティション してもパーティションを パーティションをADD ALTER TABLE TG_PARTTAB2 ADD PARTITION p3 STARTING (300) ENDING (399) • Qcaptureが がパーティションの パーティションの追加を 追加を検知 2009-05-01-10.47.23.380852 ASN7183W "Q Capture" : "QREP2" : "WorkerThread" : Data partition "3" was added to the source table "YANAV97.TG_PARTTAB2". 32 © 2009 ISE Corporation 検証: ADD Partitionの確認 • ADDの場合は、set integrityの実行は不要 のため、すぐにデータ 挿入可能 追加した とレプリケーションを 追加したパーティション したパーティションに パーティションに含まれるデータ まれるデータの データのINSERTと レプリケーションを確認 >db2 insert into tg_parttab2(pk,rk) values (350,350) DB20000I The SQL command completed successfully. >db2 select * from tg_parttab2 PK RK IBMQREPVERTIME IBMQREPVERNODE 片方の表へのデータ挿入の確認 ----------- ----------- -------------------------- -------------1 1 0001-01-01-00.00.00.000000 0 100 100 2009-04-30-02.37.48.402853 4 350 350 2009-05-01-01.48.07.867481 8 3 record(s) selected. >db2 select * from parttab2 PK RK IBMQREPVERTIME IBMQREPVERNODE ----------- ----------- -------------------------- -------------レプリケーションされている 1 1 0001-01-01-00.00.00.000000 0 100 100 2009-04-30-02.37.48.402853 4 350 350 2009-05-01-01.48.07.867481 8 3 record(s) selected. 33 © 2009 ISE Corporation 検証: DETACH Partitionの確認 • パーティションの パーティションのデタッチ • パーティション表はADDの検証後の状態のPARTTAB2(P3のパーティションが追加済み) ALTER TABLE PARTTAB2 DETACH PARTITION p3 INTO WORKTAB2 • Qcaptureが がパーティションの パーティションのデタッチを デタッチを検知 2009-05-01-10.36.43.696422 ASN7185W "Q Capture" : "QREP1" : "WorkerThread" : Data partition "3" was detached from the source table "YANAV97.PARTTAB2". 34 © 2009 ISE Corporation 検証: DETACH Partitionの確認 • PARTTAB2表 表は、p3に 、350の の行が見えなくなる (デタッチは は不要) 、p に入っていた300、 っていた デタッチはset integrityは 不要) >db2 select * from parttab2 PK RK IBMQREPVERTIME IBMQREPVERNODE ----------- ----------- -------------------------- -------------1 1 0001-01-01-00.00.00.000000 0 100 100 2009-04-30-02.37.48.402853 4 300 300 0001-01-01-00.00.00.000000 0 350 350 2009-04-30-02.44.12.706994 4 4 record(s) selected. 。 P3の Detach >select * from parttab2 PK RK ----------- ----------1 1 100 100 IBMQREPVERTIME IBMQREPVERNODE -------------------------- -------------0001-01-01-00.00.00.000000 0 2009-04-30-02.37.48.402853 4 2 record(s) selected. 35 © 2009 ISE Corporation 検証: DETACH Partitionの確認 • 同様に 同様に片方の 片方の表に対してパーティション してパーティションを パーティションをデタッチ ALTER TABLE TG_PARTTAB2 DETACH PARTITION p3 INTO WORKTAB2 • Qcaptureが がパーティションの パーティションのデタッチを デタッチを検知 2009-05-01-10.43.58.314665 ASN7185W "Q Capture" : "QREP2" : "WorkerThread" : Data partition "3" was detached from the source table "YANAV97.TG_PARTTAB2". 36 © 2009 ISE Corporation 検証: DETACH Partitionの確認 • TG_PARTTAB2表 表は、p3に 、350の の行が見えなくなる (デタッチは は不要) 、p に入っていた300、 っていた デタッチはset integrityは 不要) >db2 select * from tg_parttab2 PK RK IBMQREPVERTIME IBMQREPVERNODE ----------- ----------- -------------------------- -------------1 1 0001-01-01-00.00.00.000000 0 100 100 2009-04-30-02.37.48.402853 4 300 300 0001-01-01-00.00.00.000000 0 350 350 2009-04-30-02.44.12.706994 4 4 record(s) selected. 。 P3の Detach >select * from tg_parttab2 PK RK ----------- ----------1 1 100 100 IBMQREPVERTIME IBMQREPVERNODE -------------------------- -------------0001-01-01-00.00.00.000000 0 2009-04-30-02.37.48.402853 4 2 record(s) selected. 37 © 2009 ISE Corporation ブランク・ ブランク・ページ 38 © 2009 ISE Corporation Compression表のサポート Compression表のサポート 39 © 2009 ISE Corporation Compression表のサポート 当機能の目的と使用方法 目的 Compressされた された表 された表をソースとした ソースとした差分 とした差分レプリケーション 差分レプリケーションの レプリケーションのサポート 使用方法と 使用方法と変更点 Qcaptureが が自動的に も使用可能) 自動的に使用( 使用(SQL Captureも 使用可能 DB2の のLOG read APIの の機能拡張による 機能拡張による 使用可能な 使用可能なレベル IRS V9.7 GA ~ 対象プラットフォーム 対象プラットフォーム Linux, Unix, Windows 40 © 2009 ISE Corporation 圧縮とレプリケーション V95まではData Capture Changes属性が表に付与できない(SQL0270N) DB2LogreadAPIは圧縮されたDataを非圧縮してCaptureへ返すことができない DB2ReadLogAPI V9.5 Log V97からData Capture Changes属性が表に付与可能 (XML列の圧縮もサポート) DB2ReadLogAPI V9.7 Log Dictionary 41 Compressed data Uncompressed data © 2009 ISE Corporation 行圧縮機能の概要(1/2) • 辞書を 辞書を使った行 った行レベルの レベルのデータ圧縮 データ圧縮 • 表のレコード情報から作成された辞書を使用して、実データを圧縮する機能 • 圧縮対象は、データ・ページのデータとログ・レコード • LONG/LOB列、索引データは圧縮の対象外 • XML列は、INLINEでなくとも圧縮対象とすることが可能(V9.7で新規作成の表のみ対象) • 辞書には、レコードにある特定のパターンが記録される 名前 部署 給与 都道府県 区・市 郵便番号 Fred 500 10000 東京都 港区 24355 John 500 20000 東京都 港区 24355 Fred 50 0 100 00 東京 都 港 区 243 55 Joh n 50 0 200 00 東京 都 港 区 243 55 … ディクショナリー 01 500 Fred 42 (0 1) 100 00 (02) Joh n (01 ) 200 00 (02) … 02 東京都, 東京都 港 区,24355 … … © 2009 ISE Corporation 行圧縮機能の概要(2/2) • 辞書を 辞書を使った行 った行レベルの レベルのデータ圧縮 データ圧縮( 圧縮(続き) • 設定単位は、表 • 辞書の作成は、データ・パーティション単位で行なわれる • • パーティション・データベースでは、さらにデータベース・パーティションごとに作成 される 新機能 Data Capture Changes属性が付与された表は1世代前の辞書をKeep可能 • メリット 43 • 特に繰り返しの多いデータがある場合、データ・ページ使用量の削減が期待できる • ディスクI/O(読み取り量)が削減できるため、I/Oネックのシステムには効果がある • より多くのデータが圧縮された状態でバッファープールに乗るため、バッファープール HIT率の向上が期待できる • ログ・ファイルへの書き出し量が削減される • Captureの処理が遅れている場合に辞書が再作成されても1世代前の辞書を使用して 新機能 変更収集を継続可能 © 2009 ISE Corporation 行圧縮の流れ (圧縮対象表の 圧縮対象表の検討時) 検討時) 1. 圧縮率の見積もり • INSPECTコマンド、 ADMIN_GET_TAB_COMPRESS_INFO表関数 (表データの データの初期圧縮) 初期圧縮) 2. 表へのCOMPRESS属性の定義(COMPRESS=YES) 3. 辞書作成、データ圧縮 • REORG TABLEコマンド、自動辞書作成(ADC)、LOADコマンド(REPLACE)など (圧縮後の 圧縮後の本番メンテナンス 本番メンテナンス) メンテナンス) 4. 圧縮率の確認 • ADMIN_GET_TAB_COMPRESS_INFO表関数、 ADMINTABCOMPRESSINFO管 理ビュー、SYSCAT.TABLES カタログ・ビュー 5. 辞書再作成、データ再圧縮 • RESETDICTIONARYオプションを指定したREORG TABLEコマンド -以降、必要に応じて、4~5を繰り返し実施する (注意) Capture対象表に関しては辞書を再作成する前に変更収集をEnd of Logまで終了させて おく 注意 44 © 2009 ISE Corporation 辞書の作成方法 • Shadow Copyアプローチ アプローチによる ~) アプローチによる表 による表の再編成( 再編成(V9.1~) • 再編成処理の中で、辞書を作成した上で、辞書に基づいた表データの圧縮を行なう。 圧縮に使用される辞書は、既存を引き継ぐのか、新規に作成するのかを、オプション で指定できる。 • 自動辞 、V9.5~ ~) 自動辞書作成( 書作成(ADC: Automatic Dictionary Creation、 • 一定量のデータが表に格納された時点で、DB2が自動的に辞書を作成する。 • REPLACE モードによる コマンド( ~) モードによるLOADコマンド による コマンド(V9.5~) • LOAD処理中に一定量のデータが表に格納された時点で、DB2が自動的に辞書を 作成する。辞書作成後に投入されたデータは、データ圧縮が行なわれて、表に格納 される。デフォルトでは、既存の辞書が存在する場合には、その辞書が引き継がれ る。 • 見積もり 見積もり機能 もり機能による 機能による辞書作成 による辞書作成 • INSPECTコマンド(V9.1~)、ADMIN_GET_TAB_COMPRESS_INFO表関数 (V9.5~) • 圧縮率の見積もりを行なう際に作成される辞書が残る • 辞書が保持されるのは、COMPRESS属性がYES、かつ 表に既存の辞書が存在 しない場合 45 © 2009 ISE Corporation 表の再編成による表データの圧縮 • 表の再編成とあわせて 再編成とあわせて、 とあわせて、辞書の 辞書の作成よび 作成よびデータ よびデータの データの圧縮を 圧縮を行なうことが可能 なうことが可能 • 圧縮が行なわれるのは、表で行圧縮の設定が有効となっている場合のみ • 他の辞書作成方法と異なり、既存の表データを圧縮することが可能 • 圧縮の 圧縮のコマンド例 コマンド例 1. ALTER TABLEステートメントで、COMPRESSオプションの変更 ALTER TABLE T2 COMPRESS YES 2. 辞書の作成、データの圧縮 REORG TABLE T2 KEEPDICTIONARY REORG TABLE T1 RESETDICTIONARY 46 <辞書の作成、既存辞書がある場合は、 引継ぐ(デフォルトの動作)> <辞書の作成> © 2009 ISE Corporation ADCによる自動辞書作成(1/3) • 一定量の が自動的に 一定量のデータが データが表に格納された 格納された時点 された時点で 時点で、DB2が 自動的に辞書を 辞書を作成する 作成する • 容量のしきい値は、約1~2MB。データをサンプリングして、辞書が作成される(しきい値は内部 的に決められている) • 自動的に辞書作成が行われるのは、しきい値を最初に越えた時点のみ(一度のみ) • 辞書作成後に 辞書作成後に挿入された 挿入されたデータ されたデータが データが、圧縮して 圧縮して格納 して格納される 格納される • 既存データは、圧縮されない • ADCが が使用可能な 使用可能な条件は 条件は、以下のとおり 以下のとおり • 表のCOMPRESS属性がYESに定義されている • その表に辞書が作成されていない • 辞書がすでに存在する場合、ADCは機能しない • ADCの のトリガーとなる トリガーとなる操作 となる操作は 操作は、以下のとおり 以下のとおり • INSERT • IMPORT INSERT • LOAD INSERT • REDISTRIBUTE DATABASE PARTITION GROUP 47 © 2009 ISE Corporation ADCによる自動辞書作成(2/3) 48 © 2009 ISE Corporation ADCによる自動辞書作成(3/3) (ADCによる による動 による動き) • 圧縮辞書を 圧縮辞書を持たない空 たない空の表が存在する 存在する。 する。 • 表にデータが データが挿入される 挿入される。 される。辞書が 辞書が存在しないため 存在しないため、 しないため、データは データは圧縮されない 圧縮されない。 されない。 • 更にデータが データが挿入されるが 挿入されるが、 されるが、辞書が 辞書が存在しないため 存在しないため、 しないため、データは データは圧縮されない 圧縮されない。 されない。 • しきい値 しきい値に達すると、 すると、自動的に 自動的に辞書作成が 辞書作成が開始される 開始される( される(COMPRESS YES の場合のみ 場合のみ)。 のみ)。 • 圧縮辞書が 圧縮辞書が作成される 作成される( される(既存の 既存のデータは データは圧縮されないまま 圧縮されないまま存在 されないまま存在する 存在する)。 する)。 • 圧縮辞書が 圧縮辞書が表に付加される 付加される。 される。 • この時点以降 この時点以降に 時点以降に挿入された 挿入されたデータ されたデータは データは、圧縮して 圧縮して格納 して格納される 格納される。 される。 ※既存の が必要。 既存のデータを データを圧縮するには 圧縮するには、 するには、オフラインREORGが オフライン 必要。 49 © 2009 ISE Corporation XMLデータの圧縮 • DB2 V9.5では、指定したサイズ以下のXMLデータを基礎表に保持可能になった • 基礎表に保持させたいXML列を定義する際に「INLINE LENGTH <integer>」キーワード を付加する。 • 下記の例では、10000バイト以下のXMLデータを、ベース表に保持する。 • 基礎表に 基礎表に保持されたものが 保持されたものがV9.5 されたものがV9.5での V9.5での圧縮対象 での圧縮対象 • DB2 V9.7では V9.7ではXDA ではXDAオブジェクト XDAオブジェクトに オブジェクトに保持された 保持されたXML されたXMLデータ XMLデータも データも圧縮対象 create table dept (deptID char(8),...,doc XML inline length 10000) データ・ データ・オブジェクト 圧縮可( 圧縮可(V9.5) V9.5) 50 ID … PR27 … PR28 … ACC … 索引オブジェクト 索引オブジェクト DOC (XML) XML記述子 記述子 Regions Index 圧縮可( 圧縮可(DB2 V9.7) V9.7) XDAオブジェクト オブジェクト(XML Data) オブジェクト © 2009 ISE Corporation 「RESETDICTIONARY」 activeとHistorical Dictionary • REORG RESETDICTIONARY COMPRESS 辞書が存在するか 結果 Y Y 辞書が 辞書が再作成され 再作成され、 され、行が圧縮される 圧縮される Y N 辞書が 辞書が新規作成され 新規作成され、 され、行が圧縮される 圧縮される N Y 辞書が 辞書が除去され 除去され、 され、全行圧縮解除される 全行圧縮解除される N N 影響なし 影響なし、 なし、全行圧縮解除される 全行圧縮解除される • Data Capture Changes属性が付与されている場合は再作成時に古い辞書は保持さ れる • INSPECTコマンドにてHistorical Dictionaryの有無を判断可能 Table phase start (ID Signed: 4, Unsigned: 4; Tablespace ID: 2) : DB2V97.T1 Data phase start. Object: 4 Tablespace: 2 The index type is 2 for this table. Traversing DAT extent map, anchor 1088. Extent map traversal complete. Expansion dictionary size: 32768 bytes. Compression dictionary size: 19712 bytes. Historical expansion dictionary size: 32768 bytes. DAT Object Summary: Total Pages 291 - Used Pages 272 - Free Space 0 % Data phase end. 51 © 2009 ISE Corporation Compressed表 と辞書(Data pature Changeなし) create table t1(c1 int not null primary key,c2 char(20),c3 char(20)) in userspace1 compress yes DB20000I The SQL command completed successfully. . create procedure ins(in cnt int) begin declare i int default 0;-while i < cnt do insert into t1 values (i,char(i),char(i));-if mod(i,100) = 0 then commit;-end if;-set i = i + 1;-end while;-commit;-return 0;-end DB20000I The SQL command completed successfully. call ins(45000) Return Status = 0 52 © 2009 ISE Corporation Compressed表 と辞書 select COMPRESS_ATTR, DICT_BUILDER, DICT_BUILD_TIMESTAMP, COMPRESS_DICT_SIZE, EXPAND_DICT_SIZE from SYSIBMADM.ADMINTABCOMPRESSINFO WHERE tabname ='T1'and tabschema=USER COMPRESS_ATTR DICT_BUILDER DICT_BUILD_TIMESTAMP COMPRESS_DICT_SIZE EXPAND_DICT_SIZE ------------- ------------------------------ -------------------------- -------------------- -------------------Y Y TABLE GROWTH 2009-03-31-09.36.48.000000 NOT BUILT - 20864 32768 0 0 2 record(s) selected. reorg table t1 resetdictionary DB20000I The REORG command completed successfully. select COMPRESS_ATTR, DICT_BUILDER, DICT_BUILD_TIMESTAMP, COMPRESS_DICT_SIZE, EXPAND_DICT_SIZE from SYSIBMADM.ADMINTABCOMPRESSINFO WHERE tabname ='T1' and tabschema=USER COMPRESS_ATTR DICT_BUILDER Data Cpature Change属性 Change属性なしで 属性なしで はサイズは サイズは変化なし 変化なし DICT_BUILD_TIMESTAMP COMPRESS_DICT_SIZE EXPAND_DICT_SIZE ------------- ------------------------------ -------------------------- -------------------- -------------------Y Y REORG 2009-03-31-09.36.57.000000 NOT BUILT - 19712 32768 0 0 2 record(s) selected. (EXPAND_DICT_SIZE) Size of the expansion dictionary measured in bytes. If a historical dictionary exists, this value is the sum of the current and historical dictionary sizes. 53 © 2009 ISE Corporation Compressed表 と辞書(Data pature Changeあり) create table t1(c1 int not null primary key,c2 char(20),c3 char(20)) in userspace1 data capture changes compress yes DB20000I The SQL command completed successfully. . create procedure ins(in cnt int) begin declare i int default 0;-while i < cnt do insert into t1 values (i,char(i),char(i));-if mod(i,100) = 0 then commit;-end if;-set i = i + 1;-end while;-commit;-return 0;-end DB20000I The SQL command completed successfully. call ins(45000) Return Status = 0 54 © 2009 ISE Corporation Compressed表 と辞書 select COMPRESS_ATTR, DICT_BUILDER, DICT_BUILD_TIMESTAMP, COMPRESS_DICT_SIZE, EXPAND_DICT_SIZE from SYSIBMADM.ADMINTABCOMPRESSINFO WHERE tabname ='T1'and tabschema=USER COMPRESS_ATTR DICT_BUILDER DICT_BUILD_TIMESTAMP COMPRESS_DICT_SIZE EXPAND_DICT_SIZE ------------- ------------------------------ -------------------------- -------------------- -------------------Y Y TABLE GROWTH 2009-03-31-09.05.03.000000 NOT BUILT - 20864 32768 0 0 2 record(s) selected. reorg table t1 resetdictionary DB20000I The REORG command completed successfully. Data Cpature Change属性 Change属性ありで 属性ありで はサイズは サイズは変化あり 変化あり select COMPRESS_ATTR, DICT_BUILDER, DICT_BUILD_TIMESTAMP, COMPRESS_DICT_SIZE, EXPAND_DICT_SIZE from SYSIBMADM.ADMINTABCOMPRESSINFO WHERE tabname ='T1' and tabschema=USER COMPRESS_ATTR DICT_BUILDER DICT_BUILD_TIMESTAMP COMPRESS_DICT_SIZE EXPAND_DICT_SIZE ------------- ------------------------------ -------------------------- -------------------- -------------------Y Y REORG 2009-03-31-09.05.09.000000 NOT BUILT - 19712 65536 0 0 2 record(s) selected. (EXPAND_DICT_SIZE) Size of the expansion dictionary measured in bytes. If a historical dictionary exists, this value is the sum of the current and historical dictionary sizes. 55 © 2009 ISE Corporation Compressed表 と辞書(XML + Data Capature Changeあり) create table t1(c1 int not null primary key,c2 char(20),c3 xml ) in userspace1 data capture changes compress yes DB20000I The SQL command completed successfully. create procedure ins(in cnt int) begin declare i int default 0;-while i < cnt do insert into t1 values (i,char(i),'<name>XML TO XML</name>');-if mod(i,100) = 0 then commit;-end if;-set i = i + 1;-end while;-commit;-return 0;-end DB20000I The SQL command completed successfully. call ins(45000) Return Status = 0 56 © 2009 ISE Corporation Compressed表 と辞書 select COMPRESS_ATTR, DICT_BUILDER, DICT_BUILD_TIMESTAMP, COMPRESS_DICT_SIZE, EXPAND_DICT_SIZE from SYSIBMADM.ADMINTABCOMPRESSINFO WHERE tabname ='T1'and tabschema=USER COMPRESS_ATTR DICT_BUILDER DICT_BUILD_TIMESTAMP COMPRESS_DICT_SIZE EXPAND_DICT_SIZE ------------- ------------------------------ -------------------------- -------------------- -------------------Y TABLE GROWTH 2009-03-31-10.25.54.000000 42752 32768 Y TABLE GROWTH 2009-03-31-10.25.47.000000 30336 32760 2 record(s) selected. db2 reorg table t1 use tempspace1 longlobdata resetdictionary DB20000I The REORG command completed successfully. XMLは XMLはData Cpature Change属性 Change属性 ありでも サイズは変化ない 変化ない select COMPRESS_ATTR, DICT_BUILDER, DICT_BUILD_TIMESTAMP, COMPRESS_DICT_SIZE, EXPAND_DICT_SIZEありでもサイズ from サイズは SYSIBMADM.ADMINTABCOMPRESSINFO WHERE tabname ='T1' and tabschema=USER COMPRESS_ATTR DICT_BUILDER DICT_BUILD_TIMESTAMP COMPRESS_DICT_SIZE EXPAND_DICT_SIZE ------------- ------------------------------ -------------------------- -------------------- -------------------Y REORG 2009-03-31-10.26.39.000000 40832 65536 Y REORG 2009-03-31-10.25.47.000000 30336 32760 2 record(s) selected. (EXPAND_DICT_SIZE) Size of the expansion dictionary measured in bytes. If a historical dictionary exists, this value is the sum of the current and historical dictionary sizes. 57 © 2009 ISE Corporation 辞書が使用できない場合のQcaptureメッセージ (SUBが非活動 化) 2009-03-31-10.52.42.214736 ASN7000I "Q Capture" : "ASN" : "WorkerThread" : "1" subscriptions are active. "0" subscriptions are inactive. "0" subscriptions that were new and were successfully activated. "0" subscriptions that were new could not be activated and are now inactive. 2009-03-31-10.52.42.215126 ASN0572I "Q Capture" : "ASN" : "WorkerThread" : The "mqpub 9.7.4" program initialized successfully. 2009-03-31-10.52.43.267414 ASN0011E CAPTURE "ASN" : "WorkerThread". The Capture program log read failed because the DB2 compression dictionary that was used to create the compressed log record no longer exists. The log record that could not be read was for the registered source table "DB2V97.T1". The reason code is "*". 2009-03-31-10.52.46.357447 ASN7133I "Q Capture" :"ASN" : "WorkerThread" : The publication or Q Subscription "SUB1" was stopped. 2009-03-31-10.53.48.414995 ASN7019I "Q Capture" : "ASN" : "WorkerThread" : "CAPSTART" signal was received and will be processed. 2009-03-31-10.53.48.436288 ASN7017I "Q Capture" : "ASN" : "WorkerThread" : The target table "DB2V97.T1_COPY" is ready to be loaded from source table "DB2V97.T1" for publication or Q subscription "SUB1". ASN0011E Explanation: The Capture program received an error from the DB2 log read interface. The reason code is from DB2 and indicates that the data in a log record cannot be processed because the compression dictionary for the corresponding DB2 table or table space is permanently gone. The compressed table or table space containing this source table was probably reorganized by the REORG utility that ran without the KEEPDICTIONARY option. The Capture program cannot read the remaining compressed log records from source changes that occurred before the REORG. The Capture program follows the option that was specified for Stop Capture on Error (Replication Center) or STOP ON ERROR (ASNCLP command-line program) for this registration. 58 © 2009 ISE Corporation パーティション表と行圧縮の使用例 • 新規データ 新規データの データの追加 方法 1: ADD PARTITION + データ投入(LOAD INSERT、IMPORT、INSERTなど) • 空のパーティションをADDする • データ投入 • データ投入の際、ADCによって、自動的に辞書作成、データ圧縮が行なわれる 方法 2: 行圧縮された表のアタッチ • より精度の高い辞書作成のためには、こちらの方法が推奨される 方法 1 ⑤SET INTEGRITYコマンド 方法 2 履歴表A 履歴表 履歴表A 履歴表 辞書 JAN01 辞書 JAN02 辞書 JAN03 ①新規パーティションの作成(ADD PARTITON) ②データ投入 辞書 JAN01 辞書 辞書 JAN02 ④区分の アタッチ ①表の作成 ②データ投入 ③データ圧縮(REORG TABLE) 59 JAN03 アタッチ対象表の属性がCOMPRESSION=NOの場合、 ATTACHは失敗するので注意。(SQL20307N) 辞書 JAN03 © 2009 ISE Corporation Compressed表 とPartition表 create table t1 (pk int, rk int, dummy varchar(1000)) partitioning key (pk) partition by range (rk) (starting 1 ending 80000 every 20000 ) in userspace1 data capture changes compress yes DB20000I The SQL command completed successfully. 4つの区分 つの区分で 区分で区分毎に 区分毎に2万件 ==> db2 -vtd% -f while.db2 CREATE PROCEDURE WHILED(IN n1 INT) LANGUAGE SQL BEGIN NOT ATOMIC DECLARE count INT; DECLARE while_count INT default 0; DECLARE max_count INT default 0; SELECT max(pk) into max_count from t1; if max_count is null then set max_count=0; end if; SET count = n1; WHILE (count > 0) DO SET while_count = while_count + 1; INSERT INTO t1 VALUES (max_count+while_count, max_count+while_count,repeat('A',1000)); set count = count -1; IF MOD(count,1000)=0 then END WHILE ; COMMIT; end if; COMMIT; END DB20000I The SQL command completed successfully. ==> db2 "call whiled(80000)" Return Status = 0 60 © 2009 ISE Corporation Compressed表 とPartition表 select OBJECT_TYPE,COMPRESS_ATTR, DICT_BUILDER, DICT_BUILD_TIMESTAMP, COMPRESS_DICT_SIZE, EXPAND_DICT_SIZE,BYTES_SAVED_PERCENT from SYSIBMADM.ADMINTABCOMPRESSINFO WHERE tabname IN ('T1','T1_COPY') and TABSCHEMA=USER select OBJECT_TYPE,COMPRESS_ATTR, substr(DICT_BUILDER,1,15) as DICT_BUILDER, DICT_BUILD_TIMESTAMP, COMPRESS_DICT_SIZE, EXPAND_DICT_SIZE,BYTES_SA VED_PERCENT from SYSIBMADM.ADMINTABCOMPRESSINFO WHERE tabname IN ('T1','T1_COPY') and TABSCHEMA=USER OBJECT_TYPE COMPRESS_ATTR DICT_BUILDER DICT_BUILD_TIMESTAMP COMPRESS_DICT_SIZE EXPAND_DICT_SIZE BYTES_SAVED_PERCENT ----------- ------------- --------------- -------------------------- -------------------- -------------------- ------------------DATA Y NOT BUILT - XML Y NOT BUILT - DATA Y TABLE GROWTH 2009-03-31-12.02.35.000000 XML Y NOT BUILT - DATA Y TABLE GROWTH 2009-03-31-12.02.58.000000 XML Y NOT BUILT - DATA Y TABLE GROWTH 2009-03-31-12.03.25.000000 XML Y NOT BUILT - DATA Y TABLE GROWTH 2009-03-31-12.03.53.000000 XML Y NOT BUILT - 0 0 0 0 0 0 13312 27128 88 0 0 0 13440 27264 88 0 0 0 13440 27264 88 0 0 0 13440 27264 88 0 0 0 10 record(s) selected. 61 © 2009 ISE Corporation Compressed表 とPartition表 ==> db2 -vtf list.sql describe data partitions for table t1 show detail PartitionId Inclusive (y/n) Low Value Inclusive (y/n) High Value ----------- - ------------------------------- - ------------------------------0 Y 1 N 20001 1 Y 20001 N 40001 2 Y 40001 N 60001 3 Y 60001 Y 80000 4 record(s) selected. PartitionId PartitionName TableSpId PartObjId IndexTblSpId LongTblSpId AccessMode Status ----------- ------------------------------- ----------- ----------- ------------ ----------- - -----0 PART0 2 4 2 2 F 1 PART1 2 6 2 2 F 2 PART2 2 7 2 2 F 3 PART3 2 8 2 2 F 4 record(s) selected. 62 © 2009 ISE Corporation Compressed表 とPartition表 ASN0594I "Q Capture" : "ASN" : "Initial" The program created an IPC queue with keys "(0x300001bb)". 2009-03-31-12.20.33.286295 ASN0585I library "libmqm_r.a( "Q Capture" : "ASN" : "AdminThread" : The program successfully loaded the WebSphere MQ libmqm_r.o)". Environment variable ASNUSEMQCLIENT is set to "". 2009-03-31-12.20.33.339802 ASN7108I "Q Capture" : "ASN" : "WorkerThread" : At program initialization, the highest log sequence number of a successfully processed transaction is "0000:0000:0000:0000:0000" and the lowest log sequence number of a transaction still to be committed is "0000:0000:0000:3EF3:0DCD". 2009-03-31-12.20.33.423588 ASN7155I "Q Capture" : "ASN" : "WorkerThread" : The Q Capture program started processing log records in log file "/dbland1/db2v97/NODE0000/SQL00001/SQLOGDIR/S0000243.LOG". 2009-03-31-12.20.33.477091 ASN7023W unique constraint, or unique index. "Q Capture" : "ASN" : "WorkerThread" : Source table "DB2V97.T1" does not have a primary key, 2009-03-31-12.20.33.537946 ASN7010I "Q Capture" : "ASN" : "WorkerThread" : The program successfully activated publication or Q subscription "SUB1" (send queue "Q1", publishing or replication queue map "MYQMAP1") for source table "DB2V97.T1". 2009-03-31-12.20.33.542225 ASN8999D Browser for queue 'Q1' received a 'ASNMQ_SUBSCHEMA_MSG' message. 2009-03-31-12.20.33.551002 ASN7000I "Q Capture" : "ASN" : "WorkerThread" : "0" subscriptions are active. "0" subscriptions are inactive. "0" subscriptions that were new and were successfully activated. "0" subscriptions that were new could not be activated and are now inactive. 2009-03-31-12.20.33.556616 ASN0572I 63 "Q Capture" : "ASN" : "WorkerThread" : The "mqpub 9.7.4" program initialized successfully. © 2009 ISE Corporation Compressed表 とPartition表 ==> db2 -vtf attach_compress.sql create table temp (pk int,rk int, dummy varchar(1000)) in userspace1 DATA CAPTURE CHANGES compress yes DB20000I The SQL command completed successfully. alter table temp DB20000I DATA CAPTURE CHANGES INCLUDE LONGVAR COLUMNS The SQL command completed successfully. alter table t1 attach partition part4 starting (80001) ending (100000) from temp SQL3601W The statement caused one or more tables to automatically be placed in the Set Integrity Pending state. SQLSTATE=01586 ==> db2 set2009-03-31-12.35.47.246171 ASN7184W "Q Capture" : "ASN" : "WorkerThread" : Data partition "4" was attached to the source table "DB2V97.T1". ==> db2 -vtf set.sql set integrity for t1 allow write access immediate checked DB20000I 64 The SQL command completed successfully. © 2009 ISE Corporation Compressed表 とPartition表 ==> db2 "insert into t1 values (90000,90000,'90000')" DB20000I The SQL command completed successfully. ==> asnqmfmt Q1 AZQMGR **** Message number: 1 **** Message size: 538 qMsgHeader.msgFamily: QREP qMsgHeader.msgtype: ASNMQ_TRANS_MSG qMsgHeader.msgVersion: ASNMQ_VERSION400 qMsgHeader.msgFlag: Last message in DB transaction. qTransMsgHeader.segment_num: 0001 qTransMsgHeader.commit_LSN: 0000:0000:0000:3eff:bf79 qTransMsgHeader.commit_time: 03-31-2009 02:37:22.000002 UTC qTransMsgHeader.commit_time: 03-31-2009 12:37:22.000002 LOCALTIME qTransMsgHeader.nRows: 1 qTransMsgHeader.auth_id: DB2V97 qTransMsgHeader.auth_tkn: qTransMsgHeader.plan_id: qTransMsgHeader.uow_id: qTransRow.length: 0000:0000:0000:0004:ec83 58 rowheader.encodetype: COMPACT rowheader.encodever: ASNMQ_ROW_ENCODE_V100 rowheader.operation: INSERT 65 © 2009 ISE Corporation QCapture Performance Impact • Test環境 環境 - system configuration (optimus1) - System Model: IBM,9117-570 - Processor Type: PowerPC_POWER5 - Number Of Processors: 4 - Processor Clock Speed: 2198 MHz - Memory Size: 65536 MB - OS level : 5300-07-01-0748 - build level : db2_DB2 V9.7_aix64_s090219 - workload : IRWW (balanced workload with IUD and fetch) - compression type : row_compression - preload - non-DPF mode s090219 (notcompressed) s090219 (compressed Changes) Changes Q-Capture throughput (rows/sec) 9909 10936 +10.3% Q-Capture CPU (ms/row) 0.052 0.052 +0% Tables have been pre-loaded, The second step I generate the workload with total of 4,321,974 changed rows. - After the workload finishes, started Q-Capture. 66 © 2009 ISE Corporation Option to to replicate replicate Loadのサポート Loadのサポート Option 67 © 2009 ISE Corporation Option to replicate Loadのサポート 当機能の目的と使用方法 目的 LOAD操作 操作の 検知と自動LOADの 自動 のサポート 操作の検知と 使用方法と 使用方法と変更点 Qcaptureが が自動的に も使用不可) 自動的に使用( 使用(SQL Captureも 使用不可 DB2の のLOG の機能拡張による 機能拡張による 使用可能な 使用可能なレベル IRS V9.7 GA, IRS z/OS( (DB2 z/OS PTF要 要) 対象プラットフォーム 対象プラットフォーム Linux, Unix, Windows, z/OS 68 © 2009 ISE Corporation Q Replication Full Refresh • WebSphere MQを を使用した 使用したレプリケーション したレプリケーション • 更新差分をキューにPUTしてレプリケーション • 自動/手動 自動 手動フル 手動フル・ フル・リフレッシュ、 リフレッシュ、またフル またフル・ フル・リフレッシュなし リフレッシュなし、 なし、が容易に 容易に選択可能 • フル・リフレッシュ:初期データをターゲット側に転送(静止点の作成) • 転送中のソース側更新も、後追いで適用 • 自動フル・リフレッシュでは、DB2のDRDA機能を使用 z/OS Unix Linux Windows • Load Utilityを を変更収集できない 変更収集できない • ただしSHRLEVEL CHANGEのLOADは収集可能(PQ52343 ) • ソース表 を検知し を発行可能( のみ) ソース表のLoadを 検知しWarningを 発行可能(z/OSのみ のみ z/OS• ASN0196W Unix Linux Control WebSphere MQ Windows DB2 ストアード プロシージャー Control ニックネーム経由 DB2 ソース表 Q Capture ログ・ ログ・ベース 69 差分コピー 差分コピー フル・ フル・リフレッシュ Q Apply agent agent agent ターゲット表 NonDB2 Oracle SQL Server Informix Sybase © 2009 ISE Corporation 自動ロード機能追加オプション • IBMQREP_SUBS CAPTURE_LOA D Data Type: CHAR(1) not null with default ‘W’ W(default) : Warning Message ASN7186Wを を出力 R(Restart the subscription) : Captureは はWarningを を発行後、 発行後、ス キーマを はLoad_Typeに に従う キーマを発行、 発行、Applyは ③ ① Load ② SCHEMA Message TEST_SOURCE Qキャプチャー Qアプライ TEST_COPY CAPTURE_LOAD=‘R’ 70 © 2009 ISE Corporation CAPTURE_LOAD=‘R’実行例 (CAPTURE_LOAD=‘R’ z/OS to z/OS) M 4020000 ZS17PA E N 0200000 ZS17PA S N 0000000 ZS17PA N 0020000 ZS17PA N 4000000 ZS17PA N FFFFFFF ZS17PA N 4000000 ZS17PA N C000000 ZS17PA NC0000000 ZS17PA SC M 4020000 ZS17PA D D E 09092 16:03:58.39 JOB00186 00000010 292 00000010 09092 16:04:12.92 JOB00188 00000010 09092 09092 09092 09092 09092 09092 09092 16:04:12.94 16:04:13.05 16:04:13.06 16:04:15.77 16:04:15.77 16:04:15.78 16:04:15.80 JOB00188 JOB00188 JOB00188 JOB00188 JOB00188 00000210 00000010 00000010 00000010 00000010 00000201 INTERNAL 00000210 09092 16:04:19.15 JOB00185 00000010 301 00000010 301 00000010 301 00000010 ASN7606I "Q Apply" : "AZUMA" : "BR00000" : Q subscription "SUB1" 292 (receive queue "Q1", replication queue map "MYQMAP1") is active. $HASP100 LOAD1 ON INTRDR FROM TSU00163 ADMF001 IRR010I USERID ADMF001 IS ASSIGNED TO THIS JOB. ICH70001I ADMF001 LAST ACCESS AT 16:03:47 ON THURSDAY, APRIL 2, 2009 $HASP373 LOAD1 STARTED - INIT 3 - CLASS A - SYS STL0 SMF000I LOAD1 DSNUPROC DSNUTILB 0000 $HASP395 LOAD1 ENDED $HASP309 INIT 3 INACTIVE ******** C=APZRX3 SE '16.04.15 JOB00188 $HASP165 LOAD1 ENDED AT STLVM3 MAXCC=0',LOGON, USER=(ADMF001) ASN7186W "Q Capture" : "AZUMA" : "WorkerThread" : A load 301 operation has been detected on table "ADMF001.T1" for Q subscription "SUB1" (receive queue "Q1.T1", replication queue map "MYQMAP1.T1"). N 4020000 ZS17PA 09092 16:04:19.23 JOB00185 00000010 ASN7012I "Q Capture" : "AZUMA" : "WorkerThread" : The publication or Q S subscription "SUB1" was successfully reinitialized. M 4020000 ZS17PA 09092 16:04:19.23 JOB00186 00000010 2009-04-02-16.04.19.239270 ASN8999D "Q Apply" : "AZUMA" : 303 <- apply received schema D 303 00000010 "BR00000" : Browser for queue 'Q1' received a E 303 00000010 'ASNMQ_SUBSCHEMA_MSG' message. M 4020000 ZS17PA 09092 16:04:19.24 JOB00186 00000010 2009-04-02-16.04.19.242322 ASN8999D "Q Apply" : "AZUMA" : 304 D 304 00000010 "BR00000" : Browser for queue 'Q1' received a schema for an E 304 00000010 active subscription. 71 © 2009 ISE Corporation 自動ロード機能追加オプション • • QCapture側 側にてDB2 z/OS PTF PK78558, DB2 UDB V9.7以上 以上が にて 以上が必要 • PTFを適用していないQCAPTUREではASN0196Wを出力(z/OSのみ) • UDBではV9.7以前では検知不可能 下記の が検知される 下記のUtilityが 検知される • DB2 for z/OSではTablespace 単位で検知 • • 1 Tablespaceに複数ソースがあり1表にLoadされるとすべての表に関してLoadが実行 されてしまうので注意 • LOAD RESUME YES SHRLEVEL NONE • LOAD REPLACE • REORG TABLESPACE DISCARD DB2 UDB V9.7 • LOAD Utility • 制約( を含む)がソース表 後もCHECK Pending状態 状態になるため 制約(参照制約 RIを ソース表にある場合 にある場合は 場合はLOAD後 状態になるため QApplyの のLoadが が失敗し は非活動化する LUW) 失敗し、Subscriptionは 非活動化する(z/OS, する 72 • CHECK DATA (z/OS), SET INTEGRITY(LUW)をLOAD後に実施する必要あり • 制約(参照制約 RIを含む)ある場合、INSERT ALLOW READ ACCESSの場合には追加されてい ない既存のData部分のみフルレフレシュで取り込むので注意(LUWのみ) • 制約がある場合 ALLOW NO ACCESSではソース表の読み取り不可のためSubが非活動化 (LUWのみ) © 2009 ISE Corporation 自動ロード機能追加オプション • EEE環境 環境でも 環境でも有効 でも有効 • Bidir/P2P環境 環境では 自身の を避けるためQapplyから からREPLICATE_LOAD 環境ではLOAD自身 では 自身の収集の 収集の無限Loopを 無限 けるため からREPLICATE_LOAD signal が使用 される • • 1. Issued after inserting a P2PNEW2MEM signal (after having received a schema message) for the local Q Capture - used to deactivate; prevent recapture of Q Apply load operation. • 2. Issued after inserting p2pLOADDONE signals upon receiving a LOADDONE_RECVD message from Q Capture - used to enable after performing a successful load operation by Q Apply. • 3. Issued when performing a subscription state transition from active ('A') to inactive ('I') - used to enable upon a possibly failed load operation by Q Apply (we do not want to leave it in disabled state). However, any state transition from A to I will trigger the signal. 3node以上 以上の では使用不可 以上のPeer to Peerでは では使用不可 • • 定義は可能であるがLOAD時にASN7187EでLOADされたNodeのCAPTURE停止 SUBS_STATE=‘A’のみ のみスキーマ のみスキーマを スキーマを送信する 送信する • 73 STATE=‘L’ではasn7186wのみ出力する © 2009 ISE Corporation 制約がある場合のCapture_LOAD=‘R’(Allow no access) $==> db2 "load from t1.ixf of ixf replace into t1 nonrecoverable allow no access" SQL3109N The utility is beginning to load data from file "/home/db2v97/mq/asnclp/local/t1.ixf". SQL3515W The utility has finished the "BUILD" phase at time "2009-04-10 21:59:32.786042". Number of rows read = 1 Number of rows skipped = 0 Number of rows loaded = 1 Number of rows rejected = 0 Number of rows deleted = 0 Number of rows committed = 1 2009-04-10-21.59.37.439304 ASN7186W "Q Capture" : "ASN" : "WorkerThread" : A load operation was detected on table "DB2V97.T1" for Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). 2009-04-10-21.59.37.439568 ASN7189I "Q Capture" : "ASN" : "WorkerThread" : The subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1") for table "DB2V97.T1" is restarted due to a detected load operation in the DBMS log. 2009-04-10-21.59.37.485213 ASN8999D Browser for queue 'Q1' received a 'ASNMQ_SUBSCHEMA_MSG' message. 2009-04-10-21.59.37.485446 ASN8999D Browser for queue 'Q1' will be suspended because a schema was received for an active subscription. 2009-04-10-21.59.37.486438 ASN8999D spillQ 'IBMQREP.SPILL.MODELQ.0.1.3' for sub 'SUB1' was not found 2009-04-10-21.59.37.569823 ASN8999D Browser for queue 'Q1' will be resumed because a pending schema was processed. 2009-04-10-21.59.37.594785 ASN8999D agent 1001 started for queue "Q1" for sub "SUB1" 2009-04-10-21.59.37.596206 ASN7531I "Q Apply" : "ASN" : "BR00000SP001" : The load utility "LOAD from CURSOR" was selected by the Q Apply program for Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). Reason code: "0". 2009-04-10-21.59.37.596547 ASN7528I "Q Apply" : "ASN" : "BR00000SP001" : The Q Apply program for the Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1") will use the "LOAD from CURSOR" utility to load table "DB2V97.T1_COPY". 74 © 2009 ISE Corporation 制約がある場合のCapture_LOAD=‘R’(Allow no access) 2009-04-10-21.59.38.314099 ASN7530E "Q Apply" : "ASN" : "BR00000SP001" : The load utility "LOAD from CURSOR" for table "DB2V97.T1_COPY" failed for Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). Detailed message from the load utility is "RC: 0, SQLCODE: -668". 2009-04-10-21.59.38.314583 ASN0552E "Q Apply" : "ASN" : "BR00000SP001" : The program encountered an SQL error. The server name is "". The SQL request is "LOAD". The table name is "DB2V97.T1_COPY". The SQLCODE is "-668". The SQLSTATE is "57016". The SQLERRMC is "1DB2V97.T1". The SQLERRP is "SQLDTBLR". Source SQL used for LOAD: [SELECT "C1", "C2", "C3" FROM "DB2V97"."T1"] Target SQL used for LOAD: [REPLACE INTO "DB2V97"."T1_COPY" ( "C1", "C2", "C3" )] 2009-04-10-21.59.38.314817 ASN0589I "Q Apply" : "ASN" : "BR00000SP001" The program received an unexpected return code "-668" from routine "LoadParms::invokeLoad". 2009-04-10-21.59.38.316049 ASN0589I from routine "QAsub::callLoader". "Q Apply" : "ASN" : "BR00000SP001" The program received an unexpected return code "-668" 2009-04-10-21.59.38.331313 ASN7597E "Q Apply" : "ASN" : "BR00000SP001" : The Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1") is about to be disabled because of the conflict action or error action. Future transaction row changes to this Q subscription will beskipped. 2009-04-10-21.59.41.596794 ASN8999D spillQ 'IBMQREP.SPILL.MODELQ.0.1.2' for sub 'SUB1' successfully deleted 2009-04-10-21.59.45.210423 ASN7019I "Q Capture" : "ASN" : "WorkerThread" : "CAPSTOP" signal was received and will be processed. 2009-04-10-21.59.45.237593 ASN7013I deactivated. "Q Capture" : "ASN" : "WorkerThread" : The publication or Q subscription "SUB1" was 2009-04-10-21.59.45.701506 ASN8999D Browser for queue 'Q1' received a 'ASNMQ_SUBDEACTIVATED' message. 2009-04-10-21.59.45.701805 ASN7595W "Q Apply" : "ASN" : "BR00000" : The Q Apply program received a Q subscription deactivate message, but the SUB_ID "1" (receive queue "Q1", replication queue map"MYQMAP1") cannot be found or the Q subscription is in the inactive state. 2009-04-10-21.59.45.710567 ASN7133I "Q Capture" :"ASN" : "WorkerThread" : The publication or Q subscription "SUB1" was stopped. 2009-04-10-21.59.51.712703 ASN0590I exiting thread "BR00000SP001". "Q Apply" : "ASN" : "BR00000" The thread "BR00000" received return code "2011" from the 75 © 2009 ISE Corporation BIDIR/P2P環境でのCAPTURE_LOAD=Rと REPLICATE_LOAD signal • Bidir/P2P環境 Bidir/P2P環境では 環境ではLOAD ではLOAD自身 LOAD自身の 自身の収集の 収集のを避けるためQApply けるためQApplyから QApplyから REPLICATE_LOAD signal が発行 発行される される • SUBSCRIPTION単位のコントロール Load Bidir ==> db2 'select * from asn2.ibmqrep_signal order by signal_time' SIGNAL_TIME SIGNAL_TYPE SIGNAL_SUBTYPE SIGNAL_INPUT_IN SIGNAL_STATE SIGNAL_LSN ------------------------ ---------------- ---------------------- ------------------------- ------------ ----------------------- 2009-06-10-20.01.49.598843 CMD P2PNEW2MEMB T20001;0001;0002;I;0001 C x'0000000000002801462F' 2009-06-10-20.01.49.599020 CMD REPLICATE_LOAD T20001;D C x'000000000000280146AC' 2009-06-10-20.01.56.634782 CMD REPLICATE_LOAD T20001;E C x'0000000000002801B24A' 76 © 2009 ISE Corporation REPLICATE_LOADシグナル Flow Node 1 (Initiator) User Capture Node 2 (New) Apply Apply Capture LOAD SCHEMA MSG P2PNEW2MEMB SUB_2_1 SUB_1_2 REPLICATE_LOAD(D) IL/E SUB_2_1 SCHEMA MSG IA SUB_2_1 IA LOADDONE SUB_1_2 SUB_1_2 LOADDONE_RCVD MSG REPLICATE_LOAD(E) LA SUB_1_2 L/EA Figure 2. 2-Node Initialization (With Load) 77 © 2009 ISE Corporation BIDIR環境でのCAPTURE_LOAD=Rと REPLICATE_LOAD signal • REPLICATE_LOAD Signalは はSubscription単位 単位 • 従属のSubscriptionには影響しない • BIDIRのHAS_LOADPHASE=‘E’まだloaddoneを発行していな い • REPLICATE_LOAD(D)が発行済み • LOADを実施 • UNIのみLOADが実施される Load Bidir 78 Uni © 2009 ISE Corporation EEEの環境下でも有効な例 (CAPTURE_LOAD=‘R’ under EEE + MDC + Partitioned + Compressed ( Data + XML) $ db2 list nodegroups show detail DATABASE PARTITION GROUP PMAP_ID DATABAS E PARTITION NUMBER IN_USE -------------------------------------------------------------------------------------------------------------------------------------- --------------------------- -----IBMCATGROUP 0 0 Y IBMDEFAULTGROUP 3 0 Y IBMDEFAULTGROUP 3 1 Y 3 record(s) selected. $create table t1 (pk int not null, rk int, dummy varchar(1000),xmldata xml) partitioning key (pk) partition by range ( rk) (starting 1 ending 80000 every 20000 ) organize by(dummy) in ts1 data capture changes compress yes DB20000I 79 The SQL command completed successfully. © 2009 ISE Corporation EEEの環境下でも有効な例 (CAPTURE_LOAD=‘R’ under EEE + MDC + Partitioned + Compressed ( Data + XML) $ db2 "load from t1.del of del replace resetdictionary into t1 nonrecoverable" Agent Type Node SQL Code Result ______________________________________________________________________________ LOAD 000 +00000000 Success. ______________________________________________________________________________ LOAD 001 +00000000 Success. ______________________________________________________________________________ PARTITION 001 +00000000 Success. ______________________________________________________________________________ PRE_PARTITION 000 +00000000 Success. ______________________________________________________________________________ RESULTS: 2 of 2 LOADs completed successfully. ______________________________________________________________________________ Summary of Partitioning Agents: Rows Read = 20000 Rows Rejected = 0 Rows Partitioned = 20000 Summary of LOAD Agents: Number of rows read Number of rows skipped Number of rows loaded Number of rows rejected Number of rows deleted Number of rows committed 80 = = = = = = 20000 0 20000 0 0 20000 © 2009 ISE Corporation EEEの環境下でも有効な例 (CAPTURE_LOAD=‘R’ under EEE + MDC + Partitioned + Compressed ( Data + XML) $2009-04-10-21.19.11.212774 ASN7186W "Q Capture" : "ASN" : "WorkerThread" : A load operation was detected on table "EEE.T1" for Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). 2009-04-10-21.19.11.213084 ASN7189I "Q Capture" : "ASN" : "WorkerThread" : The subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1") for table "EEE.T1" is restarted due to a detected load operation in the DBMS log. 2009-04-10-21.19.11.677391 ASN8999D Browser for queue 'Q1' received a 'ASNMQ_SUBSCHEMA_MSG' message. 2009-04-10-21.19.11.677652 ASN8999D Browser for queue 'Q1' will be suspended because a schema was received for an active subscription. 2009-04-10-21.19.11.871251 ASN8999D Browser for queue 'Q1' will be resumed because a pending schema was processed. 2009-04-10-21.19.11.921310 ASN8999D agent 1001 started for queue "Q1" for sub "SUB1" 2009-04-10-21.19.11.922396 ASN7531I “Q Apply” : “ASN” : “BR00000SP001” : The load utility “EXPORT/LOAD” was selected by the Q Apply program for Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). Reason code: "4". 2009-04-10-21.19.11.923671 ASN7528I "Q Apply" : "ASN" : "BR00000SP001" : The Q Apply program for the Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1") will use the "EXPORT" utility to load table "EEE.T1". 2009-04-10-21.19.24.223508 ASN7529I "Q Apply" : "ASN" : "BR00000SP001" : The "EXPORT" utility for table "EEE.T1" completed successfully for the Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). The message from the utility is "Rows exported: 20000". 2009-04-10-21.19.24.239729 ASN7528I "Q Apply" : "ASN" : "BR00000SP001" : The Q Apply program for the Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1") will use the "LOAD" utility to load table "EEE.T1_COPY". 2009-04-10-21.19.39.578969 ASN7529I “Q Apply” : “ASN” : “BR00000SP001” : The “LOAD” utility for table “EEE.T1_COPY” completed successfully for the Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). The message from the utility is "Rows loaded: 20000, Rows rejected: 0, Rows skipped: 0, Rows deleted: 0". 2009-04-10-21.19.40.831065 ASN7608I "Q Apply" : "ASN" : "BR00000" : The program finished loading Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"), and notified the Q Capture program. 2009-04-10-21.19.40.855072 ASN7607I "Q Apply" : "ASN" : "BR00000" : Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1") finished loading the target. The changes will be applied from the spill queue "IBMQREP.SPILL.MODELQ.0.1.5". 2009-04-10-21.19.41.897252 ASN7019I "Q Capture" : "ASN" : "WorkerThread" : "LOADDONE" signal was received and will be processed. 2009-04-10-21.19.41.909851 ASN7010I "Q Capture" : "ASN" : "WorkerThread" : The program successfully activated publication or Q subscription "SUB1" (send queue "Q1", publishing or replication queue map "MYQMAP1") for source table "EEE.T1". 2009-04-10-21.19.42.360100 ASN8999D Browser for queue 'Q1' received a 'ASNMQ_LOADDONE_RCVD' message. 2009-04-10-21.19.46.387934 ASN7606I "Q Apply" : "ASN" : "BR00000" : Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1") is active. 81 © 2009 ISE Corporation 3NODE以上のP2Pでは使用不可(ASN7187E) (CAPTURE_LOAD=‘R’ under 3node P2P , Load was invoked) 2009-04-09-16.43.14.974372 <subMgr::execLoadAction> ASN7186W "Q Capture" : "ASN" : "WorkerThread" : A load operation was detected on table "DB2V97.T1" for Q subscription "T10002" (receive queue "Q6", replication queue map "ASNTOASN3"). 2009-04-09-16.43.14.999459 <subMgr::execLoadAction> ASN7187E "Q Capture" : "ASN" : "WorkerThread" : The value of the CAPTURE_LOAD column in the IBMQREP_SUBS control table is set to R for Q subscription "T10002". This value is only supported in unidirectional, bidirectional and peer-to-peer subscriptions with a maximum of two nodes. However, a load operation has been detected on the source table. The Q Capture program was stopped. 2009-04-09-16.43.14.999703 <subMgr::processLoad> ASN0589I "Q Capture" : "ASN" : "WorkerThread" The program received an unexpected return code "6060" from routine "subMgr::execLoadAction". 2009-04-09-16.43.14.999976 <subMgr::publishTrans> ASN0589I “Q Capture” : “ASN” : “WorkerThread” The program received an unexpected return code "6060" from routine "handleLoad". 2009-04-09-16.43.15.000142 <waitAndProcessLogrdNotif> ASN0589I "Q Capture" : "ASN" : "WorkerThread" The program received an unexpected return code "6060" from routine "subMgr::publishTrans". 2009-04-09-16.43.15.000458 <asnqwk> ASN7109I "Q Capture" : "ASN" : "WorkerThread" : At program termination, the highest log sequence number of a successfully processed transaction is "49DD:98A9:0000:000B:0000" and the lowest log sequence number of a transaction still to be committed is "0000:0000:0000:091C:D73D". 2009-04-09-16.43.15.067039 <asnqwk> ASN7156I "Q Capture" : "ASN" : "WorkerThread" : The Q Capture program stopped processing log records in log file "/dbland1/db2v97/NODE0000/SQL00001/SQLOGDIR/S0000022.LOG". 2009-04-09-16.43.15.068147 <stopLogrdThread> ASN8999D timeout waiting for log reader thread to stop 2009-04-09-16.43.20.067492 <asnThread::stop> ASN0590I "6060" from the exiting thread "WorkerThread". "Q Capture" : "ASN" : "Initial" The thread "Initial" received return code 2009-04-09-16.43.22.075518 <asnThread::stop> ASN0590I "2001" from the exiting thread "AdminThread". "Q Capture" : "ASN" : "Initial" The thread "Initial" received return code 2009-04-09-16.43.22.076007 <asnThread::stop> ASN0590I "2011" from the exiting thread "PruneThread". "Q Capture" : "ASN" : "Initial" The thread "Initial" received return code 2009-04-09-16.43.22.091785 <Asnenv:delEnvIpcQRcvHdl> ASN0595I with keys "(0x3000020e)". 2009-04-09-16.43.33.094729 <asnqcap::main> ASN0573I 82 "Q Capture" : "ASN" : "Initial" The program removed an IPC queue "Q Capture" : "ASN" : "Initial" : The program was stopped. © 2009 ISE Corporation Multiple Restart Restart Queue Queue Multiple 83 © 2009 ISE Corporation Multiple Restart Queue (QCaptureのSTARTALLQパラメータ、STARTQ/STOPQコマンド) 当機能の目的と使用方法 目的 1つのQcaptureでの での複数送信 エラーが つの での複数送信キュー 複数送信キュー使用時 キュー使用時において 使用時において、 において、一部の 一部のキューでの キューでのMQPUTエラー での エラーが発生し 発生し た場合、 自体が 場合、Qcapture自体 自体が停止するのではなく 停止するのではなく、 するのではなく、障害が 障害が発生した 発生したキュー したキューへの キューへの書 への書き込みのみを停止 みのみを停止す 停止す ることによって、 ることによって、正常な 正常なキューへの キューへの処理 への処理を 処理を継続し 継続し、全体的な 全体的なレイテンシーの レイテンシーの悪化を 悪化を回避することが 回避することが1 することが1 つの目的 つの目的。 目的。また障害 また障害が 障害が発生した 発生したキュー したキューの キューの回復時に 回復時に、関連する 関連するQサブスクリプション する サブスクリプションの サブスクリプションの FULLREFRESHを を回避し 回避し、復旧時間の 復旧時間の短縮を 短縮を図る。 使用方法と 使用方法と変更点 QCaptureの の始動パラメータ を指定 始動パラメータで パラメータで、STARTALLQ=Y/Nを ASNQCMDで でキュー単位 を発行 キュー単位に 単位にSTARTQ/STOPQを RESTARTQが が、各キューごとに キューごとにリスタートポイント ごとにリスタートポイントの リスタートポイントの情報を 情報を持つようになる IBMQREP_SENDQUEUESの のERROR_ACTIONに に新しい値 が追加 しい値:Qが 使用可能な 使用可能なレベル IRS V9.7 GA ~ または APAR PK78112 対象プラットフォーム 対象プラットフォーム Linux, Unix, Windows, z/OS 84 © 2009 ISE Corporation QサブスクリプションとQマッピング • Qサブスクリプション サブスクリプション: マップ= サブスクリプション:Qマップ マップ=1:1 qsub1 qsub1(Qサブスクリプション) サブスクリプション) • メリット • ひとつのQマップがinactiveになっても、他の Qマップに属するQサブスクリプションに影響 がない • デメリット • 運用管理対象のコンポーネントが増える • 同一の 同一のトランザクションで トランザクションで異なるQマップ なる マップに マップに属 するソース するソース表 ソース表が更新されると 更新されると、 されると、トランザクショ ン情報が 情報が分割されてしまう 分割されてしまう • ほか • qmap1 qmap1(Qマップ) マップ) ソース表1 送信キュー 受信キュー ターゲット表1 qsub2 qsub2 qmap2 qmap2(Qマップ) マップ) ソース表2 • 送信キュー 受信キュー ターゲット表2 複数サイトへのレプリケーションでは、それ ぞれのサイトに対するQマップが必要 Qサブスクリプション サブスクリプション: マップ= サブスクリプション:Qマップ マップ=2:1 qsub3 qsub3 • メリット • 運用管理が容易 qmap3 qmap3(Qマップ) マップ) ソース表3 ターゲット表3 • qsub4 qsub4 • 送信キュー ソース表4 デメリット 受信キュー ターゲット表4 • ほか • 85 ひとつのキューがinactiveになると、その Qマップに属するサブスクリプション全て が実行できなくなる APPLY側で表の従属関係を検知可能 © 2009 ISE Corporation 複数送信キューの利用 • 複数の 複数の送信キュー 送信キューを キューを使用する 使用する目的 する目的 • 依存性のない表に対する更新を別々のキューで送信することにより、キュー 単位で開始停止が可能となり、アプリケーション単位での管理がしやすい • 万が一キューが停止しても、他のQマップに含まれるサブスクリプションに影 響を与えないアプリケーションごとの負荷を軽減 • 1つのQcaptureで収集した更新情報を複数のリモートサイトに送信する 1つのキューで MQPUTエラー が発生! 送信キュー キューが分かれていても、 Qcaptureが停止するため、 すべてのキューへのMQPUTができなくなる 送信キュー 送信キュー 86 全体的な 全体的なデータ鮮度 データ鮮度の 鮮度の悪化! 悪化! © 2009 ISE Corporation 従来までの送信キューエラーと復旧シナリオ QCaptureで でMQPUTエラー エラー発生 エラー発生 該当送信キュー ’(非活動) 停止 該当送信キューの キューのステータスを ステータスを‘I’ 非活動)に変更し 変更し、Qcapture停止 サブスクリプションの ’(活動) サブスクリプションのステータスは ステータスは‘A’ 活動)のまま 障害原因復旧OK 障害原因復旧 Qcaptureの の再起動 該当キュー であれば、 該当キューへの キューへの書 への書き込みOKであれば であれば、 キューの に変更し キューのステータスを ステータスを’A’に 変更し、処理を 処理を継続 障害原因復旧不可 他のキューの キューのレプリケーションを レプリケーションを継続させる 継続させる場合 させる場合 関連する 関連するサブスクリプション するサブスクリプションの サブスクリプションのステータスを ステータスを すべて‘ ’(非活動) を発行 すべて‘I’ 非活動)にするか、 にするか、CAPSTOPを Qcaptureの の再起動 Qrepの の場合、 場合、関連サブスクリプション 関連サブスクリプション QCaptureは は停止した の読み込み再開 停止した以降 した以降の 以降のLOGの 全てのFULLREFRESHが が必要 ての Event Publisherの の場合、 場合、 レプリケーションの レプリケーションの継続は 継続は不可 87 エラーが エラーが発生した 発生したキュー 関連していたサブスクリプション したキューに キューに関連していた していたサブスクリプションは サブスクリプションは 障害が 障害が復旧しても 復旧しても、 しても、差分レプリケーション 差分レプリケーションの レプリケーションの継続は 継続は不可 © 2009 ISE Corporation Fullrefreshが必要な理由 • サブスクリプションが が起動すると の次回 サブスクリプションが非活動の 非活動の間にQcaptureが 起動すると、 すると、Qcaptureの のリスタート・ リスタート・ポイント情報 ポイント情報が 情報が進む • リスタート・ポイントは1つのQcaptureで1つ、RestartQに持つ レプリケーションを継続させるためには 非活動の間の更新は Fullrefreshまたは手動でソース表とターゲット表の 収集できない 同期を取る必要がある • 現行の の情報 現行のRestartQの • 1つのQcaptureで1つのmin-LSN と max-commitを持つ • min-LSN:Qcaptureが停止した時点でCOMMITまたはROLLBACKが発行されていないトラン ザクションの開始のLSN • max-commit: Qcaptureが停止した時点で、最後に確実にMQに書き込んだトランザクションの COMMITのタイムスタンプ time Tx1 LSN = 5 QCap Stop Tx2 MAXCMTSEQ 88 © 2009 ISE Corporation 従来のRestartQの内容 • Qcaptureの の停止時の の例) 停止時のメッセージ (Qrep V9.1 Windowsの 2009-04-28-11.01.59.578000 ASN7109I "Q Capture" : "QREP6" : “WorkerThread” : プログラムの ログラムの終了時、 終了時、正常に 正常に処理された 処理されたトランザクション されたトランザクションの トランザクションの一番高い 一番高いログ・ ログ・シーケンス番号 シーケンス番号は 番号は “49F6:6308:0000:0001:0000” で、まだコミット まだコミットされていない コミットされていないトランザクション されていないトランザクションの トランザクションの一番低い 一番低い ログ・ ログ・シーケンス番号 シーケンス番号は 番号は0000:0000:0000:01C9:C4DD" です。 です。 qRestartMsg for MAINLINE log reader. qRestartMsg.capServer : QREPDB qRestartMsg.capSchema : QREP6 qRestartMsg.qRestartsgSize : 436 qRestartMsg.freeNodeSpace : 0 Number of partition at restart: 1 qRestartMsg.nodeId: 0 qRestartMsg.restartLSN: 0000:0000:0000:01c9:c4dd qRestartMsg.lastCommitSEQ: 49f6:6308:0000:0001:0000 qRestartMsg.lastCommitTime: 2009-04-28-10.59.36.000001 qRestartMsg.reuseSEQ: 0000:0000:0000:0000:0000 qRestartMsg.reuseTime: 2009-04-28-10.21.14 Number of send queues at restart: 2 [ 0] sendq name: Q6 sendq activation time: 1240881674 sendq next msg seq no: 00000000000000000000000000000019 [ 1] sendq name: Q7 sendq activation time: 1240883933 sendq next msg seq no: 00000000000000000000000000000005 89 © 2009 ISE Corporation 新機能 目的 • • • ある送信キューの障害による、全体的なレイテンシーの悪化を避ける • 障害が発生したキューに関連する全てのサブスクリプションのター ゲット表への再LOAD(FULLREFRESH)を回避 • Event Publisherでは、レプリケーションの継続を可能にする 新機能の 新機能の概要 • IBMQREP_SENDQUEUSの新しいERROR_ACTIONとして「Q」が 追加 意味:キューでエラーが発生した場合は、そのキューのみ停止し、他の キューへの処理を継続 • • • RestartQの新しい情報 • 90 現行のデフォルトは「S」、この場合Qcaptureは停止 RestartQに個々のキューに関するリスタート情報(min-LSN と maxcommitなど)を保持 © 2009 ISE Corporation V9.7でのRestartQの内容 qRestartMsg for MAINLINE log reader. qRestartMsg.capServer : V9DB qRestartMsg.capSchema : ASN qRestartMsg.qRestartsgSize : 528 Number of partition at restart: 1 restartLSN=0000:0000:0000:4037:dc0e nodeId=0 qRestartMsg.lastCommitSEQ: 4a31:d405:0000:0004:0000 qRestartMsg.lastCommitTime: 2009-06-12-14.05.25.000004 qRestartMsg.reuseSEQ: 0000:0000:0000:0000:0000 qRestartMsg.reuseTime: 2009-06-12-13.13.14 Q2は更新継続 Number of send queues at restart: 2 [ 0] sendq name: Q2 sendq activation time: 1244776395 sendq next msg seq no: 0000000000000000000000000000000d sendq lastCommitSEQ: 4a31:d405:0000:0004:0000 sendq lastCommitTime: 2009-06-12-14.05.25.000004 sendq restartLSN=0000:0000:0000:4037:dc0e nodeId=0 [ 1] sendq name: Q1 sendq activation time: 1244776395 sendq next msg seq no: 00000000000000000000000000000003 sendq lastCommitSEQ: 4a31:c7d3:0000:0005:0000 Q1はQFULLで停止状態 sendq lastCommitTime: 2009-06-12-13.13.23.000005 sendq restartLSN=0000:0000:0000:4010:ef6d nodeId=0 91 © 2009 ISE Corporation 新規コマンドおよびシグナル >>-asnqccmd--capture_server=db_name-----------------------------> >--+-----------------------+--+-chgparms--| parameters |-+----->< '-capture_schema=schema-' +-prune--------------------+ +-qryparms-----------------+ +-reinit-------------------+ +-reinitq=send_queue-------+ New +-startq-+-send_queue-+----+ | '-all--------' | New +-stopq-+-send_queue-+-----+ | '-all--------' | +-status--+--------------+-+ | '-show details-' | '-stop---------------------' STARTQ 1 つまたはすべての使用不可の送信キューにメッセージを置き始めることを指定します。Q キャプチャーはキューの状態をア クティブ (A) に設定し、指定されたキューまたはすべての非アクティブなキューにメッセージを置くことを再開します。 Q キャプ チャーは、すべての送信キュー内の一番古いリスタート・ポイントでログの読み取りを再開し、すべてのキューが同じリスター ト・ポイントを持つようになるまで、停止したキューまで読み取ります。 SIGNAL SUBTYPE=STARTQでも同様 STOPQ 1 つまたはすべての送信キューにメッセージを置くことを停止するように指定します。Q キャプチャーはキューの状態を非アク ティブ (I) に設定し、指定されたキューまたはすべてのキューにメッセージを置くことを停止します。 Q キャプチャー・プログラム は、アクティブな送信キューに関連付けられている Q サブスクリプションへの変更のパブリッシュを続行します。すべての送信 キューが停止した場合、Q キャプチャーは CAPSTART などのシグナルについてのログの読み取りと、モニター表への挿入を 続行し、コマンドを待機します。 SIGNAL SUBTYPE=STOPQでも同様 92 © 2009 ISE Corporation 新規起動パラメーター(STARTALLQ=Y/N) <asnParmClass::printParms> ASN0529I "Q Capture" : "ASN" : "Initial" : The value of "STARTMODE" was set to "COLD" at startup by the following method: "COMMANDLINE". <asnParmClass::printParms> ASN0529I "Q Capture" : "ASN" : "Initial" : The value of "IGNTRIG" was set to "N" at start up by the following method: "DEFAULT". <asnParmClass::printParms> ASN0529I "Q Capture" : "ASN" : "Initial" : The value of "MESSAGE_PERSISTENCE" was set to "Y" at startup by the following method: "DEFAULT". <asnParmClass::printParms> ASN0529I "Q Capture" : "ASN" : "Initial" : The value of "STARTALLQ" was set to "Y" at sta New rtup by the following method: "DEFAULT". <asnParmClass::printParms> ASN0529I "Q Capture" : "ASN" : "Initial" : The value of "AUTOSTOP" was set to "N" at star tup by the following method: "PARAMETERS TABLE". <Asnenv:setEnvIpcQRcvHdl> ASN0594I "Q Capture" : "ASN" : "Initial" The program created an IPC queue with keys "(0x30 0000e3)". ASNMQLOD:MQCONN> ASN0585I "Q Capture" : "ASN" : "AdminThread" : The program successfully loaded the WebSphere MQ li brary "libmqm_r.a(libmqm_r.o)". Environment variable ASNUSEMQCLIENT is set to "". <handleLogrdInitMsg> ASN7108I "Q Capture" : "ASN" : "WorkerThread" : At program initialization, the highest log sequ ence number of a successfully processed transaction is "0000:0000:0000:0000:0000" and the lowest log sequence number of a transaction still to be committed is "0000:0000:0000:400F:9F28". <handleLogrdInitMsg> ASN7155i "Q Capture" : "ASN" : "WorkerThread" : The Q Capture program started processing log re cords in log file "/testfs/db2v95/NODE0000/S0000257.LOG". startallq=y/n Q キャプチャー・プログラムが開始時にすべての送信キューをアクティブ化するかどうかを指定します。 このパラメーターを使用して、使用不可の送信キューを非アクティブにしておくことができます。 y (デフォルト) Q キャプチャー・プログラムが開始するときに、まだアクティブ (A) 状態ではないすべて の送信キューをアクティブ化します。 n Q キャプチャー・プログラムが開始するときに、非アクティブ (I) 状態の送信キューを アクティブ化しません。 93 © 2009 ISE Corporation ConcurrentAccessResolution for for Load Load ConcurrentAccessResolution 94 © 2009 ISE Corporation ConcurrentAccessResolution for Load 当機能の目的と使用方法 目的 DB2 V9.7新機能 新機能の つの Commitedによって によってFullrefresh中 中に更新が 更新が実行中の 実行中の場合、 場合、Qapplyや やSQL 新機能の1つのCurrently によって Applyにおいて においてデータロス 構成の をAVAILABLEまたは または においてデータロスが データロスが発生することが 発生することが判明 することが判明、 判明、DB CFG構成 構成のCUR_COMMIT=ONを OFFに に変更せず 、SQL Applyが がData Lossを を発生させない 変更せずQapply、 せず 発生させない方法 させない方法を 方法を考案する 考案する必要 する必要があった 必要があった。 があった。 方法として やSQL APPLYが が使用する や独自の をWAIT FOR OUTCOMEで でバイン 方法としてQAPPLYや として 使用するEXPORTや する 独自のPACKAGEを とSQL APPLYから からEXEC SQL SET CURRENT PACKAGESET = ‘ASN’を を指定しその ドし、QAPPLYと から 指定しその PACKAGEのみを のみを使用 のケース) に関してはFEDERATION のみを使用する 使用する方法 する方法が 方法が採用された 採用された(EXPORTの された ケース). CURSOR LOADに しては SERVERオプション オプションに を指定し オプションにCONCURRENT_ACCESS_RESOLUTION=Wを 指定し特定の 特定のパッケージを パッケージを使用する 使用する 使用方法と 使用方法と変更点 CUR_COMMIT=ON環境下 環境下での 生成 環境下でのWAIT FOR OUTCOME オプションの オプションの自動PACKAGE生成 自動 新規サーバーオプション 新規サーバーオプションCONCURRENT_ACCESS_RESOLUTION=W サーバーオプション DOWNLEVEL CLIENTからの からのGENERICバインド バインド からの Z/OS, iSeriesクライアント クライアントからの クライアントからの指定方法 からの指定方法 使用可能な 使用可能なレベル IRS V9.7 GA ~ または V95 FP5 対象プラットフォーム 対象プラットフォーム Linux, Unix, Windows 95 © 2009 ISE Corporation DB2_SKIPINSERTED, DB2_SKIPDELETEDがある場合の注意点 DB2_SKIPINSERTED=YES Insert Delete Log Log DB2_SKIPDELETED=YES CAPSTART Commit Log Log CAPSTART Commit Log Log Capstartの前からInsertのトランザクション が実行されCapstart後にCommitされた場合 Captureによって変更収集されず、かつ Commit前のFull refresh時のfetchで(CS iolation)で Insertされたデータは拾うことができないため不整合 Capstartの前後には関係なく、Delete実行中にFull refreshが実行されそのトランザクションがCommit された場合にFull refreshではそれらが反映されない ため不整合 Full refresh の実行時にはこれらのRegistryは使用しないように!! ※DB2_SKIPINSERTED, DB2_SKIPDELETEDは、DB2 for LUW V8.2 フィックスパック2からの機能です 96 © 2009 ISE Corporation 参考:関連Technote http://www-01.ibm.com/support/docview.wss?rs=3572&uid=swg21330335&loc=en_US&cs=utf-8&lang=en Linux,Unix,Windowsの 記述間違いです。 (修正依頼済み) 97 © 2009 ISE Corporation DB2 (V9.5以前)の読み取り一貫性 • DB2は は最新の 最新のデータを データを読む • 参照処理は、更新処理がコミットされるまで待つ A B TRN1 UPDATE C C’ UPDATE COMMIT D D’ TRN2 TRN2は、TRN1が COMMITするまで WAIT SELECT E F 読むデータは データは常に最新だが 最新だが、 だが、参照処理が 参照処理がロック待機 ロック待機する 待機する可能性 する可能性あり 可能性あり 98 © 2009 ISE Corporation Oracleの読み取り一貫性 (Read Committed) • マルチ・ マルチ・バージョン一貫性制御 バージョン一貫性制御 (Multi-Version Concurrency Control) • 更新処理により、更新前イメージが専用の領域へ書き出される • 参照処理はコミットを待たずに更新前イメージを読む • Select発行時点でコミット済みのデータを読む • 下記の例では、UPDATEがCOMMITされていたとしてもTRN2は更新前データを読む SCN=10 B TRN1 UPDATE A SCN=110 UPDATE SCN=98 SCN=100 UNDOセグメント TRN2 C C’ C D D’ D SCN=29 SELECT E F 読んだデータ んだデータが データが最新とは 最新とは限 とは限らないが、 らないが、参照処理は 参照処理はロック待機 ロック待機しない 待機しない 99 © 2009 ISE Corporation DB2 (DB2 V9.7)の読み取り一貫性 (Currently Committed) • 未コミットの コミットの更新があっても 更新があってもロック があってもロック待機 ロック待機をしない 待機をしない • 参照処理は、更新処理に伴うロックの開放を待たず、更新前のデータ(コミット済みの最新 データ)をログ(ログバッファー)から読む • 常に最新のコミット済みデータを読む A B トランザクションログ (ログバッファー) UPDATE C C’ C UPDATE D D’ D TRN1 TRN2 SELECT E F 参照処理は 参照処理はロック待機 ロック待機せず 待機せず、 せず、かつコミット かつコミット済 コミット済みの最新 みの最新データ 最新データを データを読む 100 © 2009 ISE Corporation Currently Committedの有効化 • • CUR_COMMIT DB構成 構成パラメーター 構成パラメーター : 新規作成DBのデフォルト (分離レベルCSはCurrently Committedとして挙動) • ON • AVAILABLE: アプリケーションから明示的に指定された場合にCurrently Committed有効 • DISABLED : Currently Committed無効 (V9.5以前からMigrationされたDBでのデフォルト) BIND コマンド >--+-------------------------------------------------------------+--> '--CONCURRENTACCESSRESOLUTION--+--USE CURRENTLY COMMITTED--+--' '--WAIT FOR OUTCOME---------' • アプリからの指定 • • 101 Java • concurrentAccessResolution (Connection/DataSourceプロパティ) • setDBConcurrentAccessResolution (DB2Connectionのメソッド) CLIや.NetからもCurrently Committedの指定可能 © 2009 ISE Corporation Currently Committedが有効にならないケース • カタログ表のアクセス • RCT(Range Clustered Table)のアクセス • 参照制約の適用 • Long Varchar/Vargraphic列を持った表のアクセス • 表レベル/Blockレベルのロック競合 • Update/Deleteに伴う表アクセス、更新可能Cursor • 「未コミットInsert行のスキップ」はWrite処理対象表であっても有効 T1表 表 (索引無し 索引無し) APL2 UPDATE T1 SET COL2=‘ COL2=‘ZZ’ ZZ’ X X 102 X X COL ZZ2 AA ZZ BB ZZ CC DD ZZ EE X APL1 INSERT VALUES (803,’ (803,’DD’ DD’) COL1 800 801 802 803 804 © 2009 ISE Corporation V97 Fullrefresh 問題点 • 新規DataBase( (CURR_COMMIT=ON)からの からのReplicationでは ではdata漏 漏れの可 新規 からの では れの可 能性 • DB2 V97 Server – DB2 V97 Client • DB2 V97 Server – DB2 V95 Client • DB2 V97 Server – DB2 z/OS Client ( z/OS開発と交渉中) A TRN1 INSERT UPDATE B トランザクションログ (ログバッファー) C X’ D D’ D TRN2 QAPPLY SELECT E COMMIT F CAPSTART 103 © 2009 ISE Corporation 解決策 データ移動方法別解決策 データ移動方法別解決策 Data漏 漏れ解決策 Programs Export/Import or Load QAPPLY SQL APPLY DB2Export API WFO Bindを使用、QAPPLYからは EXEC SQL SET CURRENT PACKAGESET=‘ASN’(PackageはAUTOBIND) *Downlevel ClientからはGENERIC Bind Option使用 Load from Cursor using Nickname QAPPLY DRDA WRAPPER CLI Setting変更 SQL APPLY CLIのSQLSetConnectAttr SQL_WAIT_FOR_OUTCOME使用 ALTER SERVER <Server_NAME> Options CONCURRENT_ACCESS_RESOLUTION ‘W’) Apply実行時 実行時に のCheck(ASN7532E) 実行時にSERVER_OPTIONの *Downlevel Clientからは特になし, CUR_COMMIT=AVAILABLEを推奨 104 SELECT/INSERT SQL APPLY ASNAFET.SQCの のプリコンパイルオプション変更 プリコンパイルオプション変更 Load from Cursor without Nickname QAPPLY 回避策なし 回避策なし SQL APPLY © 2009 ISE Corporation CURSOR LOADをSERVER_OPTIONなしで実行した場 合 (QREPL) 2009-04-14-12.26.27.448321 ASN7613I "Q Apply" : "ASN" : "BR00000" : Start processing queue (receive queue "Q1", replication queue map "MYQMAP1" ), application single byte codepage "943", double byte codepage "941", source codepage "943", endian conversion required "0", float conversion "0". 2009-04-14-12.26.27.449211 ASN8999D Browser for queue 'Q1' received a 'ASNMQ_SUBSCHEMA_MSG' message. 2009-04-14-12.26.27.833369 ASN8999D agent 1001 started for queue "Q1" for sub "SUB1" 2009-04-14-12.26.27.949055 ASN8999D The server option CONCURRENT_ACCESS_RESOLUTION was not set in SYSCAT.SERVEROPTIONS for the servername "" 2009-04-14-12.26.27.949268 ASN7532E "Q Apply" : "ASN" : "BR00000SP001" : The Q Apply program could not select the "LOAD from CURSOR" load utility for the Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). Reason code: "9". 2009-04-14-12.26.27.949696 ASN0589I "Q Apply" : "ASN" : "BR00000SP001" The program received an unexpected return code "821" from routine "QAsub::callLoader". 2009-04-14-12.26.27.975638 ASN7597E "Q Apply" : "ASN" : "BR00000SP001" : The Q subscription "SUB1" (receive queue "Q1", replication queue map " MYQMAP1“) is about to be disabled because of the conflict action or error action. Future transaction row changes to this Q subscription will be skipped. 2009-04-14-12.26.30.249581 ASN7019I "Q Capture" : "ASN" : "WorkerThread" : "CAPSTOP" signal was received and will be processed. 2009-04-14-12.26.30.279051 ASN7013I "Q Capture" : "ASN" : "WorkerThread" : The publication or Q subscription "SUB1" was deactivated. 2009-04-14-12.26.30.457181 ASN8999D Browser for queue 'Q1' received a 'ASNMQ_SUBDEACTIVATED' message. 2009-04-14-12.26.30.457372 ASN7595W "Q Apply" : "ASN" : "BR00000" : The Q Apply program received a Q subscription deactivate message, but the SUB_ID "1" (receive queue "Q1", replication queue map"MYQMAP1") cannot be found or the Q subscription is in the inactive state. 2009-04-14-12.26.30.470475 ASN8999D spillQ 'IBMQREP.SPILL.MODELQ.0.1.2' for sub 'SUB1' successfully deleted 2009-04-14-12.26.30.475274 ASN7133I "Q Capture" :"ASN" : "WorkerThread" : The publication or Q subscription "SUB1" was stopped. ASN7532E RC=9 The target is Version 8 or later of DB2 UDB for Linux, UNIX, or Windows; and the source nickname is defined but does not use server option SQL_USE_CURRENTLY_COMMITTED=W, which is required to select LOAD FROM CURSOR. That server option is required to ensure that LOAD FROM CURSOR waits until all in-progress transactions that modify the source table are completed before beginning the export. If you need to use this utility, you must update the federated server options using the following command: db2 alter server <server name> OPTIONS(ADD CONCURRENT_ACCESS_RESOLUTION 'W'); 105 © 2009 ISE Corporation CURSOR LOADをSERVER_OPTIONなしで実行した場 合 (SQL) ------------------------Compiled(A) at 00:05:13 on Apr 20 2009 (Level 80127g_97) UTGP: Commit1 ok USRX: child process created USRX: ASNLOAD normal termination. 2009-04-22-19.08.29.236823 ASN1053E APPLY "QUAL1" : "WorkerThread". The execution of the ASNLOAD exit routine failed. The return code is "112". The NLS msg is ASN1053E APPLY "QUAL1" : "WorkerThread". The execution of the ASNLOAD exit routine failed. The return code is "112". USRX: ASNLOAD failed, exit status = 112. APPCHG: ROLLBACK member 0 PSET: ROLLBACK PSET: success is 0 PSET: connect to NEWDB; rc = 1 PSET: connect to V9DB; rc = 1 CLOS: setRepeatCopy is 0 CPCLOS: success is 0. retcode is 0. CLOS: activate = 1 CLOS: status = -1 CLOS: lastrun = 2009-04-22-19.08.28.564972 CLOS: lastsuccess is null CLOS: synchpoint is null CLOS: synchtime is null CLOS: apply_qual = QUAL1 CLOS: set_name = SET1 106 © 2009 ISE Corporation CURSOR LOADをSERVER_OPTIONなしで実行した場 合 (SQL) SERVERTYPE is DB2/AIX and SERVERVERSION is 9.7. Checking for CONCURRENT_ACCESS_RESOLUTION support Exiting checkServTypeAndVersAllowsCAR with TRUE ERR: The federated server supports option CONCURRENT_ACCESS_RESOLUTION, but that option does not seem to be enabled. This option must be set for servers for UDB databases of version 9.7 or higher. Exiting checkSrcNickUsesWFO with srcNickUsesWFO 0 Getting the configuration for the Sourceserver (get_cfg_values): NEWDB Connecting (connect_db): CONNECT TO NEWDB INF: CONNECT to server NEWDB successful. Exiting connect_db with return code 0 Configuration for Sourceserver 'NEWDB': DB2 Type : SQL DB2 LUW : TRUE Version : 9 Release : 7 Local : FALSE Table is nick : FALSE Nicknametype : Loadx_src_n_owner: DB2V97 Loadx_src_n_table: T1NK Exiting get_cfg_values with return code 0 ERR: Cannot use Crossloader because the option CONCURRENT_ACCESS_RESOLUTION='W' was not set for the server mapping for this nickname Exiting runapplychecks unsuccessfully with return code 112 *** Exiting ASNLOAD : Return Code is: 112 107 asnloadQUAL1.trc © 2009 ISE Corporation QAPPLYからCollection ASNでBindされたExport Utility Package ==> db2 -vtf selpkg10.sql select substr(pkgschema,1,8) as pkgschema, substr(pkgname,1,8) as pkgname, substr(CONCURRENTACCESSRESOLUTION,1,1) as CONCURRENTACCESSRESOLUTION, LAST_BIND_TIME,PKGID from syscat.packages where pkgname like 'SQLUBH05%' PKGSCHEMA PKGNAME CONCURRENTACCESSRESOLUTION LAST_BIND_TIME PKGID --------- -------- -------------------------- -------------------------- -------------------NULLID SQLUBH05 - 2009-04-13-15.53.04.560330 292 ASN SQLUBH05 W 2009-04-13-15.52.20.461318 359 2 record(s) selected. Export UtilityをQapplyが実行時にCollection ‘ASN’ WFOでAutobind 108 © 2009 ISE Corporation Server_optionなしでLOAD_TYPE=0が選択された場合の Warning 2009-04-14-12.56.37.603658 ASN8999D Browser for queue 'Q1' received a 'ASNMQ_SUBDEACTIVATED' message. 2009-04-14-12.56.37.603975 ASN8999D spillQ 'IBMQREP.SPILL.MODELQ.0.1.2' for sub 'SUB1' was not found 2009-04-14-12.56.37.624250 ASN8999D Browser for queue 'Q1' received a 'ASNMQ_SUBSCHEMA_MSG' message. 2009-04-14-12.56.37.777105 ASN8999D agent 1001 started for queue "Q1" for sub "SUB1" 2009-04-14-12.56.37.881039 ASN8999D The server option CONCURRENT_ACCESS_RESOLUTION was not set in SYSCAT.SERVEROPTIONS for the servername "" 2009-04-14-12.56.37.881250 ASN7531I "Q Apply" : "ASN" : "BR00000SP001" : The load utility "EXPORT/LOAD" was selected by the Q Apply program for Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). Reason code: "9". 2009-04-14-12.56.37.882275 ASN7528I "Q Apply" : "ASN" : "BR00000SP001" : The Q Apply program for the Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1") will use the "EXPORT" utility to load table "DB2V97.T1". 2009-04-14-12.56.38.402666 ASN7529I "Q Apply" : "ASN" : "BR00000SP001" : The "EXPORT" utility for table "DB2V97.T1" completed successfully forthe Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). The message from the utility is "Rows exported: 102". 2009-04-14-12.56.38.413499 ASN7528I "Q Apply" : "ASN" : "BR00000SP001" : The Q Apply program for the Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1") will use the "LOAD" utility to load table "DB2V97.T1_COPY". 2009-04-14-12.56.39.578647 ASN7529I "Q Apply" : "ASN" : "BR00000SP001" : The "LOAD" utility for table "DB2V97.T1_COPY" completed successfully for the Q subscription "SUB1" (receive queue "Q1", replication queue map "MYQMAP1"). The message from the utility is "Rows loaded: 102, Rows rejected: 0, Rows skipped: 0, Rows deleted: 0". ASN7531I // Reason code: <reason_code>. 9 The target is Version 8 or later of DB2 UDB for Linux, UNIX, or Windows; and the source nickname is defined but does not use server option SQL_USE_CURRENTLY_COMMITTED=W, which is required to select LOAD FROM CURSOR. That server option is required to ensure that LOAD FROM CURSOR waits until all in-progress transactions that modify the source table are completed before beginning the export. The utility selected was the next best alternative. 109 © 2009 ISE Corporation ブランク・ ブランク・ページ 110 © 2009 ISE Corporation XML列のTransformationサポート XML列のTransformationサポート 111 © 2009 ISE Corporation XML列のTransformationサポート 当機能の目的と使用方法 目的 XML列 列のExpressionを をサポート 使用方法と 使用方法と変更点 asnclp, replication centerで でXML関数 関数を 関数を指定する 指定する 使用可能な 使用可能なレベル IRS V9.7 GA ~ または DB2 for z/OS V9 対象プラットフォーム 対象プラットフォーム Linux, Unix, Windows, z/OS 112 © 2009 ISE Corporation XML列のTransformation • V9.7から からXML列 列の変換が から 変換が可能 • キー列以外の変換が可能 Capture DB2Log Apply 変換 変換 SOURCE1 差分コピーはアプライで変換が実施される。 ターゲット側で実施される。 TARGET1 フルリフレッシュ 自動LOAD時 時 自動 ソースDBに対するSELECT 差分コピー 差分コピー時 コピー時 自動LOADはソース表からSELECTする時 に変換が適用される。 ソース側で実施される。 キー列が含まれない場合 エージェントスレッドで変換を行いターゲットに適用 キー列が含まれる場合 ターゲットのBrowserスレッドからのSYSIBM.SYSDUMMY1に対するダミーのSELECTし、結果をアプライエージェントに渡す 各行毎 考慮点 ソースとターゲットで動きが異なる関数を指定すると不整合が発生する 113 © 2009 ISE Corporation XML列のTransformationで使用可能なXML関数 • XML列 列のTransformation内 内で使用可能な 使用可能な関数 • サポートされているXML関数 • • • • • • • • • • • • • • • • サポートされていないXML関数 • • • • • • • 114 XMLATTRIBUTES XMLCOMMENT XMLCAST XMLCONCAT XMLDOCUMENT XMLELEMENT XMLFOREST XMLNAMESPACES XMLPARSE XMLPI XMLQUERY XMLROW XMLSERIALIZE XMLTEXT XMLVALIDATE PARAMETER XMLAGG XMLEXISTS XMLGROUP XMLTABLE XMLXSROBJECTID XSLTRANSFORM © 2009 ISE Corporation 使用例1 • 以下のような 以下のようなレプリケーション のようなレプリケーションを レプリケーションを定義 • XMLQUERY関数でソース側のXMLデータに <root>ノードを追加してレプリケーションを行う ソース側データ C1 C2 (INT) ) (XML) ) 1 <a>aa</a> 2 <b>aa</b> 115 変換 XMLDOCUMENT( XMLQUERY( '<root>{$a }</root>' passing :c2 as "a" ) ) ターゲット側データ C1 (INT) ) C2 (XML) ) 1 <root> <a>aa</a> </root> 2 <root> <b>aa</b> </root> © 2009 ISE Corporation 使用例1 • ソース表 ソース表とターゲットの ターゲットの定義を 定義を行い、 ASNCLPで でサブスクリプションを サブスクリプションを作成 • XML変換列 変換列の 変換列のマッピング • XML->XML Expression句でXML関数を使用 した変換を指定 ソース表とターゲット表定義 C:¥work¥asnclp>db2 -tvf crttab.sql drop table t1 DB20000I SQL コマンドが正常に完了しました。 drop table t1_copy DB20000I SQL コマンドが正常に完了しました。 create table t1(c1 int not null primary key,c2 xml) DB20000I SQL コマンドが正常に完了しました。 insert into t1 values (1,'<a>aa</a>') DB20000I SQL コマンドが正常に完了しました。 create table t1_copy(c1 int not null primary key,c2 xml) DB20000I SQL コマンドが正常に完了しました。 116 ==== CMD: create qsub using replqmap qmap1 (t1 options has load phase I exist target name t1_copy type usertable trgcols include(C1) expression ("XMLDOCUMENT(XMLQUERY('<root>{$a }</root>' passing :c2 as ""a""))" TARGET c2) conflict action i error action s ); ==== ASN1956I ASNCLP : プログラムは、現在、アクション "CREATE Q SUBSCRIPTION" を実 行するためのスクリプトを生成しています。 ASN1955I ASNCLP : プログラムは次のファイルを使用します。キャプチャー SQL スク リプトとして "nul"、コントロール SQL スク リプトとして "replctl.sql"、ターゲット SQL スクリプトとして "nul"、およびログ・ ファイルとして "qreplmsg.log"。 <ClpInfo2Log:: Now running SQL...> ASN1514I レプリケーション・アクションは、 "2009年4月26日 (日曜日) 0時16分04秒 JST" に、"1" の成功、"0" のエラー、および "0" の警告で終了しました。 <ClpInfo2Log:: Now running SQL...> ASN1514I レプリケーション・アクションは、 "2009年4月26日 (日曜日) 0時16分04秒 JST" に、"0" の成功、"0" のエラー、および "0" の警告で終了しました。 ASN1953I ASNCLP : コマンドが完了しました。 © 2009 ISE Corporation 使用例1 • 定義後、 定義後、キャプチャ、 キャプチャ、アプライを アプライを起動して 起動してレプリケーション してレプリケーションを レプリケーションを開始 C:¥work¥asnclp>db2 select c1,xmlserialize(c2 as char(50)) from t1 C:¥work¥asnclp>db2 "insert into t1 values (3,'<b>あいうえお</b>')" DB20000I SQL コマンドが正常に完了しました。 C1 2 ----------- -------------------------------------------------フルリフレッシュ後のソース 1 <a>aa</a> C:¥work¥asnclp>db2 select c1,xmlserialize(c2 as char(50)) from t1 1 レコードが選択されました。 表とターゲット表のデータ C:¥work¥asnclp>db2 select c1,xmlserialize(c2 as char(50)) from t1_copy C1 2 ----------- -------------------------------------------------1 <root><a>aa</a></root> C1 ----------1 2 3 2 -------------------------------------------------<a>aa</a> <b>bb</b> <b>あいうえお</b> 3 レコードが選択されました。 ソース表更新 C:¥work¥asnclp>db2 select c1,xmlserialize(c2 as char(50)) from t1_copy 1 レコードが選択されました。 C:¥work¥asnclp>db2 "insert into t1 values (2,'<b>bb</b>')" DB20000I SQL コマンドが正常に完了しました。 C:¥work¥asnclp>db2 select c1,xmlserialize(c2 as char(50)) from t1 C1 ----------1 2 2 -------------------------------------------------<a>aa</a> <b>bb</b> 2 レコードが選択されました。 C1 ----------1 2 3 2 -------------------------------------------------<root><a>aa</a></root> <root><b>bb</b></root> <root><b>あいうえお</b></root> 3 レコードが選択されました。 日本語も問題なくレプリケーションさ れています。 C:¥work¥asnclp>db2 select c1,xmlserialize(c2 as char(50)) from t1_copy C1 ----------1 2 2 -------------------------------------------------<root><a>aa</a></root> <root><b>bb</b></root> 変換が行われてレプリケーションさ 2 レコードが選択されました。 117 れています。 © 2009 ISE Corporation ブランク・ ブランク・ページ 118 © 2009 ISE Corporation フェデレーテッド・クエリーのキャンセルサポート フェデレーテッド・クエリーのキャンセルサポート 119 © 2009 ISE Corporation フェデレーテッド・クエリーのキャンセルサポート 当機能の目的と使用方法 目的 アプリケーションから アプリケーションからデータソース からデータソースで データソースで実行中の 実行中のクエリを クエリをキャンセルできる キャンセルできる 使用方法と 使用方法と変更点 アプリケーションから アプリケーションからキャンセル からキャンセルを キャンセルを発行する 発行する。 する。 以前の 以前のバージョンでは バージョンでは、 では、データソースで データソースで実行中の 実行中のクエリまで クエリまでキャンセル までキャンセルするこ キャンセルするこ とはできなかった。 とはできなかった。 使用可能な 使用可能なレベル IRS V9.7 GA ~ 対象プラットフォーム 対象プラットフォーム (データソース データソースが データソースが)Linux, Unix, Windows 120 © 2009 ISE Corporation キャンセル発行時の動作(V9.5とV9.7の比較) V9.5までの場合 アプリケーション ニックネーム SQL発行 IFS リモートSQL発行 データソース キャンセル データソースからの 結果が返ってくるま で待ちになる 結果転送 V9.7の場合 アプリケーション ニックネーム SQL発行 キャンセル IFS データソースへ データソースへキャン セルを セルを発行する 発行する リモートSQL発行 データソース キャンセル ※ 実機で確認したところ、データソースはホストでもキャンセル可 121 © 2009 ISE Corporation force applicationによるクエリのキャンセル $ db2 “ select * from loopview” ## クエリが実行中になる ## V9.5 ←クライアントからニックネームSQLを発行 フェデレーション・サーバーからデータソースへリモートSQLが発行される フェデレーション・サーバーでlist applicationsを確認 $ db2 "list applications show detail“|grep db2bp NOG95 db2bp 17842 *LOCAL.nog95.090414102544 00004 1 0 7253 Federated request pending データソースでlist applicationsを確認 $ db2 "list applications show detail“|grep db2agent NOG95 db2agent (FEDDB95) 0 17851 00001 1 0 5374 UOW Executing *LOCAL.nog95.090414102724 フェデレーション・ フェデレーション・サーバーで サーバーでforce applicationsを applicationsを発行 $ db2 “force application (19)“ DB20000I The FORCE APPLICATION command completed successfully. DB21024I This command is asynchronous and may not be effective immediately. ## クエリは クエリは切断されない 切断されない## されない フェデレーション・サーバーでlist applicationsを確認⇒アプリケーションは切断されていない $ db2 "list applications show detail“|grep db2bp NOG95 db2bp 17842 *LOCAL.nog95.090414102544 00004 1 0 7253 Federated request pending データソースでlist applicationsを確認⇒アプリケーションは切断されていない $ db2 "list applications show detail“|grep db2agent NOG95 db2agent (FEDDB95) 0 17851 00001 1 0 5374 UOW Executing 122 *LOCAL.nog95.090414102724 © 2009 ISE Corporation force applicationによるクエリのキャンセル $ db2 “ select * from loopview” ## クエリが実行中になる ## V9.7 ←クライアントからニックネームSQLを発行 フェデレーション・サーバーからデータソースへリモートSQLが発行される フェデレーション・サーバーでlist applicationsを確認 $ db2 "list applications show detail“|grep db2bp NOG97 db2bp 8114 00001 1 0 5631 Federated request pending *LOCAL.nog97.090414103831 データソースでlist applicationsを確認 $ db2 "list applications show detail“|grep db2agent NOG97 db2agent (FEDDB97) 0 8125 00001 1 0 7258 UOW Executing *LOCAL.nog97.090414103848 フェデレーション・ フェデレーション・サーバーで サーバーでforce applicationsを applicationsを発行 $ db2 “force application (8114)“ DB20000I The FORCE APPLICATION command completed successfully. DB21024I This command is asynchronous and may not be effective immediately. ## クエリが クエリがキャンセルされ キャンセルされ、 され、クライアントに クライアントにメッセージが メッセージが表示される 表示される ## SQL1224N The database manager is not able to accept new requests, has terminated all requests in progress, or has terminated the specified request because of an error or a forced interrupt. SQLSTATE=55032 フェデレーション・サーバーでlist applicationsを確認⇒UOW Waitingになっている $ db2 "list applications show detail“|grep db2bp NOG95 db2bp 00004 1 0 7253 UOW Waiting 17842 *LOCAL.nog95.090414102544 データソースでlist applicationsを確認⇒UOW Waitingになっている $ db2 "list applications show detail“|grep db2agent NOG95 db2agent (FEDDB95) 0 17851 00001 1 0 5374 UOW Waiting 123 *LOCAL.nog95.090414102724 © 2009 ISE Corporation フェデレーション・サーバーがHADR構成の時のテークオーバー時の動き V9.5 フェデレーション・ standby フェデレーション・サーバー:HADR サーバー フェデレーション・ primary フェデレーション・サーバー:HADR サーバー $ db2 “start hadr on db feddb95 as standby” $ db2 “start hadr on db feddb95 as primary” データソース $ db2 “connect to sample” $ db2 +c “lock table staff in exclusive mode” ## staff表 staff表がロックされる ロックされる ## $ db2 “connect to feddb95” $ db2 “select * from nickstaff” ## ニックネーム経由 ニックネーム経由で 経由でデータソースの データソースのstaff表 staff表にアクセスするが アクセスするが、 するが、ロッ ク待ちになる ## $ db2 “takeover hadr on db feddb95” wait ## ニックネーム経由 ニックネーム経由の 経由のSQLを SQLを実行中なので 実行中なので、 なので、アプリケーションを アプリケーションを切断 できず、 できず、takeoverが takeoverが待たされる データソース $ db2 “rollback” ## staff表 staff表へのロック へのロックが ロックが解放される 解放される ## SQL1224N The database manager is not able to accept new requests, has terminated all requests in progress, or has terminated the specified request because of an error or a forced interrupt. SQLSTATE=55032 ## staff staff表 ff表へのアクセス へのアクセスが アクセスが可能になったが 可能になったが、 になったが、HADRにより HADRによりアプリケー によりアプリケー ションが ションが切断される 切断される## される## 124 DB20000I The TAKEOVER HADR ON DATABASE command completed successfully. ## takeoverが成功する ## © 2009 ISE Corporation フェデレーション・サーバーがHADR構成の時のテークオーバー時の動き V9.7 フェデレーション・ standby フェデレーション・サーバー:HADR サーバー フェデレーション・ primary フェデレーション・サーバー:HADR サーバー $ db2 “start hadr on db feddb95 as standby” $ db2 “start hadr on db feddb95 as primary” データソース $ db2 “connect to sample” $ db2 +c “lock table staff in exclusive mode” ## staff表 staff表がロックされる ロックされる ## $ db2 “connect to feddb95” $ db2 “select * from nickstaff” ## ニックネーム経由 ニックネーム経由で 経由でデータソースの データソースのstaff表 staff表にアクセスするが アクセスするが、 するが、ロッ ク待ちになる ## cancel $ db2 “takeover hadr on db feddb95” SQL1224N The database manager is not able to accept new requests, has terminated all requests in progress, or has terminated the specified request because of an error or a forced interrupt. SQLSTATE=55032 DB20000I The TAKEOVER HADR ON DATABASE command completed successfully. ## takeoverが成功する ## ## HADRにより HADRによりアプリケーション によりアプリケーションが アプリケーションが切断される 切断される## される## 125 © 2009 ISE Corporation CLIトレース(V9.7) ## 略 ### SQLBindCol( ) <--- SQL_SUCCESS Time elapsed - +2.090000E-004 seconds SQLExecute( hStmt=1:1 ) ---> Time elapsed - +2.900000E-005 seconds [ [ [ [ [ [ [ [ [ Process: 954618, Thread: 12081 ] Date & Time: 2009-04-06 17:21:31.450105 ] Product: QDB2/AIX64 DB2 v9.7.0.0 ] Level Identifier: 08010107 ] CLI Driver Version: 09.02.0000 ] Informational Tokens: "DB2 v9.7.0.0","s090315","AIX6497","Fixpack 0" ] Install Path: /opt/IBM/db2/DB2 V9.7_beta/db2 ] db2cli.ini Location: /home/nog97/sqllib/cfg/db2cli.ini ] CLI Driver Type: IBM DB2 Application Runtime Client ] ←Ctrl + Cでクエリをキャンセル SQLCancel( SQLCancel( hStmt=1:1 hStmt=1:1 ) ---> ---> Time elapsed - 0 seconds SQLCancel( SQLCancel( ) <--- SQL_SUCCESS Time elapsed - +1.404000E+1.404000E-003 seconds ( Requested Cursor Attributes=x'00000000' ) ( Reply Cursor Attributes=x'00000000' ) ( Actual Cursor Attributes=x'00000000' ) ←キャンセルが発行されている SQLExecute( ) <--- SQL_SUCCESS Time elapsed - +2.847533E+000 seconds SQLCloseCursor( hStmt=1:1 ) ---> Time elapsed - +7.200000E-005 seconds ## 略 ## 126 © 2009 ISE Corporation CLIトレース(V9.5) ## 略 ## SQLBindCol( ) <--- SQL_SUCCESS Time elapsed - +2.070000E-004 seconds SQLExecute( hStmt=1:1 ) ---> Time elapsed - +2.700000E-005 seconds ( Requested Cursor Attributes=134217729 ) ←Ctrl + Cでクエリをキャンセル ( Reply Cursor Attributes=134742024 ) ( Actual Cursor Attributes=134742025 ) ←キャンセルの発行はない SQLExecute( ) <--- SQL_SUCCESS Time elapsed - +6.673885E+001 seconds SQLCloseCursor( hStmt=1:1 ) ---> Time elapsed - +8.000000E-005 seconds ( TERMINATE REPLY RECEIVED=1 ) 127 © 2009 ISE Corporation Summary • Range partition表 表のサポート • Compression表 表のサポート • Option to replicate Loadの のサポート • Multiple Restart Queue のサポート • ConcurrentAccessResolution for Load • XML列 列のTransformationサポート サポート • フェデレーテッド・ フェデレーテッド・クエリーの クエリーのキャンセルサポート キャンセルサポート • Summary 128 © 2009 ISE Corporation