最近やっている開発環境のDataBaseを本番に近づけるやり方

開発用DataBaseを本番と近づけれれば嬉しい。
ただ、仕事のサービスだと結構データ量が多いので実質不可能で辛い問題をなんとかしたいのでここ最近あがいてみたのでなんとなくの範囲でメモってみる。

前置き

ちなみに有名なのはクックパッドの例
開発環境のデータをできるだけ本番に近づける - クックパッド開発者ブログ


これ素晴らしいんだけど、金が結構掛かったりするし本番DBに開発環境から接続できる状態になりそうなので個人的には結構怖かったりして、ちょっと微妙。
それにネットワークつながらない所で開発できないのもいざという時はちょっとヤダ。


となると、ローカルなり共通で使用するDBを用意してそこに本番と同じDBがあれば良いのだけど、やっぱりデータ量で死ぬ。
ちなみにMBPにリストアした時は、3,4日ほど使った。そしてHDD容量の残りはほぼ余裕が無い状態orz。
うーん、悩ましい。

リストア方法

色々考えた結果本番DBのダンプからフィルタリングしてデータ量に制限掛ける方法を採用した。

DBやテーブルについて

本番にデータを合わせるだけでは落とし穴があります。
例えば、カラムの順番だったり、mysqlだとハハパパ問題とか。
Railsのようにmigrationも管理していれば問題なさそうですが、手動でALTER TALBEとかしてませんか?
DataBaseサーバのバージョンは一致してますか? 本番はmysql5.6で開発環境は5.5とかになっていれば最悪バグがでるかもしれません。

きちんと本番と開発環境が同じになっているかをチェックしましょう。
ハハパパ問題だと最悪リストアができないかもしれません。

dump & download

dumpは予め行っていたので今回は何もしなくても良かったです。
scpでダウンロードに1時間ほど。


ただしdump時にこのオプションをつけること。(mysql)

--complete-insert
--single-transaction


できれば、テーブル毎に分けてdumpしていれば扱いやすいとは思う。
DBを一括でdumpしているなら自前でテーブル毎に別ファイルに分離すれば良いだろう。

フィルタリング

まず、不必要なテーブルは必要ないので無視の方向で。ログのようなデータとかどう考えて開発時には必要ないし。
あと、ユーザデータとかローカルですぐに作れるデータも無視で。


次に必要なテーブルでもデータ量はかなり多い。サービスによるけど毎日データがどんどん作られるようなタイプだと半年以上前のデータなんか必要ないだろう。
そういうテーブルはtailとかで最新のデータだけ採用すればよい。


問題は関連テーブルだ。適当に数を間引けば良いという問題ではない。
日付でもフィルタリングを行うという手もあるが、どうしても関連テーブルが抜けて動作に支障をきたす場合もあるだろう。
なので、レストア後に問題のあるデータの削除も必要となるかもしれない。

結果

最終的に3時間程度で本番データに近い環境を作ることができた。
処理データ量は違うので、処理速度などはあてにはならないがそこはコードやSQLを見れば判断できるだろう。できないエンジニアは勉強しましょう。


問題は定期的に本番データと一致させないとダメなので、復旧作業を定期的に行う必要がある。
ここはまだ考えていなくて、まあ1ヶ月に1回とかで復旧すれば良いかなぁとは思っていますが、運用初めたばかりなので正直どうなるかは分かりません。


とは言え開発時に"あああ"とか意味不明なデータを見ることがなくなったので、十分かなぁとは思っています。