web-dev-qa-db-ja.com

DROPテーブルを元に戻すには?

誤ってすべてのテーブルを削除しました。元に戻すことはできますか?バックアップコピーがありません。

11
deadman

文字通りバックアップがない場合、私は99%あなたが運が悪いと確信しています。

古い形式のバックアップが存在する場合、MySQL構成ファイル(my.ini)のlog-binオプションを介してバイナリロギングを有効にしていますか?その場合、最後のバックアップ以降に回復できる可能性があります。

1週間かけて開始する方法がよくありません。申し訳ありません。

12
Chopper3

質問はかなり古いですが、肯定的な答えは1つではないので、1つ追加します。

MySQLがテーブルを削除した後、データはしばらくの間メディア上にあります。したがって、レコードをフェッチしてテーブルを再構築できます。後でブログで説明しますが、ここでは簡単に説明します。

テーブルの構造が必要です(CREATE TABLEステートメント)。

Innodb_file_per_tableがONの場合、ドロップされたテーブルはディスクパーティションにあります。 MySQLを停止し、読み取り専用としてできるだけ早く再マウントします。 MySQLがルートパーティションにあった場合(これは良い考えではありません)、イメージを取得するか、ディスクを取り出して別のサーバーに接続します。つまり、すべての書き込みを停止します。

Innodb_file_per_tableがOFFの場合は、MySQLを停止するだけです。

次に、 https://github.com/twindb/undrop-for-innodb/ からInnoDBのアンドロップツールをダウンロードしてコンパイルします。詳細については、「 Compiling TwinDBリカバリツールキット 」の投稿を確認してください。

次に、stream_parserを使用して、ディスクパーティションまたはibdata1(innodb_file_per_tableの設定に依存)を解析します。

./stream_parser -f /path/to/diskimage_or_ibdata1

次に、InnoDBディクショナリをリカバリして、削除されたテーブルがどのindex_idにあったかを確認します。

次に、テーブル構造を取得してレコードをフェッチします

./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page

レコードをstdoutに出力し、LOAD DATAコマンドをstderrに出力します。

7
akuzminsky

これが私がしたことです。 mysqlディレクトリ(Ubuntuの場合は/ var/lib/mysql、Homebrewを使用するMacの場合は/ usr/local/var/mysql)で、いくつかのファイルが見つかりました。まず、特定のスキーマを含むmyapp_development /ディレクトリをローカルのmysqlディレクトリにコピーしました。次に、ローカルのibdata1をバックアップし、サーバーのibdata1をmysqlディレクトリにコピーしました。 mysqldを終了しました。 (ps aux PIDを検索し、次にkill PID)。 mysqlを再起動し、クラッシュリカバリモードで起動しました。次に、ローカルのmysqlクライアントを起動し、必要なテーブルの完全なダンプを生成しました。

そして、メタデータを入力するための何週間もの作業を表す15,000行が保存され、永久に失われたと見なされます。

これが誰かを助けることを願っています。

2
Duke

残念なことに、適切なバックアップ計画の必要性についての非常に貴重な教訓を取り除く以外に、できることはほとんどありません。

テーブルのタイプによっては、ディスクに残されたものからデータを元に戻すことができるエキスパートを見つけることができるかもしれませんが、そのようなフォレンジック分析は非常に非常に高く(比較的まれなスキルが必要になるため)、まったく保証されません本当に役に立ちます。

2
David Spillett

これがMyISAMテーブルである場合、/ var/log/mysqlまたはデータディレクトリが何であれ、テーブルファイルの削除を取り消す必要があります。たとえば、 ext3grep ユーティリティを使用できます。

0

DROP TABLEを「取り消す」ことはできません。

MySQLで バイナリロギング が有効になっているかどうかを確認できます。そこからデータを抽出できます。

それ以外は、MySQLを忘れることができ、「誤ってファイルシステムからいくつかのファイルを削除してしまった」という同じクラスの問題に属しています。ファイルを回復しようとするツールがいくつかありますし、専門的にそれを行う会社もあります。

0
Luke404

バイナリログを有効にしている場合、スキーマがある場合は、最初にテーブルを再作成するだけです。 binlogをオフにしている間にスキーマを作成してください。または、セッションをスキップすることもできます。次に、テーブル自体を削除した最後のステートメントまでバイナリログを再生できます。

そうでない場合は、バックアップダンプがあればそれを使用して復元できます。あなたがcsvファイルを持っているなら、あなたはデータを回復するためにデータをファイルにロードする方法をすることができます。 mysqldumpから回復する場合は、データベース全体を復元するのではなく、ダンプファイルから単一のテーブルを復元することを検討してください。データサイズが大きすぎる場合は、キーを無効にしてからロードすると、復元処理が大幅に増加します。

将来的には、10〜24時間遅れるような遅延スレーブが必要になる場合があります。 perconaツールキット(pt-slave-delay)を使用して遅延スレーブを作成できます

0
roger moore