ドロップされたmysqlデータベースを回復する方法はありますか?


8

サーバーにMySQLデータベースを誤ってドロップしました。削除されたデータベースを回復する方法はありますか?


MySQLデータベースはどのプラットフォームで実行されていますか?
ジャックはtopanswers.xyzを試してみると言っています。

データベースが存在するドライブがバックアップされていて、サーバー管理者があなたを救う可能性はありますか?
ケネスフィッシャー

市場には、破損したMySQLデータベースを修復するためのさまざまなツールがありますが、テストされた最良の結果を得るには、Stellarツールを使用してデータベースを修復できます。このツールは、MySQLデータベースのInnoDBおよびMyISAMテーブルを修復できます。修復されたデータベースオブジェクトのプレビューを取得して、回復中のデータの概要を確認することもできます。ソフトウェアの試用版は無料で利用でき、完全な整合性と元のフォーマットでデータベースを修復し、データの損失を防ぎます。
Mitchel

回答:


16

迅速に行動すると、データベースを回復できる可能性が高くなります。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に出力します。

詳細については、投稿をご覧ください。


テーブルを削除した後、新しいテーブルを作成して新しいレコードを挿入しても、まだ回復可能ですか?
沖エリーリナルディ2016

この場合、CREATEが元の値を上書きするため、index_idが失われます。どういうわけかそれを見つける必要があります。通常、既知の文字列をgrepします。次のINSERTは、データを上書きする場合としない場合があります。そうでない場合は、回復可能です。試してみる必要があります。事前に伝える方法はありません
akuzminsky

このリンクは404を与えます!!
Nevermore 2017

@akuzminsky「dictionary / SYS_INDEXES.sql | grep 158」の部分までやりました。そして、それは私に私のテーブルのいくつかのindex_idを与えます、しかしそれは私のindex_idを持つページファイルがないと言います。例:0000000000000376.page(このc_parser -6fを実行した場合)
Sampath Sri Anuradha

@SampathSriAnuradhaフォーチュンがあなたの味方でないときは気分が悪くなるはずです。申し訳ありません。
アクズミンスキー

11

これを破る簡単な方法はありません。phpmyadminとコマンドラインのどちらでデータベースをドロップしたかは関係ありません。なくなった。

人的ミスは、適切なバックアップ計画を立てる理由の1つです。

私は信心深いわけではありませんが、それほど重要ではないことを願って祈りを捧げます。


それは非常に重要でした、トランザクションの負荷は失われるでしょう
キュール2012

8
その場合、私がお勧めできる最善の方法は、datadirがあったファイルシステムをアンマウントすることです。そのために必要な場合は、サーバーをシャットダウンしてください。無garaunteesとがらくたの撮影のために払っている間、数十のすべてのデータ復旧サービスを呼び出し、数千人を支払うために準備され、そうでない場合: - \
atxdba

3
同様の状況で誰かが将来これを読む場合、データ復旧会社を雇うつもりなら、ファイルシステムをマウント解除するか、読み取り専用にするか、できるだけ早くすることが重要であることも示唆する価値があると思います。ファイルシステムでの書き込みが長くなるほど、削除されたファイルを含むクラスターが上書きされる可能性が高くなります。
James L

2

セットアップによって異なります。システムを正しくセットアップすれば復元することができます。バックアップがある場合は、それを復元できます。次に、テーブルを削除する直前までバイナリログを適用します。

http://dev.mysql.com/doc/refman/5.5/en/mysqlbinlog.html

別のサーバーでこれを行うことをお勧めします。テーブルを復元したら、mysqldumpを使用してそれを抽出し、本番サーバーにインポートして戻すことができます。これは高速な復元ではありませんが、データを回復できます。

あなたが何をしているのかわからない場合は、mysqlコンサルティング会社(pythian、percona、palaminoがおそらく最高です)の1つとサポート契約を結んで、これを手伝ってもらうことをお勧めします。

あなたの幸運をお祈りしています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.