Quantcast
Channel: 技術情報 – Insight Technology, Inc.
Viewing all 48 articles
Browse latest View live

Oracle ASMの領域監視について

$
0
0

このエントリはJPOUG Advent Calendar 2016の2日目です。
昨日は Shinnosuke Akita さんでした。

久々のエントリは、Oracle Automatic Storage Management (以降、ASM)の領域監視についての一言

さてさて皆さんちゃんと領域監視してますか?
相変わらずマウントポイント(またはドライブ)の空き領域だけ見て、表領域の中の空き領域とか監視してない Oracle Database の環境持ってませんか?
さらにさらに ASM だと、マウントポイントの監視とか意味ないですからね。皆さんどうしているんでしょうか。
ASM の場合は、表領域を格納する器として、ディスク・グループっていうのがあるので、この領域がどのくらい使われているか、どのくらい空きがあるのかをちゃんと監視するようにしてください。

例えば以下のSQLで使用状況を確認することができます。

(osのgridユーザで実行)
$ sqlplus / as sysasm

SQL> select GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB,FREE_MB,HOT_USED_MB,COLD_USED_MB,REQUIRED_MIRROR_FREE_MB,USABLE_FILE_MB from v$asm_diskgroup where NAME='DATA';

GROUP_NUMBER NAME                 STATE      TYPE                 TOTAL_MB    FREE_MB HOT_USED_MB COLD_USED_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB
------------ -------------------- ---------- ------------------ ---------- ---------- ----------- ------------ ----------------------- --------------
           1 DATA                 MOUNTED    NORMAL                 228964      64936           0       164028                   57241           3847

このFREE_MBを見るとディスク・グループ “DATA” 内の未使用のサイズが確認できますね。
ただし、このサイズは物理サイズなので、実際に利用できるサイズは可用性の設定を考慮してください。
標準冗長化を設定している場合は FREE_MB の1/2 が論理的に利用できるサイズです。
この辺の説明は”しばちょう先生”が詳しいので、こちらをご覧ください。

第30回 ASMディスク・グループの作成と使用量の確認

で、今回はASMの領域監視としてもう一個見ておいてほしい情報があるので、それについて書き残しておきます。

特に”障害グループ”を設定している環境で遭遇することになると思います。ASM ディスクごとに”障害グループ”が設定されたりしている環境では関係ないかな。

“障害グループ”は文字通り障害発生時の影響範囲を考慮してASMディスクを束ねたグループですよね。で、どんな障害グループがあるかというと、「Oracle Exadata Database Machine」とか、弊社の「Insight Qube」で採用しているストレージサーバとか、もっと小さな単位でみるなら、RAIDカードも”障害グループ”の単位と言えなくもないでしょう。

というわけで今回は「”障害グループ”を設定しているとなんなの?」っていうところを見ていきます。
以下は手元の環境です。

SQL> select GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB,FREE_MB,REQUIRED_MIRROR_FREE_MB,USABLE_FILE_MB,ALLOCATION_UNIT_SIZE,VOTING_FILES,COMPATIBILITY,DATABASE_COMPATIBILITY from v$asm_diskgroup where NAME='DATA';

GROUP_NUMBER NAME                 STATE      TYPE                 TOTAL_MB    FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB ALLOCATION_UNIT_SIZE VOT COMPATIBILITY   DATABASE_COMPAT
------------ -------------------- ---------- ------------------ ---------- ---------- ----------------------- -------------- -------------------- --- --------------- ---------------
           1 DATA                 MOUNTED    NORMAL                 228964      79400                   57241          11079              1048576 N   11.2.0.0.0      10.1.0.0.0


SQL> select GROUP_NUMBER,DISK_NUMBER,MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,NAME,FAILGROUP,LABEL,PATH,TOTAL_MB,FREE_MB,REPAIR_TIMER from v$asm_disk order by path;

GROUP_NUMBER DISK_NUMBER MOUNT_STAT HEADER_STA MODE_STATU STATE      NAME                 FAILGROUP       LABEL PATH                                                 TOTAL_MB    FREE_MB REPAIR_TIMER
------------ ----------- ---------- ---------- ---------- ---------- -------------------- --------------- ----- -------------------------------------------------- ---------- ---------- ------------
           1           0 CACHED     MEMBER     ONLINE     NORMAL     DATA_0000            FG001                 /dev/oracleasm/iq_str1_0_1_SSD                          57241      19850            0
           1           2 CACHED     MEMBER     ONLINE     NORMAL     DATA_0001            FG001                 /dev/oracleasm/iq_str1_0_2_SSD                          57241      19850            0
           1           1 CACHED     MEMBER     ONLINE     NORMAL     DATA_0002            FG002                 /dev/oracleasm/iq_str1_0_3_SSD                          57241      19847            0
           1           4 CACHED     MEMBER     ONLINE     NORMAL     DATA_0003            FG002                 /dev/oracleasm/iq_str1_0_4_SSD                          57241      19853            0
           0           0 CLOSED     FORMER     ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_5_SSD                              0          0            0

5 rows selected.

今回はこんな環境で検証していきます。

障害グループは検証目的で設定しているのでこの検証環境では物理的な構造とは関係ありません。
なので、皆さんも検証する際は特別な環境は不要です。シングルサーバでもできますよ。

各障害グループに ASM ディスクが2本

障害グループ FG001
ASMディスク DATA_0001
ASMディスク DATA_0002
障害グループ FG002
ASM ディスク DATA_0003
ASM ディスク DATA_0004

で、DATAディスク・グループに作成した表領域上のテーブルにデータをインサートしながらディスク壊してみます。
といっても本当に壊すと怒られるので、今回使用しているストレージサーバ上でターゲットになるディスクをコマンドでDisableして障害をシミュレートしました。
そのタイミングでDBノードからは見えなくなります。

まずは、データを登録しながらFREE_MBが減少する様子を眺めます。

SQL> select GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB,FREE_MB,REQUIRED_MIRROR_FREE_MB,USABLE_FILE_MB,ALLOCATION_UNIT_SIZE,VOTING_FILES,COMPATIBILITY,DATABASE_COMPATIBILITY from v$asm_diskgroup;

GROUP_NUMBER NAME                 STATE      TYPE                 TOTAL_MB    FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB ALLOCATION_UNIT_SIZE VOT COMPATIBILITY   DATABASE_COMPAT
------------ -------------------- ---------- ------------------ ---------- ---------- ----------------------- -------------- -------------------- --- --------------- ---------------
           1 DATA                 MOUNTED    NORMAL                 228964      69334                   57241           6046              1048576 N   11.2.0.0.0      10.1.0.0.0
           2 OCR                  MOUNTED    EXTERN                   1000        647                       0            647              1048576 Y   11.2.0.0.0      10.1.0.0.0

SQL> select GROUP_NUMBER,DISK_NUMBER,MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,NAME,FAILGROUP,LABEL,PATH,TOTAL_MB,FREE_MB,REPAIR_TIMER from v$asm_disk order by path;

GROUP_NUMBER DISK_NUMBER MOUNT_STAT HEADER_STA MODE_STATU STATE      NAME                 FAILGROUP       LABEL PATH                                                 TOTAL_MB    FREE_MB REPAIR_TIMER
------------ ----------- ---------- ---------- ---------- ---------- -------------------- --------------- ----- -------------------------------------------------- ---------- ---------- ------------
           1           0 CACHED     MEMBER     ONLINE     NORMAL     DATA_0000            FG001                 /dev/oracleasm/iq_str1_0_1_SSD                          57241      17333            0
           1           2 CACHED     MEMBER     ONLINE     NORMAL     DATA_0001            FG001                 /dev/oracleasm/iq_str1_0_2_SSD                          57241      17334            0
           1           1 CACHED     MEMBER     ONLINE     NORMAL     DATA_0002            FG002                 /dev/oracleasm/iq_str1_0_3_SSD                          57241      17329            0
           1           4 CACHED     MEMBER     ONLINE     NORMAL     DATA_0003            FG002                 /dev/oracleasm/iq_str1_0_4_SSD                          57241      17338            0
           0           0 CLOSED     FORMER     ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_5_SSD                              0          0            0

5 rows selected.

で、しばらくしてからASMディスクのメンバーになっているSSDをバッサリDisableしてしまうと、こんな感じになります。
今回は “DATA_0003” をDisableしてやりました。
※ ちなみに、各ASMディスクのFREE_MBが直前より増えているように見えるのは、アーカイブログを削除しながらテストしていたためなので気にしないでくださいな。

SQL> select GROUP_NUMBER,DISK_NUMBER,MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,NAME,FAILGROUP,LABEL,PATH,TOTAL_MB,FREE_MB,REPAIR_TIMER from v$asm_disk order by path;

GROUP_NUMBER DISK_NUMBER MOUNT_STAT HEADER_STA MODE_STATU STATE      NAME                 FAILGROUP       LABEL PATH                                                 TOTAL_MB    FREE_MB REPAIR_TIMER
------------ ----------- ---------- ---------- ---------- ---------- -------------------- --------------- ----- -------------------------------------------------- ---------- ---------- ------------
           1           0 CACHED     MEMBER     ONLINE     NORMAL     DATA_0000            FG001                 /dev/oracleasm/iq_str1_0_1_SSD                          57241      20913            0
           1           2 CACHED     MEMBER     ONLINE     NORMAL     DATA_0001            FG001                 /dev/oracleasm/iq_str1_0_2_SSD                          57241      20923            0
           1           1 CACHED     MEMBER     ONLINE     NORMAL     DATA_0002            FG002                 /dev/oracleasm/iq_str1_0_3_SSD                          57241      20916            0
           0           1 CLOSED     UNKNOWN    ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_4_SSD                              0          0            0
           0           0 CLOSED     FORMER     ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_5_SSD                              0          0            0
           1           4 MISSING    UNKNOWN    OFFLINE    NORMAL     DATA_0003            FG002                                                                         57241      20920            0

6 rows selected.

で、一瞬間をおいてリバランスが動き出しました。

SQL> select * from v$asm_operation;

GROUP_NUMBER OPERATION       STATE             POWER     ACTUAL      SOFAR   EST_WORK   EST_RATE EST_MINUTES ERROR_CODE
------------ --------------- ------------ ---------- ---------- ---------- ---------- ---------- ----------- -----------
           1 REBAL           RUN                   1          1       8311      54849       8131           5

この時どんな感じにリバランスされるかっていうと、、、、
各ASM ディスクのFREE_MB見ててくださいね。

SQL> select GROUP_NUMBER,DISK_NUMBER,MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,NAME,FAILGROUP,LABEL,PATH,TOTAL_MB,FREE_MB,REPAIR_TIMER from v$asm_disk order by path

GROUP_NUMBER DISK_NUMBER MOUNT_STAT HEADER_STA MODE_STATU STATE      NAME                 FAILGROUP       LABEL PATH                                                 TOTAL_MB    FREE_MB REPAIR_TIMER
------------ ----------- ---------- ---------- ---------- ---------- -------------------- --------------- ----- -------------------------------------------------- ---------- ---------- ------------
           1           0 CACHED     MEMBER     ONLINE     NORMAL     DATA_0000            FG001                 /dev/oracleasm/iq_str1_0_1_SSD                          57241      20913            0
           1           2 CACHED     MEMBER     ONLINE     NORMAL     DATA_0001            FG001                 /dev/oracleasm/iq_str1_0_2_SSD                          57241      20923            0
           1           1 CACHED     MEMBER     ONLINE     NORMAL     DATA_0002            FG002                 /dev/oracleasm/iq_str1_0_3_SSD                          57241      20651            0
           0           1 CLOSED     UNKNOWN    ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_4_SSD                              0          0            0
           0           0 CLOSED     FORMER     ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_5_SSD                              0          0            0
           1           4 MISSING    UNKNOWN    OFFLINE    FORCING    _DROPPED_0004_DATA   FG002                                                                         57241      21185            0

6 rows selected.

ほれ

SQL> /

GROUP_NUMBER DISK_NUMBER MOUNT_STAT HEADER_STA MODE_STATU STATE      NAME                 FAILGROUP       LABEL PATH                                                 TOTAL_MB    FREE_MB REPAIR_TIMER
------------ ----------- ---------- ---------- ---------- ---------- -------------------- --------------- ----- -------------------------------------------------- ---------- ---------- ------------
           1           0 CACHED     MEMBER     ONLINE     NORMAL     DATA_0000            FG001                 /dev/oracleasm/iq_str1_0_1_SSD                          57241      20309            0
           1           2 CACHED     MEMBER     ONLINE     NORMAL     DATA_0001            FG001                 /dev/oracleasm/iq_str1_0_2_SSD                          57241      20310            0
           1           1 CACHED     MEMBER     ONLINE     NORMAL     DATA_0002            FG002                 /dev/oracleasm/iq_str1_0_3_SSD                          57241      13431            0
           0           1 CLOSED     UNKNOWN    ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_4_SSD                              0          0            0
           0           0 CLOSED     FORMER     ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_5_SSD                              0          0            0
           1           4 MISSING    UNKNOWN    OFFLINE    FORCING    _DROPPED_0004_DATA   FG002                                                                         57241      27188            0

6 rows selected.

ほれほれ

SQL> /

GROUP_NUMBER DISK_NUMBER MOUNT_STAT HEADER_STA MODE_STATU STATE      NAME                 FAILGROUP       LABEL PATH                                                 TOTAL_MB    FREE_MB REPAIR_TIMER
------------ ----------- ---------- ---------- ---------- ---------- -------------------- --------------- ----- -------------------------------------------------- ---------- ---------- ------------
           1           0 CACHED     MEMBER     ONLINE     NORMAL     DATA_0000            FG001                 /dev/oracleasm/iq_str1_0_1_SSD                          57241      19359            0
           1           2 CACHED     MEMBER     ONLINE     NORMAL     DATA_0001            FG001                 /dev/oracleasm/iq_str1_0_2_SSD                          57241      19360            0
           1           1 CACHED     MEMBER     ONLINE     NORMAL     DATA_0002            FG002                 /dev/oracleasm/iq_str1_0_3_SSD                          57241       6843            0
           0           1 CLOSED     UNKNOWN    ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_4_SSD                              0          0            0
           0           0 CLOSED     FORMER     ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_5_SSD                              0          0            0
           1           4 MISSING    UNKNOWN    OFFLINE    FORCING    _DROPPED_0004_DATA   FG002                                                                         57241      31876            0

6 rows selected.

ほれほれほれ

SQL> /

GROUP_NUMBER DISK_NUMBER MOUNT_STAT HEADER_STA MODE_STATU STATE      NAME                 FAILGROUP       LABEL PATH                                                 TOTAL_MB    FREE_MB REPAIR_TIMER
------------ ----------- ---------- ---------- ---------- ---------- -------------------- --------------- ----- -------------------------------------------------- ---------- ---------- ------------
           1           0 CACHED     MEMBER     ONLINE     NORMAL     DATA_0000            FG001                 /dev/oracleasm/iq_str1_0_1_SSD                          57241      18595            0
           1           2 CACHED     MEMBER     ONLINE     NORMAL     DATA_0001            FG001                 /dev/oracleasm/iq_str1_0_2_SSD                          57241      18607            0
           1           1 CACHED     MEMBER     ONLINE     NORMAL     DATA_0002            FG002                 /dev/oracleasm/iq_str1_0_3_SSD                          57241       1509            0
           0           1 CLOSED     UNKNOWN    ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_4_SSD                              0          0            0
           0           0 CLOSED     FORMER     ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_5_SSD                              0          0            0
           1           4 MISSING    UNKNOWN    OFFLINE    FORCING    _DROPPED_0004_DATA   FG002                                                                         57241      35693            0

6 rows selected.

あ~れ~

SQL> /

GROUP_NUMBER DISK_NUMBER MOUNT_STAT HEADER_STA MODE_STATU STATE      NAME                 FAILGROUP       LABEL PATH                                                 TOTAL_MB    FREE_MB REPAIR_TIMER
------------ ----------- ---------- ---------- ---------- ---------- -------------------- --------------- ----- -------------------------------------------------- ---------- ---------- ------------
           1           0 CACHED     MEMBER     ONLINE     NORMAL     DATA_0000            FG001                 /dev/oracleasm/iq_str1_0_1_SSD                          57241      18599            0
           1           2 CACHED     MEMBER     ONLINE     NORMAL     DATA_0001            FG001                 /dev/oracleasm/iq_str1_0_2_SSD                          57241      18603            0
           1           1 CACHED     MEMBER     ONLINE     NORMAL     DATA_0002            FG002                 /dev/oracleasm/iq_str1_0_3_SSD                          57241          0            0
           0           1 CLOSED     UNKNOWN    ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_4_SSD                              0          0            0
           0           0 CLOSED     FORMER     ONLINE     NORMAL                                                /dev/oracleasm/iq_str1_0_5_SSD                              0          0            0
           1           4 MISSING    UNKNOWN    OFFLINE    FORCING    _DROPPED_0004_DATA   FG002                                                                         57241      37202            0

6 rows selected.

SQL> select GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB,FREE_MB,REQUIRED_MIRROR_FREE_MB,USABLE_FILE_MB,ALLOCATION_UNIT_SIZE,VOTING_FILES,COMPATIBILITY,DATABASE_COMPATIBILITY from v$asm_diskgroup;

GROUP_NUMBER NAME                 STATE      TYPE                 TOTAL_MB    FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB ALLOCATION_UNIT_SIZE VOT COMPATIBILITY   DATABASE_COMPAT
------------ -------------------- ---------- ------------------ ---------- ---------- ----------------------- -------------- -------------------- --- --------------- ---------------
           1 DATA                 MOUNTED    NORMAL                 171723      37202                   57241         -10019              1048576 N   11.2.0.0.0      10.1.0.0.0

と、いうわけで”障害グループ” FG002 だけディスクの空き容量がなくなってしまいました。(FREE_MB=0)

この時のリバランス処理のステータスはというと、、、、

SQL> select * from v$asm_operation;

GROUP_NUMBER OPERATION       STATE             POWER     ACTUAL      SOFAR   EST_WORK	EST_RATE EST_MINUTES ERROR_CODE
------------ --------------- ------------ ---------- ---------- ---------- ---------- ---------- ----------- ---------------
           1 REBAL           ERRS                  1                                                         ORA-15041

ハハ….ORA-15041で止まってる。

この結果から、外れたASM ディスクに乗っかってたデータは同じ”障害グループ”内の別のディスクに再配置(複製される)ようだということがわかりましたよね。
そーなんですよ。これを見るまではなんとなくほかの”障害グループ”のディスクにも移動されて、ASM ディスク全般にわたって(データ量的に)均等にリバランスされるのかと勝手に思ってました。

“障害グループ”内でデータが再配置(複製)されるということは、つまり、ディスクの本数減ってるのにデータ量をもとにもどすんだから、当然この”障害グループ”の空き容量だけ他の”障害グループより”減りますよね。

で、究極は上記の通り一部の”障害グループ”だけ空きがなくなったりします。
この状態って、ASMディスクグループの空き領域として見ていると、空いてるように見えるんですねぇ …… (キャー!!!)
「えっ! 空いてるんじゃないの?」って思ったあなた。すぐにASM ディスクか”障害グループ”ごとの空き状況を監視しましょう!!

この状態でデータ投入していた処理で何が起こっているかというと、、、、
こんな感じ。

  1  declare
  2    CURSOR C1 IS
  3  with a as (
  4  select t1.c1                                c1
  5       , t2.c1                                c2
  6       , mod(t1.c1,t2.c1)                     c3
  7       , to_char(t1.c1)                       c4
  8       , to_char(t2.c1)                       c5
  9       , to_char(mod(t1.c1,t2.c1))            c6
 10       , lpad(to_char(t1.c1),200)             c7
 11       , lpad(to_char(t2.c1),200)             c8
 12       , lpad(to_char(mod(t1.c1,t2.c1)),200)  c9
 13       , sysdate+t1.c1                        c10
 14       , sysdate+t2.c1                        c11
 15       , sysdate+mod(t1.c1,t2.c1)             c12
 16  from (select rownum c1 from dual connect by level <=10000) t1
 17     , (select rownum c1 from dual connect by level  /

declare
*
行1でエラーが発生しました。:
ORA-01653: 表TTT.T1を拡張できません(8192分、表領域TTT) 

(えっ!? ディスクグループのFREE_MBまだ空いてるのに)

で、アラートログはっていうと、、、、こんなのが大量に吐き出されてました。

...
*************************************************************
ARC3: Error 19504 Creating archive log file to '+DATA'
Unable to create archive log file '+DATA'
Errors in file /u01/app/oracle/diag/rdbms/iq/iq/trace/iq_arc0_12896.trc:
ORA-19816: WARNING: Files may exist in db_recovery_file_dest that are not known to database.
ORA-17502: ksfdcre:4 Failed to create file +DATA
ORA-15041: diskgroup "DATA" space exhausted
*************************************************************
WARNING: A file of type ARCHIVED LOG may exist in
db_recovery_file_dest that is not known to the database.
Use the RMAN command CATALOG RECOVERY AREA to re-catalog
any such files. If files cannot be cataloged, then manually
delete them using OS command. This is most likely the
result of a crash during file creation.
*************************************************************
...

アーカイブログの生成に失敗した的なメッセージが出ているけど、でもこの時点の高速リカバリ領域は、実はまだ余裕があるように見えたりする。

SQL> select * from v$recovery_file_dest;

NAME            SPACE_LIMIT      SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ -------------- --------------- ----------------- ---------------
+DATA           21474836480     12795772928                 0              13

(高速リカバリ領域空いてるじゃん!?)

とか、なにを信じていいかわからなくなってしまいます。
要は、表領域の拡張やデータファイルの追加、アーカイブログの生成などはディスクグループ全体にわたってデータを分散配置するので、一部の”障害グループ”で領域が確保できないだけでも、結局”空きがない”となるんですね。

まとめ

なので、ASMの領域監視をする場合に、”障害グループ”とか、ASM ディスク単位で使用状況を監視してもらえれば、いざという時に混乱しなくて済むかなと思う今日この頃です。
ちなみに、障害グループ内のディスクが1本故障したときにリバランス処理が走ってましたが、このデータ複製を行っても何とかORA-15041が出ないようにするためには、通常運用時にある程度の使用率に抑えておく必要がありますよね。
それが、どの程度かザクッと見積もってみると、大体以下のようになります。

障害グループを構成するディスク本数 目標ディスクグループ使用率※
8 ディスク 86.6%
7 ディスク 84.9%
6 ディスク 82.5%
5 ディスク 79.2%
4 ディスク 74.3%
3 ディスク 66.0%
2 ディスク 49.5%

[ ※ ] : ディスクが1本壊れた場合に、対象”障害グループ”内の残りのディスクで、再配置されたデータがすべて収まるようにするためには、通常運用時にこの使用率以下に抑えておく必要あり。
今日はここまで。ちゃんちゃん♪

明日は 玉城与清哉 さんです。

茅ケ崎にて

MapDにDEMデータを入れて可視化してみた

$
0
0

MapDとは

GPUを利用できるオープンソースデータベースです。
https://www.mapd.com/
大量のデータを分析のための高速な可視化。機械学習などに有効です。

 

DEM: Digital Elevation Modelとは


数値標高モデルのことです。
地表の高さのことであり、ビルや木の高さは含まれません。
(ビルの高さ等を含む場合は、DSM(Digital Surface Model)と呼ばれます。)

今回は国土地理院からダウンロードしてきました。
https://fgd.gsi.go.jp/download/menu.php

 

MapDによるDEMデータ可視化までの流れ

 

まずはデータのダウンロード

 
https://fgd.gsi.go.jp/download/menu.php


このページからダウンロードしてきます。
 

画面の見方

今見えている4桁の番号が振られている枠は第1次メッシュです。
(第1次メッシュは20万分の1地勢図の1図葉の区画を1単位区画としたもので、緯度差は40分、経度差は1度となっています。)

さらに拡大していくと第2次メッシュまで表示されます。
(第1次メッシュを緯線方向及び経線方向に8等分してできる区域で、2万5千分の1地形図の1図葉の区画に対応します。緯度差は5分、経度差は7分30秒)
第2次メッシュごとに持ってくるデータの範囲を選択できます。

 
検索条件の中に、レーザー測量と写真測量があります。
レーザー測量にはAのアルファベットが振られ、主に都市部を測量対象としています。
一方写真測量はBで、都市周辺を対象としています。
https://fgd.gsi.go.jp/otherdata/spec/DEMgaiyo.pdf

 
今回は大阪府全体のDEMデータをMapDで可視化してみたいと思います。
 

データの形式、タイトルの意味

ダウンロードは案内に従って実行してください。
ファイルは第2次メッシュごとにzip形式で入手できます。

解凍してやると、第3次メッシュ(第2次メッシュを緯線方向及び経線方向に10等分してできる区域)ごとにファイルにしてあります。
 

これはファイル名の一例です。
FG-GML-5135-32-33-DEM5B-20161001.xml
 
ファイル名は以下のような意味を持ちます。
FG-GML-pppp-qq-rr-DEM5X-yyyymmdd.xml
・pppp: 1次メッシュ番号
・qq: 2次メッシュ番号
・rr: 3次メッシュ番号
・DEM5A: 5m感覚でA: レーザー測量を用いたDEM (B:写真測量)
・yyyymmdd: 年月日

 

データを変換してやる

概要だけ書きますが、かなり苦戦しました。
要望があれば別ブログに書きます。
 

ファイルの中身


XMLファイルの先頭を少し載せておきます。(赤線は重要になる情報の一つ)
 
ファイルの中で重要となる要素は以下の要素です。
下記の情報を取り入れて、緯度経度の情報を持ったcsvファイルを生成します。
lowerCorner: 第3次メッシュの左下の座標に相当
upperCorner: 第3次メッシュの右上の座標に相当
low: データ点の始点(x, y)
high: データ点の終点(x, y)
tupleList: 標高データ
sequenceRule order=”+x-y”: データの並びのルール
startPoint: データの始点
 

csvファイル

以下のような形式で作成しました。
elevation,  156.22,  135.528388889,  34.866666667
elevation,  153.48,  135.528444444,  34.866666667
elevation,  152.14,  135.5285,  34.866666667
 
大事なのは地理に基づいたデータに、そのデータがどこの点なのか、
緯度(latitude)、経度(longitude)を並べて表示してあることです。
左から①名前②標高データ③経度④緯度のデータが入っています。
 

MapDにデータを入れる

テーブルを作る

以下のsqlファイルを作成しました。

create table DEM
dem_type TEXT ENCODING DICT(8),  # elevationが入る
height float,  # 標高が入る
lon float,  # 経度が入る
lat float  # 緯度が入る
);

データ型の選び方に関しては公式ページのドキュメントを参考にして下さい。
https://www.mapd.com/docs/latest/mapd-core-guide/fixed-encoding/
カラムの順番は自作したcsvデータに依存して書いています。
 
このsqlをcreate_table_dem.sqlというファイル名で保存しておきます。
 

データをデータベースに入れる

MapDサーバーを起動

$ ./startmapd <option>

MapDにテーブルを作ります

$ mapdql -p(pass) < create_table_dem.sql

MapDのクライアントを起動

$ mapdql

テーブルの存在を確認

mapdql>\t

テーブルの詳細を確認

mapdql>\d DEM

テーブルが無事にできていたら、データベースにデータを入れます。
今回csvデータにヘッダーがないので以下のように書きます。

mapdql>copy DEM from ‘/Path/ファイル名’ with (header=’false’);

これでデータが入りました。確認します。

mapdql>SELECT * FROM DEM limit 5;
dem_type|height|lon|lat
elevation|4.230000|135.103561|34.251999
elevation|4.110000|135.104660|34.256279
elevation|4.630000|135.100494|34.254833
elevation|4.200000|135.103607|34.251999
elevation|4.710000|135.100555|34.254833

 
ちゃんと入ってますね。
 

MapD Immerseで可視化する

テーブル作成からチャートの作成まで

ログインできたら、右上の「New Dashboard」からダッシュボードを作成します。
次の画面では接続するデータベースのテーブルを選びます。
画面の左側に、MapDのテーブルの一覧が表示されるはずです。
 
接続するとまずAdd Chartのみ表示された画面に移動します。
Add ChartでChartを追加します。
 

上のような画面に移動します。
上の欄から形式をPOINT MAPに指定します。
 


この画面でまず、左の欄から経度(Lon)と緯度(lat)に相当するカラムを指定し、
Color のところにheightを入れてみます。
 

 
出来ました!
 
 

グラフを作成し、地図と連携する

次にデータをグラフ化します。棒グラフを作成します。

左上で幾つの棒グラフに分けるか決められます。
どこからどこまで(標高なら0m~1118mまで)のデータを使うかも決められます。
 

左下では、棒の長さに対して値を振ることを決めることができます
色の濃淡に対して標高を振ることも可能です。
 
そして棒グラフの中から特定の標高を選択して、
該当する標高だけを表示させることも可能です。
今平地以外の範囲(0m ~ 93.17m以外)を選択しました。
その結果が地図にも反映されています。
 


 
 

プロットした点にポップアップで情報を与える

ズームしてみると一つ一つが小さな点データです。

設定画面の右下にポップアップボックスがあるので、
掲載したい情報を決めることができます。


 

これで点データにカーソルを合わせるだけで、データの詳細が一緒に表示できるようになりました。

皆さんも利用してみてください。

MapDで流れてくるデータを取り込んで可視化してみた

$
0
0

Stream Dataを取り込みたい

Stream Dataとは絶えず流れてくるデータのことです。
MapDにStream Dataを取り込んで、リアルタイムに可視化できるか?
今回はこれを試してみます。

StreamInsertとは

https://www.mapd.com/docs/latest/mapd-core-guide/loading-data/

StreamInsertとはMapDが用意している、Stream DataをMapDデータベースに入れるためのプログラムです。使い方は上記の公式URLに載っています。

以下はその構文です。

<data stream> | StreamInsert <table> <mapd database> --host <host name> --port <port number> -u <mapd_user> -p <mapd_pwd> --delim <field delimeter> --batch <batch number>

馴染みのなかったものだけ説明を加えます。
<data stream>標準出力に書き込まれるStream Dataです。
--delimには区切り文字を指定できます。csvファイルを指定するときは’,’を指定します。
--batchにはMapDに取り込む単位行数を指定できます。

少々わかりづらいかもしれませんので、実際に動かした様子をお見せしながら説明します。

実験方法

テーブルの用意

今回は簡単な実験にします。

MapDには以下のようなテーブルを用意してあります。

CREATE TABLE DEM (
dem_type TEXT ENCODING DICT(8),
height FLOAT,
lon FLOAT,
lat FLOAT)

DEMは木やビルを含まない標高データを意味していますが、Stream Dataの取り込みが可能かどうかを確認することが目的なので、今回はあまり意識する必要はありません。

Stream Dataの用意

Stream Dataを用意します。pythonで標準出力に書き込むようにしました。
経度、緯度と高さをカンマ区切りで標準出力に書き込みます。
経度と緯度は札幌市を中心に円を描くように計算して出力してみました。
出力されるデータの並びは次のようになります。

'value name', height,  longitude, latitude

作成したPythonコードは次のとおりです。

import math
import time
import sys

step = 40
for i in range(0, step):
    x = 141.345959 + math.sin(2*math.pi*(float(i)/step))
    y = 43.066894 + math.cos(2*math.pi*(float(i)/step))
    time.sleep(5)
    print "elevation," + str(10) + "," + str(x) + "," + str(y)

上記のコードで試したところ、意図したとおりにデータべースにデータが入っていませんでした。挿入されたことをその都度確認するためには、標準出力に書かれたデータをフラッシュする必要がありました。

つぎのコードをprint文の後に加えました。

sys.stdout.flush()

確認手段の用意(MapD Immerse)

データが正しく挿入されていることを確認するために、MapD Immerseを利用します。

MapD ImmerseはMapDに入っているデータを可視化分析するプラットフォームです。

https://www.mapd.com/platform/immerse/

MapD Immerseを使ってDEMテーブルを可視化します。

DEMテーブルのデータの緯度、経度を読み取って地図上に表示します。

結果

以下のコマンドを実行し、その様子をアニメーションgifにしました。

$python circle.py |/SampleCode/StreamInsert DEM mapd --host localhost --port 9091 -u mapd -p [pass] --delim ',' --batch 1

備考

MapD Immerseでは新しく挿入されたデータを反映させるには、マウスで画面をスクロールするなどして、リロードする必要があります。(2017/10/31現在)
リロードなしに、データが反映される機能は近々実装されるようです。

https://community.mapd.com/t/predictive-analytics-and-realtime-refresh/656

気象データをMapDに入れて分析してみた

$
0
0

使用するデータ

今回は気象データをMapDに入れて、分析したいと思います。
気象データは、農業環境技術研究所さんが開発されたgamsDB(Ghg Agro-stat MeteoCrop Soil-information Data Base; 農業環境情報データセンター)で公開されていた降水量の月別平均値を利用しました。

==
大澤剛士氏、神山 和則氏、桑形 恒男氏、 須藤 重人氏、Web APIを活用した農業環境データベースシステムの横断利用、農業情報研究、Vol. 21 (2012) No. 1 P 1-10
https://www.jstage.jst.go.jp/article/air/21/1/21_1_1/_article/-char/ja/
==
入手したデータは次のような形式でした。
左から順に
 標準地域メッシュコード 年 2次メッシュの南西端の緯度 経度 1月のデータ 2月のデータ …12月のデータ
となっています(スペース区切り)。データ量は約30,000地点分でした。

36225717 2010 24.42 122.88 138 61 141 107 55 71 315 211 250 363 169 68
36225718 2010 24.42 122.88 137 61 141 107 54 70 316 211 249 366 169 68
36225724 2010 24.42 122.88 137 61 137 106 54 70 311 210 249 359 167 68

MapDに取り込むにあたり以下のテーブルを作成しました。

CREATE TABLE TM (
date_tm DATE,
lat FLOAT,
lon FLOAT,
temperature FLOAT)

座標(lat, lon)は標準地域メッシュコードから計算して求めました。
計算方法は以下の資料を参考にしています。
http://www.stat.go.jp/data/mesh/pdf/gaiyo1.pdf
これを1地点1か月ごとに1レコードになるように前処理プログラムを作成し、以下のようなcsv形式で出力しました。

2010-01-01,44.607727,142.362198,-8.100000
2010-01-01,39.991554,140.224792,-2.100000
2010-01-01,35.275394,137.799911,-1.100000

出力されたcsvファイルをMapDに”COPY FROM”を使って取り込みます。

特定の月のデータを表示してみる

チャートを用意する

降雨量のデータを可視化してみます。
MapD Immerseを利用し、地図チャートと、月別平均降雨量のチャートを用意しました。
地図チャートではGeo Heatmapを利用しています。Geo Heatmapについては、別のブログで改めて紹介します。


左側には年間の平均降雨量の分布を描画し、右側には全国の月別平均降雨量をチャートにしています。

月別の降雨量を表示する

右側の月別平均降雨量チャートの中から1月だけを選択すると、1月の降雨量の分布を表示できます。

日本海側の豪雪地帯での降雨(降雪)量が非常に多いことがわかります。

複数の月を選択して、その平均を表示することも可能です。

5月、6月、7月を選択した結果です。
台風や梅雨の影響を受ける九州、四国、本州の南側に降雨が多いことがわかります。

地域ごとの降雨量を表示する

続いて地図上で特定の範囲での、降雨量の傾向を見てみます。

これは左側の地図の範囲内での月別平均降雨量を、右側のグラフで表示させています。
スクロールまたは拡大して表示エリアを変更すると、MapDは降雨量を自動で再集計します。
その地域降雨量の傾向が地図とグラフの両方でわかります。

東京近辺と札幌近辺の、月別降雨量の傾向をグラフ化しました。
それぞれの地域での傾向が読み取れると思います。

降雨量のデータは40万件を超えていますが、なめらかに動かすことが出来ました。


今回は1年分のデータでしたが、もっと多くのデータで分析をしてみようと思っています。十数年のデータ、もしくは日ごとのデータを使って何が見えるかもやってみたいです。

「投機的実行予測機能を持つ CPU に対するサイドチャネル攻撃」に対する Insight Qube の対応について

$
0
0

※本情報は、本情報の公開時点において最新です。また、本情報は予告なく変更される場合があります。

1. 「投機的実行予測機能を持つ CPU に対するサイドチャネル攻撃」に対する Insight Qube の対応について

  • 投機的実行機能を持つ CPU に対してサイドチャネル攻撃を行う手法が複数の研究者によって報告されています。当該脆弱性は、悪意あるプログラムが攻撃対象のサーバー上で実行された場合に、本来アクセス権限のないメモリ領域に格納されているデータを参照可能とするものです。
    • データの改ざんの可能性はありません。
    • 攻撃者が外部ネットワーク(インターネット等)からリモートアクセスをするだけではメモリ上のデータを参照する事はできません。
  • 弊社では、各コンポーネント製造元と協力して調査を継続しており、BIOS更新版の準備ができ次第、提供してまいります。BIOS更新版のリリース情報等、Insight Qubeの対応状況については、本ページでも引き続きご案内いたしますが、本件に関してご不明な点などございましたら、お気軽に弊社サポートへご連絡ください。
  • 当該問題に関する共通脆弱性識別子は以下の通りです。
    • CVE-2017-5715、CVE-2017-5753、CVE-2017-5754
      • CVE(Common Vulnerabilities and Exposures)とは、ソフトウェアの脆弱性を対象として、米国政府の支援を受けた非営利団体のMITRE社が提供している脆弱性情報データベースで利用されている識別番号のことです。米国を問わず、様々な団体・企業でこの番号が利用されています。

2. 対処方法

  • 本脆弱性への対応には、BIOSのアップデートとオペレーティングシステム修正パッチの適用の両方が必要となります。
    • BIOSのアップデート(BIOS更新版)
      • BIOS更新版へのアップデートが必要となります。準備できたものより順次リリースしてまいります。
      • BIOS更新版の準備については、現在 Intel 社ならびに MBメーカーと詳細な連絡を取っており、BIOS更新版のご案内が可能になった時点でご案内させて頂きます。
    • オペレーティングシステム修正パッチの適用
      • 既にオペレーティングシステム(OS)各社からOS修正パッチがリリース、あるいはリリース予定となっておりますので、必要なOS修正パッチの適用をご検討ください。
      • 適用に際しては、「3. OS修正パッチの適用について」もご確認ください。
  • この脆弱性を悪意を持って利用するには、ローカルに悪意あるプログラムを動作させる必要があり、攻撃者が外部ネットワーク(インターネット等)からリモートアクセスをするだけでは、データの不正取得等はできません。よってファイアウォール等による脆弱性回避策も併せてご検討ください。

3. OS修正パッチの適用について

4. 対象機種

  • 弊社より提供しているすべての「Insight Qube」

5. DBシステムへの性能面での影響について

  • 弊社では、本脆弱性対策を施したDBシステムにおいてどの程度の速度性能低下が発生するかについて、BIOS等の準備ができ次第、CPU世代別に順次、検証・計測し、弊社HP上にて公開していく予定です。

6. お問い合わせ

  • 本件や対処方法に関する詳細につきまして、以下のお問い合わせ窓口にて対応させていただいています。お問い合わせいただく内容によっては、回答までにお時間をいただく場合がありますこと、予めご了承ください。
    • Insight Qube をご利用いただいているお客様
      • 契約書に記載の「Insight Qube サポートデスク」まで、お気軽にご相談ください。
    • Insight Qube の導入をご検討いただいているお客様・その他のお客様

【本リリースについてのお問い合わせ】

株式会社インサイトテクノロジー マーケティング本部
TEL: 03-5475-1450

異なるデータベース間のデータ同期が出来るわけ (その1)

$
0
0

どんなデータベースがあるの?

2017年のdb tech showcaseでもたくさんのデータベースのテクノロジーを紹介させて頂きました。従来からあるリレーショナルデータベースを始めとしてHadoopのような分散型でスケールアウト可能なデータマネージメントシステム、NoSQL系のデータベース、最近では、時系列データベースやGPUデータベースまで多岐に渡ります。



最近、これだけデータベースの種類が増えている理由の1つは、IoTのような、従来では捨てられていたようなデータを大量に処理する基盤が必要になってきたことがあるように思います。では、このように多岐に渡るデータベースでは、それぞれ別のデータを関係無く保持しているのでしょうか?そうでは無いと思います。同じデータを用途によって異なるデータベースに配置することも多くあります。従来からあるDWHでも、基幹システムのデータを分析システムへ取り込むことを行っていました。しかし、その取り込みは、夜間バッチやCSVファイルをデータローダーによってデータ連携を行っているケースがほとんどでした。

分析データ容量も多くなく、データの鮮度(分析対象データの時間的新しさ)が問題にならなければ、従来の手法でも大丈夫です。しかし、昨今のビックデータはIoTなどから生まれるデータが分析の対象となっており、1週間前や前日のIoTデータの分析を行っても分析自体に意味が無いケースが多くなっています。今発生していることに対して素早くアクションを起こすことがビジネスで重要なポイントになりつつあります。

では、どうすれば良いでしょうか?
必要なデータを適切なデータ処理基盤(データベース)に素早く取り込み、結果を得る。このために最近必要性が高まっているのがレプリケーションツールです。レプリケーションツールは、昔から存在していましたが、その用途はDR(災対対策)だったり処理分散のためでした。しかし、最近データレプリケーションツールは、多岐に渡るデータ分析基盤間でのリアルタイムのデータ連携のために使用されることが急速に増えています。

データレプリケーションツール「Attunity Replicate」

弊社でもデータレプリケーションツール「Attunity Replicate」を扱っています。従来型のデータ連携方式と比較すると、データ連携をリアルタイムに実行することで、データ連携の遅延を小さくすることが出来ることと、データ連携の実装が容易に出来ることが大きな特徴です。



Attunity Replicateは、ロジカルレプリケーションと呼ばれる手法でデータ連携しますが同様の製品としては、Oracle社の「GoldenGate」やQuest社の「SharePlex」などがあります。Attunity Replicateは他社製品と比較してサポートしているデータベースが非常に多いことと、データベースへのエージェントインストールが不要で負荷が低いことが大きな特徴です。

Attunity Replicate製品ページ:www.insight-tec.com/products/Attunity/Replicate



では、このように異なるデータベース間でデータを連携することが出来るのはどうしてでしょうか?
この仕組みを次回以降のブログで少しご紹介したいと思います。

異なるデータベース間のデータ同期が出来るわけ (その2)

$
0
0

ロジカルレプリケーションの仕組み

トランザクショナルなデータベースでは、必ずトランザクションログと呼ばれるデータベースへの変更を記録するファイルが出力されています。これは、トランザクションのロールバックで使用されたり、障害発生時のデータベースのリストアのために使用されています。先述したロジカルレプリケーションは、このトランザクションログの内容を解析して変更された内容をSQLとして連携先のデータベースに伝えることによってデータ同期を行う仕組みです。簡単に言うと「異なる種類のデータベースでも同じSQLを実行していれば、同じデータになります」ということです。

レプリケーションソフトウェアは連携元(ソース)データベースのトランザクションログを解析して変更SQLを抽出し、そのSQLを連携先(ターゲット)データベースで実行するということを繰り返しています。これにより、ニアリアルタイムでのデータ同期を実現しています。


Oracleのトランザクションログに含まれる情報

では、具体的にトランザクションログには、どのような情報が含まれているのでしょうか?
ここでは、代表的なデータベースであるOracleを例にOracleのトランザクションログ・REDOログの内容を解析してみましょう。

Oracleには、REDOログの解析を行うためにLogMinerという機能があるのをご存じだと思います。LogMinerは、データベース上で実行されるすべてのアクティビティの完全な記録であるREDOログの内容を見やすい形で見せてくれます。ただし、REDOログの中にテーブル名やカラム名などのオブジェクト名が含まれている訳ではないのでLogMiner実行時には、データ・ディクショナリにアクセスをして名称などを取得する必要があります。



最終的には、データベースで実行される各論理操作を動的なビューV$LOGMNR_CONTENTSとして確認することが出来ます。このビューの中には、変更のロールバックに使用出来る SQL UNDO文と元の操作が詳細に記述されたSQL REDO文が含まれています。

Oracleのマニュアルによれば、LogMinerで出来ることは、以下とあります。

  • アプリケーション・レベルで発生したエラーなどデータベースの論理的破損が発生した時期を特定。
  • DML文の事後監査、コミットされたトランザクション、アップデートしたユーザー。
  • リカバリを行うために必要なSQLを特定。
  • どの表にどんな更新が多いかなどの統計情報を取得し、チューニング時の優先順位を決定することができる。

LogMinerを使用してトランザクションログを覗く

次に実際にOracleの便利な機能であるLogMinerを使用して、どのような形でトランザクションログの内容が見えるのか確認してみましょう。今回使用したデータは、有名なOracleのデモデータEMP/DEPT/SALGRADE表です。デモデータは、以下のようになっています。


LogMiner検証手順

1. SUPPLEMENTAL LOGGINGの設定

A. 現在の設定状態を確認

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUPPLEMENTAL_LOG_DATA_MIN
------------------------------
NO

B. デフォルトでは無効なので有効化

SQL> alter database add supplemental log data;
データベースが変更されました。

C. 実際に変更されたか確認

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUPPLEMENTAL_LOG_DATA_MIN
------------------------------
YES

2. REDOログ切替

A. 現在のREDOログを確認

SQL> SELECT L.GROUP#, F.MEMBER, L.STATUS 
   FROM V$LOG L, V$LOGFILE F WHERE L.GROUP#=F.GROUP#;
    GROUP#    MEMBER            STATUS
-------------------------------------------------------------------------------------------------------
         1    /oradata/ora11g/redo1/redo01_1.log  INACTIVE
         1    /oradata/ora11g/redo2/redo01_2.log  INACTIVE
         2    /oradata/ora11g/redo1/redo02_1.log  INACTIVE
         2    /oradata/ora11g/redo2/redo02_2.log  INACTIVE
         3    /oradata/ora11g/redo1/redo03_1.log  CURRENT
         3    /oradata/ora11g/redo2/redo03_2.log  CURRENT 

B. REDOログの切替

SQL> ALTER SYSTEM SWITCH LOGFILE;

3. LogMiner起動

A. 分析対象REDOログを指定(今回は、オンラインREDOログ)

SQL> execute dbms_logmnr.add_logfile(logfilename => -
> '/home/ora102/oracle/oradata/ora102/redo01.log' -
> ,options => dbms_logmnr.new);
PL/SQLプロシージャが正常に完了しました。

B. LogMiner起動

SQL> execute dbms_logmnr.start_logmnr(options => -
> dbms_logmnr.dict_from_online_catalog);
PL/SQLプロシージャが正常に完了しました。

これで準備OKです。実際にデータを更新してLogMinerでどのように見えるのか確認してみましょう。
・EMPテーブル更新

SQL> DELETE FROM EMP WHERE EMPNO=7844;
SQL> ROLLBACK;
SQL> UPDATE EMP SET SAL=SAL*1.1 WHERE EMPNO=7844;
SQL> DELETE FROM EMP WHERE DEPTNO=20;
SQL> COMMIT;

・SALGRADEテーブル更新

SQL> DELETE FROM SALGRADE WHERE GRADE=5;
SQL> ROLLBACK;
SQL> UPDATE SALGRADE SET HISAL=20000 WHERE GRADE=5;
SQL> COMMIT;

V$LOGMNR_CONTENTSを参照すると

下表のSQL列が実際に実行したSQLでV$LOGMNR_CONTENTSビューのSQL_REDO列を横に並べました。



実際に実行したSQLとV$LOGMNR_CONTENTSを見比べてみると、全てのSQL_REDOで表現されたSQLは、ROWIDがWHERE句で指定されており、SAL=SAL*1.1のような計算式は、固定値に変換されて生成されています。



DELETE FROM EMP WHERE DEPTNO=20;のような複数のレコードが更新されるようなSQLを実行すると、更新される一行一行を更新するSQLが更新されるレコード数だけ現れました。また、DEPTNO=20としてしかWHERE句で指定していませんが、その他のカラムの条件も付加されて生成されています。

さてこの情報を使って異種データベース間のレプリケーションは、実現出来るでしょうか?
答えは、NOです。なぜなら、こんなSQL文を異種データベースで実行してもエラーになってしまいます。また、ROWIDは、Oracle独自の仮想列で他のデータベースでは使用出来ません。しかし、SQL_REDOでは、ROWIDを使用することで一意に更新するレコードを特定しています。それでは、次回もご期待ください。

異なるデータベース間のデータ同期が出来るわけ (その3)

$
0
0

SUPPLEMENTAL LOGGINGって何?

実は、レプリケーションソフトで異種データベースへデータ連携を行う場合には、追加のサプリメンタル・ロギングが必要になります。以下のように追加のサプリメンタル・ロギング設定が必要な理由がマニュアルにも記述されています。


再構築されたSQL文を別のデータベースに適用するアプリケーションでは、行を一意に識別する列(主キーなど)で更新文を識別する必要があります。
ROWID はデータベースごとに異なり、他のデータベースでは意味を持たないためV$LOGMNR_CONTENTS ビューによって返される再構築されたSQL に示されるROWID では識別できません。

やはり、ROWIDでは、他のデータベースへの連携が難しいとあります。
そこで必要になるのが追加サプリメンタル・ロギングです。この追加サプリメンタル・ロギングは、異種データベース間で一意にデータを特定して更新情報を連携するためにプライマリキーが存在すれば、プライマリキーを指定して一意にデータを特定出来るようにトランザクションログにプライマリキー情報を追加します。プライマリキーが無い場合には、全カラムの条件を付加するように設定を行います。ただし、SQL文でデータ連携している以上、ロジカルレプリケーション対象テーブルでは、プライマリキーは「必須」と考えた方が良いと思います。なぜなら、プライマリキーがあれば、直ぐにデータを見つけて更新処理を実行することが出来ますが、プライマリキーが無い状態だとインデックス検索、さらにインデックスも無い場合には、フルスキャンになってターゲットデータベースへの反映に時間がかかり過ぎて同期処理が追いつかない可能性があるからです。

4. サプリメンタル・ロギングの設定

A. 現在の設定状態を確認

SQL> SELECT LOG_GROUP_NAME, TABLE_NAME, ALWAYS, 
   LOG_GROUP_TYPE FROM USER_LOG_GROUPS;
レコードが選択されませんでした。

B. デフォルトでは設定されていないので有効化

SQL> ALTER TABLE EMP ADD SUPPLEMENTAL LOG DATA(PRIMARY KEY) COLUMNS;
表が変更されました。
SQL> ALTER TABLE DEPT ADD SUPPLEMENTAL LOG DATA(PRIMARY KEY) COLUMNS;
表が変更されました。
SQL> ALTER TABLE SALGRADE ADD SUPPLEMENTAL LOG DATA(ALL) COLUMNS;
表が変更されました。

C. 実際に変更されたか確認

SQL> SELECT LOG_GROUP_NAME, TABLE_NAME, ALWAYS, 
   LOG_GROUP_TYPE FROM USER_LOG_GROUPS;
LOG_GROUP_NAME           TABLE_NAME           ALWAYS         LOG_GROUP_TYPE
------------------------------- ----------------------------- -------------------  -----------------
SYS_C004204              EMP             ALWAYS        PRIMARY KEY LOGGING
SYS_C004205              DEPT             ALWAYS       PRIMARY KEY LOGGING
SYS_C004206              SALGRAD           ALWAYS        ALL COLUMN LOGGING

V$LOGMNR_CONTENTSを参照すると(追加設定後)

追加サプリメンタル・ロギング設定後、V$LOGMNR_CONTENTSビューのSQL_REDO列を見てみると、プライマリキー指定したものはプライマリキー、全カラム指定したものは全カラムの条件が付加されて生成されていることがわかります。





もう少し単純化してみます。
追加サプリメンタル・ロギングの設定によるトランザクションログへの出力情報の変化は、以下のようになります。





追加サプリメンタル・ロギングは、異種データベース間でも更新されたデータを特定するために必要ということですね。ここまでトランザクションログに情報が出力されていれば、あとは、不要なROWIDの条件などを取り除いて連携先のデータベース上でSQLを実行するだけです。

Oracle以外でも同じ?

今回は、LogMinerという便利な機能があるのでOracleで確認してみましたが、レプリケーションソフトはOracleだけで使用するものではありません。それでは、その他のデータベースでは、どうでしょうか?
Microsoft SQL Server

PKなしテーブルに対して、変更データキャプチャを構成
■データベースレベルのCDC有効化

EXEC sys.sp_cdc_enable_db

■テーブル毎のCDC有効化(プライマリキー無しの場合)

EXEC sys.sp_cdc_enable_table
@source_schema = N’[SCHEMAname]’,
@source_name = N’[TABLEname]’,
@role_name = NULL

IBM Db2

データ複製に関する追加情報をログに記録することを有効化
■テーブル毎の変更データキャプチャの有効化

ALTER TABLE < name> DATA CAPTURE CHANGES

このように呼び方は、異なるものの同じようにトランザクションログに追加情報を設定する機能は、各RDBMSで備えています。しかし、DWH向けのデータベースであるTeradataやNeteezaなど、この機能を持っていないデータベースもあり、この場合には、変更情報の同期は難しいということになります。まあこれらは、データ同期先になることはありますがデータ同期元になる可能性は少ないデータベースですね。

良くお客様からこのトランザクションログに追加情報(SUPPLEMENTAL LOGGING)を付加したときには、負荷はどうなのか?と聞かれることも多くありますが、今回の検証でもわかりますようにトランザクションログへ出力する情報が増える=トランザクションログのサイズが大きくなることはあります。あとは、情報を付加しますのでCPUの負荷もあります。ただし、実際に弊社で検証したところでは、数%以下の負荷でトランザクションログの増大も10%以下といったところで大きな問題になるケースはありませんでした。

Attunity Replicate

最後に弊社取り扱いレプリケーション製品Attunity Replicateですが、LogMinerを使用してレプリケーションすることもできるのですが、LogMinerは非常に負荷が高く遅いので、REDOログを直接読み込んで解析するレプリケーション方式を採用し、これにより低負荷で高速なレプリケーションを実現することも可能です。

最近では、異種やバージョンの異なるデータベースのミニマムダウンタイム移行や、データ分析基盤へのリアルタイムデータ連携の事例も多くなってきました。以前とは、データベースが担う役割も処理内容も変わってきました。様々なデータ処理基盤を活用するためにデータレプリケーションというテクノロジーを検討してみてはいかがでしょうか?


Viewing all 48 articles
Browse latest View live