ZABBIX2.0のデータベースのテーブルの親子関係について

いつもお世話になっております。

ZABBIX2.0のデータベース(データベース名 zabbix)から、イベント、ヒストリ、トレンド、アラームなどを取り除いた
監視設定だけの情報(テーブル)を同じマシン上の別のデータベース(データベース名 zabbix_cfg_backup)にテーブル毎にコピーしようとしています。
目的は、監視設定のみのバックアップです。
なお、zabbix_cfg_backupは、schema.sqlを使ってテーブルを作成しています。

以下のSQL文は、テーブルの作成順に則って作りました。
テーブル毎にINSERT文をを実行するようにしましたが、
いくつかのテーブルには親子関係?があるようで、途中で
”Cannot add or update a child row: a foreign key constraint fails”
というエラーが出て失敗します。

もし、ご存じの方がいらっしゃいましたら、
テーブルの親子関係、もしくは、エラーがでないテーブルコピーの順序をお教えいただけないでしょうか。

なお、1.8系のテーブルでは親子関係は無いようで、テーブル名を辞書順にならべてもすんなりとINSERTができました。

よろしくお願いいたします。

−−−−−−SQL文−−−−−−−−
USE zabbix_cfg_backup;
INSERT INTO maintenances SELECT * FROM zabbix.maintenances;
INSERT INTO hosts SELECT * FROM zabbix.hosts;
INSERT INTO groups SELECT * FROM zabbix.groups;
INSERT INTO screens SELECT * FROM zabbix.screens;
INSERT INTO screens_items SELECT * FROM zabbix.screens_items;
INSERT INTO slideshows SELECT * FROM zabbix.slideshows;
INSERT INTO slides SELECT * FROM zabbix.slides;
INSERT INTO drules SELECT * FROM zabbix.drules;
INSERT INTO dchecks SELECT * FROM zabbix.dchecks;
INSERT INTO applications SELECT * FROM zabbix.applications;
INSERT INTO httptest SELECT * FROM zabbix.httptest;
INSERT INTO httpstep SELECT * FROM zabbix.httpstep;
INSERT INTO interface SELECT * FROM zabbix.interface;
INSERT INTO valuemaps SELECT * FROM zabbix.valuemaps;
INSERT INTO items SELECT * FROM zabbix.items;
INSERT INTO httpstepitem SELECT * FROM zabbix.httpstepitem;
INSERT INTO httptestitem SELECT * FROM zabbix.httptestitem;
INSERT INTO media_type SELECT * FROM zabbix.media_type;
INSERT INTO users SELECT * FROM zabbix.users;
INSERT INTO usrgrp SELECT * FROM zabbix.usrgrp;
INSERT INTO users_groups SELECT * FROM zabbix.users_groups;
INSERT INTO scripts SELECT * FROM zabbix.scripts;
INSERT INTO actions SELECT * FROM zabbix.actions;
INSERT INTO operations SELECT * FROM zabbix.operations;
INSERT INTO opmessage SELECT * FROM zabbix.opmessage;
INSERT INTO opmessage_grp SELECT * FROM zabbix.opmessage_grp;
INSERT INTO opmessage_usr SELECT * FROM zabbix.opmessage_usr;
INSERT INTO opcommand SELECT * FROM zabbix.opcommand;
INSERT INTO opcommand_hst SELECT * FROM zabbix.opcommand_hst;
INSERT INTO opcommand_grp SELECT * FROM zabbix.opcommand_grp;
INSERT INTO opgroup SELECT * FROM zabbix.opgroup;
INSERT INTO optemplate SELECT * FROM zabbix.optemplate;
INSERT INTO opconditions SELECT * FROM zabbix.opconditions;
INSERT INTO conditions SELECT * FROM zabbix.conditions;
INSERT INTO config SELECT * FROM zabbix.config;
INSERT INTO triggers SELECT * FROM zabbix.triggers;
INSERT INTO trigger_depends SELECT * FROM zabbix.trigger_depends;
INSERT INTO functions SELECT * FROM zabbix.functions;
INSERT INTO graphs SELECT * FROM zabbix.graphs;
INSERT INTO graphs_items SELECT * FROM zabbix.graphs_items;
INSERT INTO graph_theme SELECT * FROM zabbix.graph_theme;
INSERT INTO help_items SELECT * FROM zabbix.help_items;
INSERT INTO globalmacro SELECT * FROM zabbix.globalmacro;
INSERT INTO hostmacro SELECT * FROM zabbix.hostmacro;
INSERT INTO hosts_groups SELECT * FROM zabbix.hosts_groups;
INSERT INTO hosts_templates SELECT * FROM zabbix.hosts_templates;
INSERT INTO items_applications SELECT * FROM zabbix.items_applications;
INSERT INTO mappings SELECT * FROM zabbix.mappings;
INSERT INTO media SELECT * FROM zabbix.media;
INSERT INTO rights SELECT * FROM zabbix.rights;
INSERT INTO services SELECT * FROM zabbix.services;
INSERT INTO services_links SELECT * FROM zabbix.services_links;
INSERT INTO services_times SELECT * FROM zabbix.services_times;
INSERT INTO icon_map SELECT * FROM zabbix.icon_map;
INSERT INTO icon_mapping SELECT * FROM zabbix.icon_mapping;
INSERT INTO sysmaps SELECT * FROM zabbix.sysmaps;
INSERT INTO sysmaps_elements SELECT * FROM zabbix.sysmaps_elements;
INSERT INTO sysmaps_links SELECT * FROM zabbix.sysmaps_links;
INSERT INTO sysmaps_link_triggers SELECT * FROM zabbix.sysmaps_link_triggers;
INSERT INTO sysmap_element_url SELECT * FROM zabbix.sysmap_element_url;
INSERT INTO sysmap_url SELECT * FROM zabbix.sysmap_url;
INSERT INTO maintenances_hosts SELECT * FROM zabbix.maintenances_hosts;
INSERT INTO maintenances_groups SELECT * FROM zabbix.maintenances_groups;
INSERT INTO timeperiods SELECT * FROM zabbix.timeperiods;
INSERT INTO maintenances_windows SELECT * FROM zabbix.maintenances_windows;
INSERT INTO regexps SELECT * FROM zabbix.regexps;
INSERT INTO expressions SELECT * FROM zabbix.expressions;
INSERT INTO nodes SELECT * FROM zabbix.nodes;
INSERT INTO node_cksum SELECT * FROM zabbix.node_cksum;
INSERT INTO ids SELECT * FROM zabbix.ids;
INSERT INTO proxy_history SELECT * FROM zabbix.proxy_history;
INSERT INTO proxy_dhistory SELECT * FROM zabbix.proxy_dhistory;
INSERT INTO service_alarms SELECT * FROM zabbix.service_alarms;
INSERT INTO autoreg_host SELECT * FROM zabbix.autoreg_host;
INSERT INTO proxy_autoreg_host SELECT * FROM zabbix.proxy_autoreg_host;
INSERT INTO dhosts SELECT * FROM zabbix.dhosts;
INSERT INTO dservices SELECT * FROM zabbix.dservices;
INSERT INTO escalations SELECT * FROM zabbix.escalations;
INSERT INTO globalvars SELECT * FROM zabbix.globalvars;
INSERT INTO graph_discovery SELECT * FROM zabbix.graph_discovery;
INSERT INTO host_inventory SELECT * FROM zabbix.host_inventory;
INSERT INTO housekeeper SELECT * FROM zabbix.housekeeper;
INSERT INTO images SELECT * FROM zabbix.images;
INSERT INTO item_discovery SELECT * FROM zabbix.item_discovery;
INSERT INTO profiles SELECT * FROM zabbix.profiles;
INSERT INTO sessions SELECT * FROM zabbix.sessions;
INSERT INTO trigger_discovery SELECT * FROM zabbix.trigger_discovery;
INSERT INTO user_history SELECT * FROM zabbix.user_history;

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー fuyuo の写真

自己レスです。

その後、あれこれやってみましたが、INSERTで発生するエラーが避けられず、方針を変更しました。
データベースの複製を作るのではなく、直接必要なテーブルのみファイルにダンプするようにしました。

以下のシェルスクリプトを実行すると、監視設定のみが含まれるダンプファイルが出来ているようです。
これをまっさらなZABBIX2.0のデータベースに流し込めばOK? だと思うのですが・・・

ヒストリやイベントが含まれるダンプファイルはあまりにも巨大で、デイリーのバックアップでその扱いに困っています。
監視設定のみのバックアップでよい方法をご存じの方がいらっしゃいましたら、ご教授いただけましたら幸いです。

−−−−−−−−−−−−−−−以下、シェルスクリプト−−−−−−−−−−−−−−−−−−−−−−−−−−
#!/bin/sh

if test -f ./zabbix_config_`date '+%y%m%d'`.dump then
rm ./zabbix_config_`date '+%y%m%d'`.dump
else
touch ./zabbix_config_`date '+%y%m%d'`.dump
fi

mysqldump -uユーザー名 -pパスワード zabbix maintenances >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix hosts >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix groups >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix screens >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix screens_items >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix slideshows >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix slides >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix drules >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix dchecks >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix applications >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix httptest >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix httpstep >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix interface >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix valuemaps >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix items >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix httpstepitem >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix httptestitem >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix media_type >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix users >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix usrgrp >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix users_groups >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix scripts >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix actions >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix operations >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix opmessage >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix opmessage_grp >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix opmessage_usr >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix opcommand >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix opcommand_hst >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix opcommand_grp >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix opgroup >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix optemplate >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix opconditions >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix conditions >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix config >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix triggers >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix trigger_depends >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix functions >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix graphs >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix graphs_items >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix graph_theme >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix help_items >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix globalmacro >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix hostmacro >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix hosts_groups >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix hosts_templates >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix items_applications >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix mappings >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix media >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix rights >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix services >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix services_links >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix services_times >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix icon_map >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix icon_mapping >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix sysmaps >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix sysmaps_elements >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix sysmaps_links >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix sysmaps_link_triggers >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix sysmap_element_url >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix sysmap_url >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix maintenances_hosts >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix maintenances_groups >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix timeperiods >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix maintenances_windows >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix regexps >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix expressions >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix nodes >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix node_cksum >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix ids >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix proxy_history >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix proxy_dhistory >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix service_alarms >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix autoreg_host >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix proxy_autoreg_host >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix dhosts >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix dservices >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix escalations >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix globalvars >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix graph_discovery >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix host_inventory >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix housekeeper >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix images >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix item_discovery >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix profiles >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix sessions >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix trigger_discovery >> ./zabbix_config_`date '+%y%m%d'`.dump
mysqldump -uユーザー名 -pパスワード zabbix user_history >> ./zabbix_config_`date '+%y%m%d'`.dump

広瀬です。

http://www.zabbix.jp/node/1703

上記の投稿でも書かせてはいただきましたが、バックアップ目的であるならばスレーブ方式を採用した方が
よいかとは思います。最低限サーバが2台は必要になってしまいますが・・・(インスタンス複数作るなら別ですが)

また、mysqldump ~ > dumpファイル名ではInnoDBでは行単位のロックがかかってしまうので、最低限、
--single-transactionのオプションの指定はすべきだとは思います(でないと、戻す際にテーブル間のデータに違い
が残り、エラーがでる原因になると思います)。
なお、特定テーブル以外をdumpしたい場合には、オプションに「--ignore-table=除外テーブル名」を除外したいテ
ーブル分指定することで、もう少し上記のスクリプト簡略化出来るのでは・・・?

弊社では、ZABBIX Server部分(要するにWebUI)とDBを物理的に分け、4台構成です。

・Zabbix Server部分にHeartbeatで冗長化
・Zabbix DB部分にもHeartbeat+DRBDで冗長化
・MySQLのスレーブ機能でほぼリアルタイムのデータ同期(MySQL5.5なので準同期レプリ使えますし・・・)
・DB本体はスレーブDBを毎日バックアップ

とまぁ、なかなかに手厚い構成です(他基幹系DBも似た構成です)。

ダンプ以外の手法も検討されてはいかがでしょうか?(一番楽なのはスレーブ方式かな・・・)
スレーブではデータの整合性の手法がまだ未確立なので、Maatkitなどで担保するとよいかと。

ユーザー fuyuo の写真

広瀬さま

お世話になります。
自分の知識だけでは、このような愚直な方法しか思いつきませんでしたが、
--single-transactionオプションや--ignore-table=除外テーブル名オプションがあるのですね。
これらを使ってスクリプトを書き直してみます。

また、マスタースレーブ方式のバックアップも、検討してみたいと思います。

アドバイスありがとうございました!

ユーザー fuyuo の写真

とりいそぎ、アドバイスをいただいて、スクリプトを書き直しました。
設定のみのバックアップならこれで出来ているようです。
設定のみなら、ダンプはあっという間に終わりました。

-------------------------------------------------------------------------------------------------
#!/bin/sh

mysqldump -uユーザー名 -pパスワード --single-transaction --ignore-table=zabbix.alerts --ignore-table=zabbix.history --ignore-table=zabbix.history_sync --ignore-table=zabbix.history_uint --ignore-table=zabbix.history_uint_sync --ignore-table=zabbix.history_str --ignore-table=zabbix.history_str_sync --ignore-table=zabbix.history_log --ignore-table=zabbix.history_text --ignore-table=zabbix.events --ignore-table=zabbix.trends --ignore-table=zabbix.trends_uint --ignore-table=zabbix.acknowledges --ignore-table=zabbix.auditlog --ignore-table=zabbix.auditlog_details zabbix > ./zabbix_config_`date '+%y%m%d'`.dump

ユーザー kodai の写真

設定のみのバックアップを取るのは上記で問題ないんですけれど、リストアするときには存在するitemidとhistory/trends系テーブルに存在するitemidの整合性が取れているかどうか注意してください。

整合性が取れていないと、アイテムとヒストリデータの食い違いが発生したり、削除されずに残り続けるヒストリデータが出てしまう可能性があります。

ユーザー fuyuo の写真

kodaiさん

先日のセミナーでは質問にお答えいただいてありがとうございました。
アドバイスありがとうございます。ヒストリーデータが存在するデータベースにリストアする場合は注意するようにいたします。

今後ともよろしくお願いいたします。

fuyuo