はじめに
本番環境のデータベースを更新するときは、特に注意を払って行いましょう。
今回は特定のログをINSERTするときの手順です。
手順
1. 手順を明確に決める
今回どのような作業をするのか、メモ書きでも良いので実行手順を明確にしておきましょう。
順番が入れ替わったり、抜け漏れが発生しないように、手順については脳のリソースを使わなくて済むように入念に整理を。
2. インスタンスなどのバックアップを取る
例えばAWSなどでサーバーを運用している場合は、インスタンスのバックアップを取得しておきましょう。
万が一破損してしまっても、インスタンスごと復帰させることができます。
3. データベースのdumpファイルを出力する
念には念を。作業する対象のデータベースのdumpも取得しておきましょう。
こちらのdumpについては、作業終了後も一定期間保存しておくと何かの時に役立ちます。
4. 環境に依存しないINSERT文を用意する
環境に依存しないとは、前提となる環境条件が一切ないことです。
どんな状況であっても、対象のテーブルにそれさえ実行すれば完了するというSQL文を用意しましょう。
例えば以下のような文を指します。
INSERT INTO example_table (user_id, user_name, user_entry_flg, user_entry_date)
VALUES
(123, 'taro', 1, '2024-10-04 00:00:00'),
(1, 'jiro', 0, '2024-10-05 00:00:00');
このINSERT文には、他テーブルからSELECTしたり、別のdumpファイルを参照したりという環境依存がありません。
要するにベタ書きをしようというわけです。
5. すぐに作業を戻せるDELETE文を用意する
今回はINSERT文の話なので、すぐに状態を戻すためにはDELETE文を用います。
こちらも環境依存の無い形で書いていきます。
DELETE FROM example_table
WHERE (user_id, user_name, user_entry_flg, user_entry_date) IN (
(123, 'taro', 1, '2024-10-04 00:00:00'),
(1, 'jiro', 0, '2024-10-05 00:00:00')
);
INSERT文をそのまま利用してDELETE文にしています。
これにより、確実にINSERTした作業のみをロールバックすることができます。
6. 作業ログを取る
最後に、実行した手順ごとに作業ログを書いておきましょう。
何時何分になにをしたか、予定外の作業はしていないかを詳細に書きます。
今後の作業の手助けにもなるはずです。
まとめ
こういった作業は非常に面倒ですが、特に慣れていなかった頃は何度もバックアップに助けられました。
これから作業を控えている人へ参考になれば幸いです。