サーバーにMySQLデータベースを誤ってドロップしました。削除されたデータベースを回復する方法はありますか?
サーバーにMySQLデータベースを誤ってドロップしました。削除されたデータベースを回復する方法はありますか?
回答:
迅速に行動すると、データベースを回復できる可能性が高くなります。InnoDBの場合は可能性が高く、MyISAMの場合はゼロではありませんが、近いです。
問題は、MySQLがDROP TABLEまたはDROP DATABASE(基本的には同じ)を実行するときにInnoDBがデータを消去しないことです。データを含むページはまだディスク上にあります。
innodb_file_per_table設定に応じて、リカバリプロセスは異なります。innodb_file_per_tableがOFF(デフォルトは5.5まで)の場合、削除されたテーブルはibdata1に残ります。innodb_file_per_tableがONの場合(5.5以降のデフォルト)、削除されたテーブルはそれぞれの.ibdファイルにありました。MySQLは、テーブルを削除するときにこのファイルを削除します。
最初に行うことは、可能な書き込みをすべて停止して、テーブルが上書きされないようにすることです。innodb_file_per_tableがOFFの場合、MySQLを停止するだけで十分です(kill -9の方が優れていますが、safe_mysqldを最初に強制終了してください)。innodb_file_per_tableがONの場合、MySQLがデータを保存するumountパーティション。datadirがルートパーティションにある場合は、サーバーをシャットダウンするか、少なくともディスクのイメージを取得することをお勧めします。繰り返しますが、MySQLまたはオペレーティングシステムによる削除されたテーブルの上書きを防ぐことが目標です。
低レベルのTwinDBデータリカバリツールキットでInnoDBページを 操作できるツールがあります。アンドロップリカバリの説明に使用します。
ドロップされたテーブルがあるメディア(ibdata1またはディスクイメージのいずれか)を取得し、その上でInnoDBページを見つける必要があります。ツールキットのstream_parserツールがそれを行います。
./stream_parser -f /path/to/disk/image
ファイルをスキャンし、InnoDBページを見つけ、タイプとindex_idでソートします。index_idは、InnoDBがインデックスを参照するために使用する識別子です。テーブルはインデックスPRIMARYに格納されます。ドロップされたテーブルがどのindex_idであるかを見つけるには、InnoDB辞書をリカバリする必要があります。
InnoDB辞書はibdat1ファイルに保存されます。上記と同じ方法でibdata1ファイルをスキャンする必要があります。
./stream_parser -f /var/lib/mysql/ibdata1
次に、InnoDBディクショナリテーブルSYS_TABLESおよびSYS_INDEXESからレコードを取得する必要があります(テーブルがsakila.actorであるとしましょう)。
./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor
000000000B28 2A000001430D4D SYS_TABLES "sakila/actor" 158 4 1 0 0 "" 0
158はtable_idです。覚えておいてください。
./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 158
000000000B28 2A000001430BCA SYS_INDEXES 158 376 "PRIMARY" 1 3 0 4294967295
000000000B28 2A000001430C3C SYS_INDEXES 158 377 "idx\_actor\_last\_name" 1 0 0 4294967295
したがって、ドロップしたテーブル(sakila.actor)のindex_idは376です。
これで、ドロップされたテーブルのレコードをInnoDB index_id 376からフェッチできます。ドロップされたテーブルのテーブル構造、つまりテーブルの作成に使用したCREATE TABLEステートメントが必要です。どこで入手できますか?古いバックアップから、または他の場所から。InnoDB辞書から構造を復元することもできますが、この回答では取り上げません。あなたがそれを持っていると仮定しましょう。
./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t actor.sql > dump.tsv 2> load_cmd.sql
c_parserは、レコードをタブ区切りのダンプとしてstdoutに出力します。ダンプは、LOAD DATAコマンドでロードできます。c_parserはそれをstderrに出力します。
詳細については、投稿をご覧ください。
これを破る簡単な方法はありません。phpmyadminとコマンドラインのどちらでデータベースをドロップしたかは関係ありません。なくなった。
人的ミスは、適切なバックアップ計画を立てる理由の1つです。
私は信心深いわけではありませんが、それほど重要ではないことを願って祈りを捧げます。
セットアップによって異なります。システムを正しくセットアップすれば復元することができます。バックアップがある場合は、それを復元できます。次に、テーブルを削除する直前までバイナリログを適用します。
http://dev.mysql.com/doc/refman/5.5/en/mysqlbinlog.html
別のサーバーでこれを行うことをお勧めします。テーブルを復元したら、mysqldumpを使用してそれを抽出し、本番サーバーにインポートして戻すことができます。これは高速な復元ではありませんが、データを回復できます。
あなたが何をしているのかわからない場合は、mysqlコンサルティング会社(pythian、percona、palaminoがおそらく最高です)の1つとサポート契約を結んで、これを手伝ってもらうことをお勧めします。
あなたの幸運をお祈りしています