手動でのデータ更新ミスを防ぐ方法

はじめに

サービスの運営に関わっていると、SQLなどで直接データをいじる機会が多いと思います。
最近かかわっているサイトで、作業ミスがあり復旧作業に時間をとられるということがあったので少し自分なりに考えてみました。
サービスの規模にもよるので何がいいのかは一概にはわかりませんが、そこそこ売上もあってミスるとヤバいくらいの規模という表現くらいの規模で考えてみます。

ちなみに普段はmysqlを使っているのでその前提で考えさせていただきます。
また、今回はマシンの故障によるものではなくて人的ミスに対するものを考えています。
また、サービスを止めるほどの規模ではなくてサービスを稼働させたまま作業する場合について考えています。

データ更新の手段

いろいろあるとは思いますが、とりあえずぱっと思いつくのは以下です。

  • 管理画面からの更新
  • phpMyAdminなどのGUIデータベースツールを使っての更新
  • sqlコマンドによる更新

システム自前の管理画面から更新できるのであれば、そこから更新するのが1番確実かと思います。まぁこれ作るのにお金と時間を使ってるわけで当然と言えば当然ですが、、、
次にphpMyAdminなどのGUIツールを使っての更新ですが、僕はわりとこれを使っていてとても重宝しています。
直感的にわかりやすいし、データの更新も基本的に1レコード単位なのでミスっても大事になりずらいので。
最後にsqlコマンドによる操作ですが、これが1番事故りやすいのではないでしょうか、、、
update文でwhereをつけわすれたら影響範囲は1テーブル全てになってしまうし、極力避けたいと個人的には思っています。

手動でのSQL操作での事故を防ぐには

これは基本的に手作業になってしまうので、どんなに注意してもミスるときはミスることはあると思います。
で、ミスったときにリカバリする術を用意しておくにつきるのではないかなぁと
で、思いつく手段としては作業前に以下のようなバックアップをとることでしょうか

1. データベースまるごとバックアップ
2. テーブル単位でのバックアップ
3. レプリケーションを利用したバックアップ

1、2についてはほぼ同じでバックアップを取ってから作業するということになります。
ミスったらバックアップから元にもどせばいいので簡単なんですけど、データ量が多いとバックアップとる時間がけっこうかかってしまう。
mysqldumpとかつかったらテーブルにロックがかかってしまうので稼働中のサービスにも影響がでてしまうというのが、ある程度の規模のサイトでは難しいのかなと。

結論

で、個人的には3の方法が1番現実的かと思います。
手順としては普段からレプリケーションをとる設定にしておきます。
で、実際にデータ更新などの作業が発生する前に一時的にレプリケーションの対象から外します。
データ更新作業を行ってひととおり確認がおわったらレプリケーションの対象にもどす。という形が1番いいのではないかなぁと

レプリケーションの対象に戻す前にこれのスナップショットをとっておくなどもしておいたほうがいいかと思います。
こう書いてみるとあまり大したこと言ってないんですけど、実際にことがおきたので1番いい手段を自分なりに考えてみましたのでメモしておきました。

以上です