【手軽&確実】DBのテーブルのバックアップを即座に作成するSQL

【手軽&確実】DBのテーブルのバックアップを即座に作成するSQL

こんにちは。
今日は、地味によく使う&便利なSQLを紹介します。
テーブルに対してデータの追加や変更、削除などのトランザクションを行う際、
僕が必ず行う手順の一つは、処理対象のテーブルのバックアップを取ることです。

それをする理由は、
言うまでもなく、トランザクションに失敗したり予期せぬ不具合が起こったりした時に
すぐに戻せるようにです。
具体的には、
バックアップを取りたいテーブルと、全く同じ構造とデータを持ったテーブルを作成します。

実際のコード

実行するのは以下の1行だけです。

CREATE TABLE hoge_bk AS SELECT * FROM hoge;

この例では、「hoge」というテーブルと全く同じ構造とデータを持った、
「hoge_bk」というテーブルを作成します。

  • hoge_bk ⇨ 作成するバックアップテーブルの名前
  • hoge ⇨ バックアップを取りたいテーブルの名前

バックアップテーブルの名前は、他のテーブルと重複しなければ、何をつけても問題ありません。
個人的には、元のテーブル名の末尾に「bk」と日付をつけるやり方をよくします。
例) hoge_bk_20180505 など

使うのに適している場面と適していない場面

以下のような場面で使うことが多いです。

  • 検証などで、直接SQLを実行してデータの追加、変更、削除をする前
  • 検証用のテーブルを作成したい時
    (構造も全く同じものが作られるため、テーブル作成の手間が省ける)
  • 緊急時の対応など、素早く処理をする必要がある場面

逆に以下のような場面には適していません。

  • 検証ではなく、システム上の更新処理時
    ※つまり、必要な時に随時行うのではなく、常時繰り返し処理をする場合。
     その場合は、データの変更履歴を取るテーブルを設計し、そこに更新すべき
  • DB全体、あるいは複数のテーブルのバックアップを取りたい場合。
    この場合は、手間がかかるので、DB全体のエクスポート処理を実行する方が楽だと思います。


つまり、ここで紹介した方法は、あくまで
データの検証時に、
誤ってデータを壊した場合に即座にデータを戻すためのバックアップをとるイメージです。
「hogehoge.txt」というテキストファイルをコピーして
「hogehoge(コピー).txt」という名前で保存するのと同じ感覚です。
複数のテーブルのバックアップを
定期的に繰り返し取るような場面では、逆に手間がかかるため、別の方法がいいかもしれません。

まとめ

単体のテーブルを手軽で確実な方法でバックアップを取りたい場合は、
この処理はオススメです。
手軽で確実というのは、緊急時の対応など、素早く処理をする必要がある場面で
かなり重要になってきます。

覚えておいて損はないと思います。