誤ってすべてのテーブルを削除しました。元に戻すことはできますか?バックアップコピーがありません。
誤ってすべてのテーブルを削除しました。元に戻すことはできますか?バックアップコピーがありません。
回答:
文字通りバックアップがない場合、私は99%あなたが運が悪いと確信しています。
古い形式のバックアップがある場合は、MySQL構成ファイル(my.ini)のlog-binオプションを使用してバイナリロギングを有効にしていますか?その場合、最後のバックアップ以降に回復できる可能性があります。
1週間かけて開始する方法がよくありません。申し訳ありません。
質問はかなり古いですが、肯定的な答えは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のアンドロップツールをダウンロードしてコンパイルします。詳細については、「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に出力します。
これが私がしたことです。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行は、永久に失われたと考えられ、保存されます。
これが誰かを助けることを願っています。
残念なことに、適切なバックアップ計画の必要性についての非常に貴重な教訓を取り除く以外に、できることはほとんどありません。
テーブルのタイプによっては、ディスクに残されたものからデータを元に戻すことができるエキスパートを見つけることができるかもしれませんが、そのようなフォレンジック分析は非常に非常に高く(比較的まれなスキルが必要になるため)、まったく保証されません本当に役に立ちます。
これがMyISAMテーブルである場合、/ var / log / mysqlまたはデータディレクトリが何であれ、テーブルファイルの削除を取り消す必要があります。たとえば、ext3grepユーティリティを使用できます。
バイナリログを有効にしている場合、スキーマがある場合は、最初にテーブルを再作成するだけです。binlogをオフにした状態でスキーマを作成してください。または、セッションをスキップすることもできます。その後、テーブル自体を削除した最後のステートメントまでバイナリログを再生できます。
そうでない場合は、バックアップダンプがあればそれを使用して復元できます。あなたがcsvファイルを持っているなら、あなたはデータを回復するためにデータinfileメソッドをロードすることができます。mysqldumpから回復する場合は、データベース全体を復元するのではなく、ダンプファイルから単一のテーブルを復元することを検討してください。データサイズが大きすぎる場合は、ロードする前にキーを無効にすることを検討してください。これにより、復元プロセスが大幅に増加します。
将来的には、10〜24時間遅れる遅延スレーブが必要になる場合があります。perconaツールキット(pt-slave-delay)を使用して遅延スレーブを作成できます