小野マトペの業務日誌(アニメ制作してない篇)

はてなダイアリーの閉鎖をうけ、旧ブログ http://d.hatena.ne.jp/ono_matope/ から移行しました。続きは→ http://matope.hatenablog.com/

MySQLでmysqldumpしたバックアップファイルから任意のカラムだけ復元する

またふぁぼったーがバグった。


今回の症状は「favoriteが反映されないというユーザーが頻発」するというもので、俺自身もここ2日間ほど反映されていませんでした。
調べた結果、ふぁぼったーは、クロール対象の母集団数万人の中から毎時70人ずつ、最新のfavorites数をAPIで取得しクロール対象にするかの判断をしているのだけど、ここ数日そのAPIからfavorites数をはじめいくつかの値が欠如していて、fav値の存在チェックをしていなかったクロール対象クローラによって、favorites数がNULL値にされてしまっていた、という原因だったことが判明した。

まあそれはいいんだけど、favorites数の欠如はしばらく直りそうもないので、mysqldumpしておいたDBのダンプファイルから、ユーザーのfavoritesカラムだけを復元する必要が生じた。ダンプファイル自体が巨大すぎてエディタでの編集が困難だったためコマンドラインでの処理を行ったのですが、後の自分ために以下に手順をメモします。

  • mysqldumpで取っていたSQL形式のバックアップファイルから、復元したいテーブル(ここではSEEDUSERテーブル)のINSERT文をgrepで取り出しtest.sqlに出力。

$less favotter_week.27.2008-07-05_04h00m.sql | grep "INSERT INTO \`SEEDUSER\` VALUES" > test.sql

  • INSERT文の末尾に、 ON DUPLICATE KEY句をくっつけ、復元したいカラム(ここではfavoritesカラム)を指定する。

$sed 's/);/) ON DUPLICATE KEY UPDATE favorites=VALUES(favorites);/g' ./test.sql > test2.sql

ここで出力されたtest2.sqlをバックアップ元のデータベースに読ませてやれば、任意のカラム復元ができる。ON DUPLICATE KEY句で指定するカラムを増やせば、一度に複数のカラムを復元可能。
めでたしめでたし。