質問: 仕事でRubyOnRailsのアプリを作っています。 今まで画面から編集できなかったテーブルに対し、 1行特異なレコードを追加し、そのレコードを画面から編集できるようにしたいと考えています。 あまり変更されることのないレコードではあるはずですが、 ロックをしないのも不安感があり、ロックをかけたいのですが、該当テーブルにはlock_versionがありません。 稼働中アプリのテーブル(既存レコードは約30万件程)にカラムを追加することに対して不安感があるのですが、 default値を設定してやれば問題ないのではないかという気もしています。 初心者で、想定できることが少ないため、 カラムを追加することに対してのリスクをお伺いできればと思います。 (1行のレコードの為にカラムを追加するより、 不格好ではありますが、読み込んだ時の値をwhere句に設定して、ロックの代わりとするという方法もあるのかなと考えています) どうぞよろしくお願いいたします。
回答: まずはローカルの開発環境で検証しましょう。 聞いた限りの情報ではカラム追加で良いと思います。 回答としては、カラム追加で良いという事になりますが、重要なのはどの方法を採用するにしてもいきなり本番で作業しないという事かなと考えます。 もし、自分がやるならこんな感じで作業するかなというものを書いてみました。 少し大げさというか面倒に感じるかもしれませんが、一般的にはこうだよねというのを書こうとすると、どうしても色々書かなければいけませんw **1. ローカルの仮想マシンで検証する (developmentモード)** 注意点として少ないレコード数だと検証にならない事です。 可能ならば、本番のDBのダンプデータをそのままローカルのDBにリストアできると良いです。 内製での開発や、個人情報とか含まれていないようなDBなら可能なはず。 それが無理なら、本番環境と同じ件数のレコードを適当な値で生成してINSERTしましょう。 それが完了してから、作業内容を手順化しましょう。 **2. 作業手順をコマンドレベルで文書し、ローカルでリハーサルをする (productionモード)** 箇条書きでもいいですが、コマンド(rails db:migrateとか)を書いておくとなお良いかと。 口述するメンテナンス表示など、rails以外の作業も含めてメモにしておきましょう。 本番と同様にWebサーバ(Apacheなど)とproductionモードでrailsを動かすユーザを作成して、検証します。 PCのhostsファイルを書き換えて、本番環境のURLでローカルの仮想マシンにアクセスするようにしておきます。 検証が済んだら、hostsファイルは元に戻します。 それから、Webサーバ側の設定でどのURLにアクセスされてもメンテナンス中ですと表示する設定も用意しておくべきでしょう。 その設定方法もいきなり本番でやるわけにはいかないので、ここで確認しておきます。 ※少し面倒ですが、仕事でやっているのならばミスしない事のほうが面倒なことより重要です。 慣れてくるとこのあたりをおざなりにする、いきなり本番で作業してミスをやらかすという事が起きます。 実際に自分も何度か慢心からやってしまった事があり、反省しています。 **3. 本番環境で作業** ようやく本番環境での作業ですが、一般に利用者、関係者に向けてメンテナンス時間を事前に告知する事になっていると思いますので、その時間で作業するようにしましょう。 事前の告知が不要であるなら、いきなり作業してもいいでしょう。 * Webサーバの設定を変更し、メンテナンス状態にする (どのURLにアクセスしてもメンテナンス中ですと表示する設定) * DBをバックアップする(mysqldumpコマンド) * 作業手順に従い、本番環境でカラム追加を実施 ※失敗したら、バックアップを使ってDBを元に戻し、最初からやり直す * 動作確認 (Webサーバの設定で自社IPのみ、通常通りアクセスできるようにしておく) カラム追加だけでなく、今回のロック機能についての動作確認含む * メンテナンスページ設定解除