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

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

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

答え1

文字通りバックアップがない場合は、99% 運が悪いと確信できます。

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

悪い週の始まりだね、ごめんね。

答え2

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

MySQL がテーブルを削除した後も、データはしばらくメディア上に残ります。そのため、レコードを取得してテーブルを再構築できます。これについては後でブログで説明しますが、今は簡単に説明します。

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

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

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

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

次に、 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に出力されます。[1]:https://twindb.com/how-to-recover-innodb-dictionary/

Undrop For InnoDB に関する PS ビデオ チュートリアル - Undrop for InnoDB の概要https://youtu.be/-1LeLhGjAWM

答え3

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

そして、永久に失われたと思っていたメタデータを入力する数週間の作業を表す 15,000 行が保存されました!!

これが誰かの役に立つことを願います。

答え4

を「元に戻す」ことはできませんDROP TABLE

MySQLがバイナリログ有効にすると、そこからデータを抽出できる可能性があります。

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

関連情報