MySQLでmysqldumpしたバックアップファイルから任意のカラムだけ復元する
またふぁぼったーがバグった。
今回の症状は「favoriteが反映されないというユーザーが頻発」するというもので、俺自身もここ2日間ほど反映されていませんでした。
調べた結果、ふぁぼったーは、クロール対象の母集団数万人の中から毎時70人ずつ、最新のfavorites数をAPIで取得しクロール対象にするかの判断をしているのだけど、ここ数日そのAPIからfavorites数をはじめいくつかの値が欠如していて、fav値の存在チェックをしていなかったクロール対象クローラによって、favorites数がNULL値にされてしまっていた、という原因だったことが判明した。
まあそれはいいんだけど、favorites数の欠如はしばらく直りそうもないので、mysqldumpしておいたDBのダンプファイルから、ユーザーのfavoritesカラムだけを復元する必要が生じた。ダンプファイル自体が巨大すぎてエディタでの編集が困難だったためコマンドラインでの処理を行ったのですが、後の自分ために以下に手順をメモします。
$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句で指定するカラムを増やせば、一度に複数のカラムを復元可能。
めでたしめでたし。