■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件だったので)移行しませんでした。
それぞれ使用環境に応じて移行対象のテーブルを決めれば良いと思います。