Zabbix の DB を MySQL から PostgreSQL に移行する #2

MySQL の DB からデータを取り出す

 

mysql の DB から zabbix のデータを取り出し、それを PostgreSQL に取り込みます。

というわけで mysql からデータを取り出すところについて。

mysqldump で取り出すのですが、便利なオプションがあります。

 

# mysqldump --compatible=postgresql --no-create-info --skip-quote-names --skip-add-locks zabbix

 

この --compatible=postgresql で、 postgresql で使えるタイプの SQL を吐いてくれます。

TABLE の CREATE は要らないので、単純にデータの INSERT ばかりのものをつくります。

さて、上記コマンドで抜き出したデータを PostgreSQL にそのまま取り込もうとしても取り込めません。

一つは外部キー制約。今回のデータの取り込みは DB のリストア的なモノでは無く、単純に INSERT 文をデータの数だけ発行するわけですから外部キー制約があればその影響を受けます。よって、データを用意する順番が重要です。外部キー制約を受けるテーブルにデータを戻すのを後回しにしないといけません。この順番を試行錯誤します。

もう一つは文字列のエスケープ方法。postgresql に合ったエスケープ方法で文字列を記述する必要があります。

それをふまえて1行で書くとこんな感じになりそうです。テーブル名の順番が大事です。後半はわりとどうでも良いです。前半の順番が大事そうです。

 

# mysqldump --compatible=postgresql --no-create-info --skip-quote-names --skip-add-locks zabbix \
hosts valuemaps users interface items applications auditlog drules regexps triggers usrgrp \
actions graphs conditions groups dchecks events expressions functions globalmacro \
graph_discovery graph_theme graphs_items config help_items history history_str history_uint \
hosts_groups hosts_templates ids auditlog_details item_discovery items_applications \
mappings media_type operations opgroup opmessage opmessage_grp optemplate profiles screens \
screens_items scripts sessions sysmaps sysmaps_elements trends trends_uint trigger_depends \
trigger_discovery user_history users_groups | sed "s/\\\'/\'\'/g" > outfile.dmp

 

これで outfile.dmp に、PostgreSQL で使えるタイプの SQL 文が生成されているかと思います。

さて上記コマンドでやたら延々とテーブル名を列挙したのですがこれで全部ではありません。他にも zabbix DB にはテーブルがあります。僕の環境ではここに書いてないテーブルはデータを持っていなかったので(0件だったので)移行しませんでした。

それぞれ使用環境に応じて移行対象のテーブルを決めれば良いと思います。