MySQL で誤って削除したテーブル データを回復する方法 (必読)

MySQL で誤って削除したテーブル データを回復する方法 (必読)

バックアップがあれば、非常に簡単です。最新のバックアップ データを生成し、mysqlbinlog を使用してバックアップ時点以降のデータを取得し、現在のネットワークに復元するだけです。

バックアップがない場合、面倒なことになり、データの取得コストも非常に高くなります。

バックアップ時点以降のデータを取得するために mysqlbinlog を使用する方法は次のとおりです。

簡単な実験として、mysql テーブル データを削除し、mysqlbinlog を使用して削除したテーブルのデータを取得します。

アプリテーブルの作成時間とデータの挿入時間: 2013-02-04 10:00:00

原則: mysqlbinlog

前提条件: mysql で bin ログが有効になっている

削除をテストする前に:

mysql> テーブルを表示します。
+-----------------------+
| レポート内のテーブル |
+-----------------------+
| アプリ |
| テスト |
+-----------------------+

mysql> now() を選択します。
+---------------------+
| 今() |
+---------------------+
| 2013-02-04 11:45:44 |
+---------------------+
セット内の1行(0.01秒)


mysql> アプリから count(1) を選択します。
+----------+
| カウント(1) |
+----------+
| 10 |
+----------+
セット内の1行(0.01秒)

データの削除を開始します:

mysql> id =1 のアプリから削除します。
クエリは正常、1 行が影響を受けました (0.00 秒)

マイSQL> 
mysql> ID < 6 のアプリから削除します。
クエリは正常、4 行が影響を受けました (0.01 秒)


mysql> アプリから count(1) を選択します。
+----------+
| カウント(1) |
+----------+
| 5 |
+----------+
セット内の 1 行 (0.00 秒)

 

mysql> now() を選択します。
+---------------------+
| 今() |
+---------------------+
| 2013-02-04 12:08:45 |
+---------------------+

データの取得を開始します:

1. bin ログの場所を見つけます。

/app/mysql/ログ

-rw-rw---- 1 mysql mysql 17K 2月4日 11:43 alert.log
-rw-rw---- 1 mysql mysql 1.0K 11月1日 14:52 master-bin.000001
-rw-rw---- 1 mysql mysql 126 12月25日 14:00 master-bin.000002
-rw-rw---- 1 mysql mysql 126 12月25日 14:02 master-bin.000003
-rw-rw---- 1 mysql mysql 126 12月25日 14:02 master-bin.000004
-rw-rw---- 1 mysql mysql 107 12月25日 14:02 master-bin.000005
-rw-rw---- 1 mysql mysql 13K 2月4日 12:02 master-bin.000006

最近変更されたbinログはmaster-bin.000006だけであることがわかります。

(誤って削除したデータが複数の bin ログにまたがる場合は、bin ログを取得するときにデータを 1 つずつ取得する必要があります。)

この期間中に実行されたすべての SQL ステートメントを、復元する SQL ファイルに保存します。

mysqlbinlog --start-date='2013-02-04 10:00:00' --stop-date='2013-02-04 12:08:45' /app/mysql/log/master-bin.000006 >/app/mysql/mysql_restore_20130204.sql

もちろん、現在のネットワーク環境では、この時間はそれほど正確ではない可能性があり、他のトランザクション SQL ステートメントからの干渉がある可能性があります。

一時データベースの作成

データベース for_bak を作成します。

現在のデータベースアプリで誤って削除されたテーブルをエクスポートします

mysqldump -uroot -ppwd my_db アプリ > /app/mysql/app.sql

現在のデータを一時テーブルにインポートします。

mysql -root -ppwd for_bak < /app/mysql/app.sql

/app/mysql/mysql_restore_20130204.sql の内容の一部を見てみましょう: (悪意のある削除ステートメントが確認できます)

タイムスタンプを 1359949544/*!*/ に設定します。
始める
//*!*/;
# 12878 で
#130204 11:45:44 サーバー ID 1 end_log_pos 12975 クエリ thread_id=5 exec_time=974 error_code=0
タイムスタンプを 1359949544/*!*/ に設定します。
ID = 1 のアプリから削除
//*!*/;
# 12975 で
#130204 11:45:44 サーバー ID 1 end_log_pos 13002 Xid = 106
専念 /*!*/;
# 13002 で
#130204 11:45:44 サーバー ID 1 end_log_pos 13077 クエリ thread_id=5 exec_time=1013 error_code=0
タイムスタンプを 1359949544/*!*/ に設定します。
始める
//*!*/;
# 13077 で
#130204 11:45:44 サーバー ID 1 end_log_pos 13175 クエリ thread_id=5 exec_time=1013 error_code=0
タイムスタンプを 1359949544/*!*/ に設定します。
ID < 6 のアプリから削除
//*!*/;
# 13175 で
#130204 11:45:44 サーバー ID 1 end_log_pos 13202 Xid = 107
専念 /*!*/;
区切り文字 ;
# ログファイルの終了

データがいつ削除されたかを確認できます。 特定の時刻は、select from_unixtime(1359949544); を使用して照会することもできます。

幸いなことに、create table app ステートメントと insert ステートメントもこのファイルに含まれています。 削除ステートメントを手動で削除した後、一時データベースのmysqlbinlogから取得したSQLファイルをソースします。

これにより、アプリは削除される前の状態に復元されます。 次に、一時ライブラリ内のデータを既存のネットワーク データにインポートします (これはこの記事の焦点では​​ありません)。

バックアップがない場合、特に binlog ファイルが多く、それぞれが比較的大きい場合は、アプリ テーブルに関連するすべてのデータを取得するのが非常に面倒になる可能性があります。

その場合、アプリの作成から現在までのアプリテーブルに関連する DML 操作の SQL レコードを、mysqlbinlog を使用して 1 つずつ取得し、データを統合して復元するしかありません。

一般的にこのような状況はまれだと思います。面倒ではありますが、復旧不可能ではありません。

MySQL で誤って削除されたテーブル データを回復する方法 (必読) に関する上記の記事は、私が皆さんと共有したいことのすべてです。この記事が皆さんの参考になれば幸いです。また、123WORDPRESS.COM をサポートしていただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL データを誤って削除した場合の簡単な解決策 (MySQL フラッシュバック ツール)
  • MySQLデータベースを誤って削除した後にデータを回復するための手順
  • mysqlテーブルの物理ファイルを誤って削除した場合の解決策
  • 誤って削除されたMySQLのルートユーザーを回復する方法
  • 誤ってibdata1を削除した後にmysqlを回復する方法
  • MySQL が誤って root ユーザーを削除したり、root パスワードを忘れたりした場合の解決策
  • MySQL のデータの偶発的な削除の解決策と kill ステートメントの原則

<<:  Nginx 運用保守ドメイン名検証方法例

>>:  Chrome Dev Tools を使用してページのパフォーマンスを分析する方法 (フロントエンドのパフォーマンス最適化)

推薦する

Dockerコンテナでユーザーを切り替えるときに権限が不足する問題を解決する方法

Docker コンテナでユーザーを切り替えると、権限が不十分であるというメッセージが表示されます。解...

Dockerを使用してDjango+MySQL8開発環境をデプロイする方法の詳細な説明

しばらく前にシステムを再インストールしましたが、バックアップを取っていなかったので、コンピューター上...

VUE ユニアプリカスタムコンポーネントについての簡単な説明

1. 親コンポーネントはpropsを通じて子コンポーネントにデータを渡すことができる2. 子コンポー...

CSS を使用して、画像に 3D の凸型と凹型のエフェクト (フレーム外に凸型、またはフレーム内に凹型) を実現します。

Ⅰ. 問題の説明: CSS を使用して画像の 3D 凸凹効果を実現します。 Ⅱ実施手順は以下のとお...

MySQL の自動増分 ID に関するいくつかの小さな問題の要約

以下の質問はすべて InnoDB ストレージ エンジンに基づいています。 1. 最も大きな ID を...

IE6 で JS エラーが発生し、CSS が適用されない HTML エンコードの問題の解決策

テストでは、ページ定義がutf-8でエンコードされている場合、 js ファイルに中国語などのマルチバ...

Dockerfile をベースに Zabbix 監視システムのコード例を作成する

forループを使用してZabbixイメージをコンテナにインポートします。 n を `ls *.tar...

MySQLの明示的な型変換の簡単な分析

CAST関数前回の記事では、型変換を表示するために使用する CAST 関数について説明しました。暗黙...

ウェブページのカラーマッチングスキルについての簡単な説明(フロントエンド開発者必読)

一般的に、Web ページの背景色は、より柔らかく、よりシンプルで、より明るく、暗いテキストとマッチし...

vite2.x は ant-design-vue@next コンポーネントのオンデマンド読み込みを実装します。

1. 使用バージョンバイト:2.0 ant-design-vue: 2.0.0-rc.8ヴュー:3...

Docker ベースの nginx ファイル サーバーを構築する方法と手順

1. このマシンに新しい設定ファイルdocker_nginx.confを作成します。 サーバー{ 7...

MySQLは現在の日付と時刻を取得する関数の例の詳細な説明

現在の日付 + 時刻 (日付 + 時刻) を取得する関数: now() mysql> now(...

超大型フォントを使用した 40 の Web ページ デザイン

今日の Web デザインでは、非常に大きなフォントが表示される傾向があります。これらのオープンソース...

画像をクリックして切り替えるJavaScript

クリックして画像を切り替えることは、日常生活で非常によく行われることです。今日の練習は、画像を切り替...

Tomcatのデフォルトプログラム公開パスの使用と変更についての説明

tomcat7 のデフォルトのプログラム公開パスは tomcat/webapps/ROOT/ です。...