もし間違ってDROP DATABASEしてしまったら

って状況から脱出するというお仕事をしたのでメモ。 DROP TABLE でも、単純に rm してしまったら、でも同じ。今回の状況は次の通り。

  • バックアップなし、レプリケーションもしてないので binlog もない
  • MyISAM が数十テーブル、合計 20GB 弱
  • datadir のパーティションは /dev/sda2, ファイルシステムは ext3

 

 

1. 今すぐパーティションをアンマウント

# umount -f /dev/sda2

次のマウント時にジャーナルやinodeがクリーンアップされてしまうので、再起動とか remount は厳禁。 (ro は大丈夫かも)

一方で今まで動いてた mysql は身動きできなくなってしまうのでこっちも stop する。同じパーティション上に存在する他のテーブルに対する flush されてない変更は失われてしまうけど、それが実行されて上書きされると元も子もないので思い切って止める。

2. 現状を丸々ディスクイメージとして保存

# dd bs=4M if=/dev/sda2 of=/somewhere/image

現状のパーティションをディスクイメージとして、十分容量のあるどこかにまるまるダンプ。

容量が足りない!って時は裏技として dd bs=4M if=/dev/sda2 | gzip -c /somewhere/image.gz とかやって gzip 掛けながらダンプ。今回のだと重複テキストの多いデータベースだったので 500MB ぐらいに縮んだ。

これが完了した時点で、元のパーティションはもう変更されても問題ない。必要であれば remount して、削除してしまった以外のデータベースについて mysql を復活させることができる。ただ、必要がないのであれば umount したまま(止めたまま)にしておいた方が無難。複数 DB をまたいで参照するようなサービスを運用していた場合は、そもそも不整合が発生してしまうので復活させてはいけない。ケースバイケース。

3. extundelete をダウンロード & ビルド

extundelete は、 ext3/4 向けの削除ファイル復元ツール。

Fedora 16 など extundelete をバイナリで取得できるディストリビューションであれば yum なり apt-get なりで導入できる。ただそうでないケースの方が現状多いので、自前でビルドする。基本的に  tar を展開して ./configure && make すればひとまず src の下に extundelete コマンドができるはず。ビルドには e2fslibs などが必要なので、適宜 apt-get するなりなんなりで足す。パッケージが足りてるのにビルドできない!って時はもはや gcc とかが古いので、別の新しい環境に上で作ったイメージをコピーして作業。(今回はそうするために前節のgzipで圧縮、をやった)

一般的に、ファイルを削除してしまった同じ環境上で、新しいツールのインストールやビルドといった write の発生する処理をやるのは怖いイメージがある(自分だけかもしれない)けど、今回はすでにイメージを取っているので何やっても大丈夫。

4. いざ復元

# extundelete --restore-all /somewhere/image

これだけ。その他のオプションは特に要らない。実行すると、カレントディレクトリに RECOVERED_FILES というディレクトリができ、その中にどんどん救出されたファイルが出てくる。すんばらしい。必要であれば削除した日時でフィルタリングしたり、ファイル名を直に指定して復元したりできるので、その辺はドキュメントを参照。

一通り終わってディレクトリを見てみて、 myisamchk *.MYI とか掛けてみる。あれ、 table.MYD not found ? どうもファイルが足りない?

extundelete はどうも 0 バイトのファイルは復元してくれない模様。空のテーブルの MYD ファイルは 0 バイトなので、元々空だったな、と思ったら touch table.MYD とかで作ってしまうのも手。でもどうも違う気がする、場合は次に続く。

5. 漏れたファイルは名前を指定して復元

# extundelete --restore-file path/to/table.MYD /somewhere/image

extundelete でファイル名を直に指定して救出を試みる。どうも restore-all だと見つけきらないこともあり、その場合もこのように直にパスを指定すると救出できた。

今回はこれでひとまず全部問題なく救出できた。あとは myisamchk ( -r なり -o なり ) を掛けて、ユーザー、グループ、パーミッションを確認して元の位置に移動して、 mysql を起動すれば、ジャーン!元通り。お疲れ様でした。

ファイルが足りなかった辺りで、 ext3grep (名前通り ext3 の superblock や inode を探索しつつファイルを救出するツール) も試して手動で辿るってのもやってみたりしたけど、結果的に extundelete の restore-file でも問題なく救出できて、使わなくてもよかったので特に記載せず。 HOWTO の “Manual recovery example” の手順通りにやると色々探索してる感があって面白いので、時間があれば試してみるのもいいかもしれない。ちなみにどちらのツールも、既存のファイルシステムに write する処理はないので live なパーティションで試しても安全です。

Android開発環境の作り方2010

今日現在の Android 開発環境の作り方。 30 分もあれば整えられると思う。

  1. Java 6 SDK をダウンロードしてインストール。
  2. Android SDK をダウンロードして展開。 SDK Manager を起動して、好きな platform (2.2 とか) と USB Driver とか落としてくる。
  3. Eclipse をダウンロードして展開。いっぱいあるけど Java Developers でいいです。
  4. Eclipse の Install New Software  から ADT Plugin を入れる
  5. Eclipse が 3.6 (Helios) の場合、現状の ADT だと補完で 20 秒ぐらい待たされて使い物にならない不具合があるので、ここの手順に従って、 Android の platform/frameworks/base  のコードを Android SDK の platforms/android-x/sources に展開してやる。  Android SDK 2.3 に合わせて公開された ADT 8.0.x で正式に Helios に対応し、 jar の source code attachment も modifiable なったので、ソース置き場はどこでもよくなりました。でも、待たされるのは直ってなかったかも。
  6. Eclipse の Preferences > Android にて、 2. で展開した Android SDK のディレクトリを指定して Apply
  7. 続けて Preferences > General > Workspace で Text file encoding を utf-8 にしておくと後々困らずに済むでしょう。

あとは、この辺のガイド見ながら新規プロジェクト作って Run すれば、もう立派な Android アプリ開発者です。端末を USB で接続して SDK Manager でダウンロードしたドライバを突っ込めば、何も考えずに Eclipse から実機へのインストールとデバッグができるようになります。

というメモ。

最近 Android なコードを書きまくってて、割と日本語の情報どころか、英語の情報も見当たらない壁にぶち当たりまくっているので、  IntentService + ResultReceiver の組み合わせの鉄板っぷりとか、 2.2 以降だったら AndroidHttpClient 使おうぜとか、ちょっと凝った ListView のレイアウトの作り方(オープンソースの是非を問う編)とか、 View の background は色指定のためのものじゃないよとか、 lineSpacing を設定した TextView に画像を突っ込むと画像が下にずれちゃう問題とその対応方法みたいな地味な話とか、そもそも Html#fromHtml は遅いから気をつけようとか、書けるネタはたくさんあるんだけど、ちょっと余裕がない。

フレッツ・スクウェア ネクスト

備忘録。

所用でフレッツ・スクウェアに接続しよう、と、自宅サーバ兼ルータを設定してたのだけど、なぜかうまく接続できない。

PPPoE セッションは確立してて、 IP アドレスが取得できていて、静的ルートも設定しているのだけど、 DNS サーバへの ping が通らない。 tcpdump で見てみたら、

12:18:08.455802 IP 222.224.38.19.domain > 220.210.194.68.domain: 44774+ [1au] A? www.flets. (38)
12:18:08.458278 IP 222.224.0.1 > 222.224.38.19: ICMP host 220.210.194.68 unreachable - admin prohibited filter, length 36

222.224.0.1 が gateway. admin prohibitet filter て。なんでやねんー。と悩むこと小一時間。

なんのことはなくて、フレッツ 光ネクストからはフレッツ・スクウェアではなく、フレッツ・スクウェア ネクストを使えという話でした。別物なのね。

iPhone

7/11に発売なのはいいんですが
SDK が Mac 上でしか動かないという事実に
今更途方に暮れております。

で、最近ひょんなことから海外版 iPhone を借りたので、いろいろ試してました。
以下メモから抜粋。

・基本的には操作体系が統一されていて素敵

・予想通り片手での操作は全然考慮されてない
 - 満員電車でブラウズとか、運転中に選曲とか全然できない
 - なんだかんだでスクロールが面倒
 - 前の画面に戻るためのボタンは、常に画面の左上にあるので指が届かない
 - あと地味に寝転がって操作するのも難易度高い
 - ポケットの中に入れたまま操作ができないのは(音楽プレーヤとして)地味に辛い
・というかいろんな面で割り切られてる
 - 複数タスクを並列するような用途(Web調べながらメモ書く、とか)も切られてる
  - そもそも Copy & Paste とかもない
  - ただし URL をメールで送信する機能はある
・横画面でのキー入力は、慣れればそれなりに高速にできるかも(画面狭いけど・・・)
 - でもやっぱりタッチパネルなので、連打は辛すぎる
  (1回入力するごとに確実に指を離さなきゃいけない)

・基本的に無意味な画面がない(能動的な操作が前提)
 - 携帯でいう待受画面とか、 OSX の Dashboard 的なものがない
 - Wallpaper にあまり意味がない (iPod 再生中 はカバー画像になるし)

・サイレントモード切替が物理的なスイッチなのはいい感じ
 - カメラも無音に! でもさすがに日本じゃ変更されるだろうけど…
 - サイレントにしても iPod の曲は鳴っちゃう…

・それなりに細かい気配り
 - サイドのボリュームキーの割り当てが動的に変わったり
 - 画面消えてる状態でのボタンダブルクリックで、再生中の曲操作ができたり
 - 再生中のダブルクリックはデフォルトをオーバーライドして iPod にできたり

・ネットワーク接続処理を透過的に処理している
 - 操作なしに自動で無線デバイスが on/off され、 AP を見つけて接続。切り替えも高速。

新しいデバイスとして触れるならいいと思うけど、
メールや電車通勤中のブラウズが主な「ケータイ」ユーザには全然向かない

・電話機能もモジュール化されてる印象
・そうか、海外の携帯はふつー Email は無いのか(MMS は?)
・スピーカ内蔵 iPod は素敵
 - イヤホン抜けたまま再生始めちゃうと慌てちゃうけど

・いくら見た目をよくしても Safari の檻の中じゃ限界

聴きたい音楽に辿り着くための効率的な方法

興味があるのちょっと書く。ちなみに全然専門じゃない話題。

でも、リスナー側の視点に立つと、話は少し厄介になる。そうしてフラット化した場所から「聴きたい音楽」「(自分にとって)いい音楽」をどうやって探し出すか。
浸水ノート / 柴那典 終わりの始まりのあとに(2)

ミュージシャンとリスナーの関係がフラットになった環境で、リスナー側から「聴きたい音楽」にたどり着くための手段として、有望なのは Pandora じゃないかなあと思いながら。(現在、 Pandora は日本国内から利用できませんけども)

続きを読む 聴きたい音楽に辿り着くための効率的な方法