MySQL
PostgreSQL
taps

PostgreSQLからMySQLへ(Taps)

More than 1 year has passed since last update.

■背景

今本業を持ちつつも,知人企業のサービスも運用したりしています.
最近AWS,AWSって話が多いですが,実はHerokuも多い(副業で運営しているサイトもHeroku).

今回,知人から依頼されたサイトもサービスイン前ですが,Herokuで構築されていました.
また既に別で開始しているメディアはAWS上とのことで,運用上まとめたいと思い,AWSへに移行をきめました.

Herokuの場合よくあるのですが,DBはだいたいPostgreSQL.一方で既存のメディアはRDS.これも同じにしたいと考え,DB移行をどうするかを検討しました.
(副業のサイトはHeroku+MySQLなので使えないこともない)

■目的

Heroku提供のPostgreSQLからRDSへの移行.

■調査

最初は,PostgreのDumpを取って中身をエディタで書き換え,それをMySQLにインポートしようと思いました.が,よくよく調べてみるとこんなgemが.

taps

これを使えば,簡単にDB移行ができそうです.ただしKnown Issuesにあてはまると使えません.
また一部手動でソースを書き換えました.
参考

■実施

早速DBを移行してみました.実施時間はサービスイン前でデータもほとんどなく,参考になりませんが,準備から実施まで1時間もいりません.

手順

今回行った手順です.
(1) HerokuのPostgreからDumpファイルを取得
コマンドラインならこんな感じ

heroku login
heroku pg:backups capture --app {AppName}
heroku pg:backups --app {AppName}
curl -o latest.dump `heroku pg:backups public-url -a {AppName}`

また接続情報を取得しておく.
もしくは,PGAdminで接続してバックアップファイルを取得してもOK.

(2) 開発用のEC2にSCP
適当なツールでPostgreをリストアするサーバにアップ.

(3) 開発用サーバでPostgreSQLを起動してDBをインポート

1で取得したDumpをインポート.このDBは移行元になります.

(4) 開発用MySQLに移行先のDBを作成
create database {DB_NAME}
これは移行先のDBになります.

(5) taps起動
まずはtapsの起動.HTTP経由でデータをコピーするようです.

taps server postgres://{postgreのユーザ}:{postgreのパスワード}@localhost/{移行元のDB名}?encoding=utf8 {basic認証ID} {basic認証PASS}

この状態で移行先指定のコマンドを実行.

taps pull mysql://{mysqlのユーザ}:{mysqlのパスワード}@localhost/{4で作ったDB} http://{basic認証ID} {basic認証PASS}@localhost:5000

これで移行が始まります.

(6) DBの確認
最後に移行されたDBに接続して,テーブルやINDEX,データなどを確認しておしまい.

■考察

どのクラウドサービスを選ぶかは「慣れている」とか「やってみたい」など色々な理由があると思います.
その中でHerokuの良さは環境をある程度容易に構築できる点ではないかと.ちょっとしたサービスを作って素早く世に出したいと考えるアントレプレーナブルなエンジニアの方たちには,かなり素晴らしいサービスだと思います.

もちろん,サービスが成功し巨大化した場合もHerokuを続ける場合もありますし,違うサービスに乗り換えることもあると思います.(すみません,Herokuで大規模サービスを運用した経験がないため乗り換え前提になってしまっています・・・.)

その際ネックになるのがDBに移行ではないかと.
少し前にオンプレからAWSへ移行プロジェクトを行いましたが,やはりネックはDBで・・・.
さらに今回のようなDBMSも変わってしまう移行になると,これは大変な状況で,たまたまサービスイン前だから,片手間でやれた感が強いです.

お金や時間をかけずにフィジビリティスタディではじめつつ,将来の構成も考える必要があるのが,今のWebサービスを作るうえでのたのしさではないかと.