手軽にPostgreSQLからMysqlへデータを移行する

HerokuはRDBとしてPostgreSQLが無料で利用できます。が、我々SonicGardenはSKIPの開発を通してAmazonEC2 - Linux - MySQL - Ruby on Rails での開発が中心としてやってきました。

youRoomは初期段階まずはheroku上に構築し、その後コスト面からSonicGardenが得意EC2に移動しました。その際、DBをPostgreSQLのままEC2上に移動しました。

しかし、MySQLの方が運用ノウハウもあるということから、PostgreからMySQLへの移行を検討していますが、ダンプを直接IN/OUTすると、バイナリデータなどがうまく動かないなど問題がありました。

そこで、tapsというrubyのツール/ライブラリを利用してデータをPostgreSQLからMySQLへの移行を試してみました。これは、herokuのgemでも利用されているライブラリで、ローカルの環境からHerokuのDBへデータ移行を行う際にも内部で利用されます。

http://github.com/ricardochimal/taps

実際に、成功した例を以下に紹介します。

まずは、以下のコマンドでインポートするmysql側にアクセスする口をHTTPで用意します。

taps server mysql://root@localhost/youroom_development?encoding=utf8 mataki pass

上のコマンドで開けたHTTPに対して、以下のコマンドでPUSHします。

taps push postgres://postgres@localhost/youroom_development http://mataki:pass@localhost:5000

上の例では、同じサーバ上でデータをやり取りして、コンバートしましたが別サーバで通信することもできます。なのでHTTPで通信するようにしているんでしょうね。内部は、sinatraを利用していたりするのでソースを見てみるのも面白いかと思います。

注意点としては、

  • encodingを設定しないと文字化けしちゃう
  • zshだとencodingを含む場合コマンドがうまく認識してくれない
    • bashに切り替えて実行した