運用していると、よくDBの構造を変えたくなる(こんな機能を取り入れたいと思い、フィールドを追加したくなる)のですが、うまく本番環境にDB構造の変化を効率良く適用する方法を教えて下さい。
あと、運用中のDBにいきなりphpMyAdmin等でフィールドを追加するのには、どんな問題がありますでしょうか?
現状以下のようなことをしていて、非常に面倒かつ、サーバを停止しなくてはいけません。良い方法があれば教えて下さい。
開発環境
- 開発環境で、DBのフィールドを追加
- PHPで機能を追加
本番環境
- 一旦、本番Webサーバを停止
- 本番DBをバックアップ
- 新しいDBスキームを追加
- DBのリストア
- 新しいPHPコードに更新
- 問題ないか確認
- Webサーバを起動
コメント(3件)
新しいカラムの値が存在しない
状態になる。
カラムの順序を入れ替えないので
あれば通常大きな問題は発生しない。
1. 開発環境で、DBのフィールドを追加
alter で追加
(PHPは修正しない)
2. 追加した状況で機能テスト
3. 問題がなければ、PHPの該当テーブルを
へinsert処理する機能部分を修正
既存のテーブルへ初期値を設定する。
4. 追加した状況で機能テスト
5. PHPの本格修正
6. 追加した状況で機能テスト
-------------------------------------
本番
0. 必要ならメンテー画面に遷移させる
ようにWEBサーバ設定変更WEBサーバ再起動
1. データベースバックアップ
2. 修正対象テーブルを全てlockする。
3. alterでカラム追加
4. テーブルの追加カラムの初期値を設定
5. PHPを入れ替え
6. ロックを解除
7. 必要ならWEBサーバー再起動して通常運用
スクリプト等を事前に用意していれば
0.~7.の作業は非常に短時間で行える。
※:必要なら索引の再作成なども必要
ただし、レコード数が多い時はそれなりに負荷の高い処理である事は覚悟する事。
データ量や大規模に修正をするなら
別テーブルやDBに現在のデータを以降
する方法の方がよいかもしれません。
煩雑に修正があるようであれば
select *等は、事故の元なので
使わない。