最近はWeb開発の方が多くなった今日この頃で、データベースのMySQLをよく触ることがあります。そのMySQLが今回初めてクラッシュ(破損)しました\( *o*)/!
下記にその状況と今回行った対処方法をメモ代わりに明記しておきます。
状況
ローカル環境で開発していた今回のシステムはいつもの様にVMware PlayerにCentOSを入れ、LAMP(Linux+Apache+MySQL+PHPの意味)環境で開発を行っていました。
そんな中、データベースの確認を行おうとしてブラウザのFirefox(FF)でphpMyAdminにアクセスし、ログインしました。ログイン後、サイドバーに表示されているデータベースの一覧から該当するデータベースをクリック。通常であれば、そのデータベースの構造等が表示されるのですが、一瞬表示されたあとにログイン画面へ移動してしまいます。
「あれ?」
と思い、再度、ログインすると、同じくログイン画面へ。もう一度、ログインするとログイン画面へ・・・。この繰り返しになってしまいました。
「何かキャッシュかセッションとかの問題かな?」
と思い、タブを閉じて、再度URLを入力するとログインはできますが、データベースを選択すると強制的にログアウトさせられます。その後、F5キーでリロードしたり、Ctrol+F5でキャッシュ削除のリロードをしたり、Cookieも削除してみましたが強制ログアウトは解消されません。
そんなことをやっている最中にふとしたことに気が付きました。それはデータベース名の横に表示されているテーブル数が「0」に表示されているのです!

テーブル数が「0」と表示
確かテーブルは全部で8個ぐらい作ったはず。それが全部消えてしまうのは正直辛い・・・。何とか救出しなければ!ということで、何はともあれ救出することにしました。
テーブルの救出
さて、いざ救出と言ってもphpMyAdminは使い物になりません。そうなるとデータベースに直接あす瀬すするしかありません。ということで、CentOSのコマンドラインでアクセスします。
まずは本当にテーブルが全滅しているのかが気になります。
[~]# mysql -u (ユーザー) -p
Enter password: ←パスワードを入力
mysql> use (データベース);
mysql> show tables;+--------------------------+ | Tables_in_(データベース) | +--------------------------+ | hogehoge | | : | | : | | fogefoge | +--------------------------+mysql> exit;
実際に確認してみたところテーブルは一応残っている様子。それではそれらのテーブルをSQLでダンプしてみようと思い、下記を実行。
[~]# mysqldump -u (ユーザー) -p (データベース) > db.sql
ダンプしたファイルを早々に開いてみると、すべてのテーブルのSQLがありません。そこで、今度はテーブル1つずつをダンプしてみました。
[~]# mysqldump -u (ユーザー) -p (データベース) (テーブル1) > (テーブル1).sql
[~]# mysqldump -u (ユーザー) -p (データベース) (テーブル2) > (テーブル2).sql
:
この調子でダンプファイルを作っていくと、あるテーブルで
[~]# mysqldump -u (ユーザー) -p (データベース) (テーブル5) > (テーブル5).sql
mysqldump: Couldn’t execute ‘show table status like ‘(テーブル5)”: Lost connection to MySQL server during query (2013)
と、怒られました(T.T)。けど、このテーブルはたいしたテーブルではないのでとりあえずはOKとしました。
テーブルの修復
今回、MySQLのテーブルが破損したのは初めてなので、いろいろとググってみたらMySQLにはテーブルの修復機能があるようです。まあ、ダンプファイルも取ったことなので、ダメ元で修復してみました。
[~]# mysql -u (ユーザー) -p
Enter password:
mysql> use (データベース)
mysql> REPAIR TABLE `(テーブル)`;+-----------------+--------+----------+---------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +-----------------+--------+----------+---------------------------------------------------------+ | (DB).(テーブル) | repair | note | The storage engine for the table doesn't support repair | +-----------------+--------+----------+---------------------------------------------------------+ 1 row in set (0.02 sec)
修復はできない様です・・・orz。エンジンをInnoDBにしたから修復できないのかな?
まとめ
なぜ、この様にテーブルが破損したのかはログを確認してもわかりませんでした。しかし、今回は初めてのことばかりで、いろいろと学ぶことができ、良い機会でした。もし、同じような状況になった方は参考になれば幸ですし、原因追究のカギがわかる方は教えて頂ければ幸です。MySQLもまだまだ勉強しなければいけませんね(^^ゞ
参考にしたサイト
MySQLのダンプ(エクスポート)、インポート、バックアップ – Tips and Memo
MySQL :: MySQL 4.1 リファレンスマニュアル :: A.4.1 MySQL が何度もクラッシュする場合に行うこと
MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.11 MySQL サーバ ログ
MySQLテーブルの修復 – WolaWola
価格¥3,850
順位760,659位
著鈴木 啓修
発行技術評論社
発売日2009/09/29