このすみノート

Webエンジニアが技術や趣味を書くブログです。

Cloud SQLのPITR (point-in-time recovery) を使えば良かったという学びについて

とあるシステムでの話ですが、DBのとあるテーブル(以降、Aテーブルと呼ぶ)において、特定カラム(以降、Bカラムと呼ぶ)の全データを、想定外に書き換えてしまうトラブルが発生しました。

詳細までを書くことは出来ませんが、直接の原因は管理画面の誤操作です。

トラブル解決編

管理画面の誤操作が発覚後、まずはデータ復旧となりました。

最新の日次バックアップから復元DBを作成する

数時間前に取得されていた最新の日次バックアップを使い、日次バックアップから復元DBを新規作成しました。 これにより、データ書き換えのトラブルが発生する前のデータベースを再現します。

復元DBから現行DBへ、AテーブルBカラムのデータを流し込む

復元DBから、AテーブルのBカラムを抽出し、現行DBへ流し込むという作戦です。 これにより、データ書き換えのトラブルが発生する前の、Bカラムデータで上書きします。

復元DBからは、主キー (ID) と対象カラムを抽出したCSV形式のデータを作りました。 そいつをプログラムを使って読み込ませ、現行と差分があればUPDATE SQLを発行し、AテーブルのBカラムを復旧させました。

Bカラムは管理画面からしか更新できないデータだったのですが、日次バックアップ取得時点以降の管理画面操作で、当該カラムを更新する他の作業はなかった事が分かり、復旧完了となりました。 (実際は他にも色々と調査したり、残作業はあったのですが。書けないので割愛します。)

学び編

学びや改善点だらけの気はしますが。

  • (フールプループ) 管理画面の誤操作とは言え、データ検索画面とデータ更新画面の取り違えが原因だったため、少なからずUIには課題がある。
  • (作業体制) 本番環境の管理画面は超重要なので、安易なソロオペ事故の元。可能ならペアオペ体制を組みたい。

その他にも色々と課題が挙がり、それはそれで改善やふりかえりの対象となりました。 その中で、復旧作業において今後悔しているのは、PITRから復旧しなかったことです。

Cloud SQLのPITR (point-in-time recovery) は簡単に使える

Cloud SQLのPITRは、デフォルトで有効パターンも多く、割と気軽に使えます。 また、無効だったとしても、「インスタンスの編集 (Edit) => データ保護 (Data Protection)」から有効に出来ます。 (ただし、有効無効の切り替え時にデータベースが再起動されます)

PITRからトラブル直前のポイントを指定してDBクローンを作成すれば、より直近のAテーブルBカラムからデータ復旧できるというわけです。

Cloud SQLのPITRは、Google Cloud Techの動画が、英語ですが簡潔に解説されています。 5分半の短時間動画で説明できるくらいに、簡単に扱えます。

www.youtube.com

あとがき

Cloud SQLのPITRを有効にしているならば、やらかし及びトラブルからの復旧はPITRがオススメです。 私が管理画面を誤操作したわけではないのですが、当時の私は慌てており、PITRを有効にしていたにも関わらず失念しておりました。

PITRを胸に刻むのと、あとは緊急トラブル時に慌てないよう、データ復旧マニュアルを作るべき。