MySQLデータを復元する2つの方法

MySQLデータを復元する2つの方法

1. はじめに

少し前、開発者がテスト環境や本番環境で誤った操作をし、データベースを誤って削除/更新してしまうというケースが相次ぎました。DBA にとって、データのロールバックは本当に頭の痛い作業です。オンライン データを復元するとなると、アプリケーションに何らかの影響が出るのは避けられません。ほとんどの場合、開発者は誤った操作によりデータを削除し、ほとんどの行を更新します。この記事では、これまでの操作経験に基づいて、一般的な回復方法を紹介します。

2. 一般的な回復方法

2.1 バックアップからの復元

この方法を使用する前提は、最新のバックアップセットを持っているか、エラー操作が開始されたbinlogの位置またはGTIDを知っていて、バックアップセットを使用して中間マシンに復元し、MySQLのスレーブ機能を使用することです。

MASTER_LOG_FILE = 'log_name'、MASTER_LOG_POS = log_pos になるまでスレーブ [SQL_THREAD] を開始します。

until_option:

UNTIL { {SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS} = gtid_set | MASTER_LOG_FILE = 'log_name'、MASTER_LOG_POS = log_pos | RELAY_LOG_FILE = 'log_name'、RELAY_LOG_POS = log_pos | SQL_AFTER_MTS_GAPS }

一時インスタンスに復元し、誤って削除および更新されたデータをダンプして、古いインスタンスに復元します。データの回復中は、影響を受けるテーブルを書き込み可能にしないことが最善です。そうしないと、目的の結果を達成することが難しくなります。たとえば、a=2 が誤って a=4 に更新され、回復期間中に a=7 に更新され、回復後に a=2 に復元されます。 このリカバリ方法は、多数のデータベースのリカバリには適しておらず、一時インスタンスが必要です。

2.2 オープンソースツールbinlog2sqlを使用して復元する

binlog2sql は、Dianping の DBA によって開発されたツールです。binlog を解析して削除を挿入に復元し、更新値セット フィールドと where 条件を交換してデータを復元します。 使用制限 MySQL binlog形式は行インストールである必要があります

git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
pip インストール -r 要件.txt

使用法

使用方法: binlog2sql.py [-h HOST] [-u USER] 
           [-p パスワード] [-P ポート]
           [--start-file スタートファイル] 
           [--開始位置 STARTPOS]
           [--stop-file ENDFILE] 
           [--stop-position ENDPOS]
           [--start-datetime 開始時刻] 
           [--stop-datetime 停止時刻]
           [--stop-never] 
           [-d [データベース [データベース ...]]]
           [-t [テーブル [テーブル ...]]] 
           [-K] [-B]
           [ - ヘルプ]

テーブルフラッシュバックを作成(
id int(11) NULLでない auto_increment 主キー ,
stat int(11) NULLでない デフォルト 1 
) エンジン=innodb デフォルトの文字セット=utf8;

フラッシュバックに挿入(統計) 
値(2)、(3)、(4)、(7)、(9)、(22)、(42)、(33)、(66)、(88)

誤操作

フラッシュバックを更新し、統計を 15 に設定

データを回復する手順

1. エラーのある DML が配置されている binlog を取得します。ただし、開発者は通常、特定の binlog を知りません。開発者が知っているのは、エラーのある操作がいつ発生したかだけです。Binlog2sql は、時間範囲によるリカバリをサポートしています。

mysql> マスターログを表示します。
+------------------+-----------+
| ログ名 | ファイルサイズ |
+------------------+-----------+
|mysql-bin.000009 | 177 |
|mysql-bin.000010 | 464 |
|mysql-bin.000011 | 8209 |
+------------------+-----------+
セット内の 3 行 (0.00 秒)

この例では、binlogはmysql-bin.000011です。

2. binlog2sqlを使用してデータを復元します。まず、binlogを解析して更新ステートメントの開始位置を取得します。この例では、開始位置は5087、終了位置は5428です。次のコマンドを実行します。

python binlog2sql.py -h127.0.0.1 -P3307 -udba -p'dbadmin' -dyang -tflashback --start-file='mysql-bin.000011'

binlog2sql -Bパラメータを使用して復元されたSQLを取得します

取得したSQLをデータベースに対して実行します。実際に本番環境で問題が発生した場合には、必ず開発者とコミュニケーションを取り、復元する必要がある正確なレコードを確認してください。

mysql> フラッシュバックから * を選択します。
+----+------+
| ID | 統計 |
+----+------+
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 7 |
| 5 | 9 |
| 6 | 22 |
| 7 | 42 |
| 8 | 33 |
| 9 | 66 |
| 10 | 88 |
+----+------+
セット内の行数は 10 です (0.00 秒)

binlog2sql の機能:

MySQL サーバーを起動する必要があり、オフライン モードでは利点を解析できません (mysqlbinlog と比較)。

純粋な Python 開発で、インストールと使用が簡単です。

フラッシュバックおよび主キーなしの解析モードが付属しているため、パッチは必要ありません。

フラッシュバックモードはフラッシュバック戦闘に適しています。

理解とデバッグを容易にするために標準 SQL に解析します。

コードは簡単に変更でき、よりパーソナライズされた分析をサポートできます。

実際、MySQL には sql_safe_updates というパラメータも用意されており、これは where 条件のない削除および更新ステートメントを禁止します。具体的な使い方や導入については、MySQLの公式紹介を参照してください。

結論

この記事では、誤った操作からデータを回復する 2 つの方法を簡単に紹介しました。実際には、mysqlbinlog を使用してデータを回復するスクリプトを作成したり、フラッシュバック パッチや Qunar のインセプションを使用したりなど、他の方法もあります。引き続き学習してください。データセキュリティの保護は DBA の基本的な責任です。毎年、誤ってデータを削除したことによるさまざまな悲劇が発生しています。すべての DBA が自分のライフラインを守れることを願っています。

上記は、MySQL データを復旧する 2 つの方法の詳細です。MySQL データ復旧の詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • mysql5.7でbinlogを使用してデータを復元する方法
  • MySQLはbinlogを通じてデータを復元する
  • MySQLはテーブルデータを復元するためにfrmファイルとibdファイルを使用します
  • MySQLはデータ復旧を実装するためにbinlogログを使用する
  • 誤って削除されたデータを復元するための mysqlbinlog コマンドを使用した mysql の実装
  • MySQL データベースのバックアップとリカバリの実装コード
  • MySQLはmysqldump+binlogを使用して、削除されたデータベースの原理分析を完全に復元します。
  • MySQLデータのバックアップとリカバリの実装方法の分析
  • MySQL バイナリログデータ復旧: 誤ってデータベースを削除した場合の詳細な説明
  • MySQLデータ復旧のさまざまな方法の概要

<<:  Linux Centos でスクリプトを使用して Docker をインストールする方法

>>:  VueはEChartsを使用して折れ線グラフと円グラフを実装します

推薦する

MySQL の on と where における左結合設定条件の使用法の違いの分析

この記事では、MySQL の左結合における on 条件と where 条件の使用法の違いを例を使って...

HarborをベースにしたDocker専用倉庫の構築方法

目次1. ハーバーの紹介1. ハーバーが民間倉庫を建設3. 港湾の維持管理4. Harborユーザー...

MySQL インデックス カバレッジの例の分析

この記事では、MySQL インデックス カバレッジについて例を挙げて説明します。ご参考までに、詳細は...

MySQL の起動オプションとシステム変数の例の詳細な説明

目次ブートオプションコマンドラインパラメータの長い形式と短い形式設定ファイル構成グループシステム変数...

MySQL カウントを向上させる方法のまとめ

多くのプログラマーは MySQL に精通していると思います。多くの人が count の使い方と、最適...

64 ビット CentOs7 ソース コードのインストール mysql-5.6.35 プロセス共有

インストールプロセス中に問題が発生しないように、まず依存パッケージをインストールします。 [root...

Linux の一般的なテキスト処理コマンドと vim テキストエディタ

今日は、いくつかの一般的なテキスト処理コマンドとvimテキストエディタを紹介します。 3日目 - 一...

Nginx転送マッチングルールの実装

1. 正規表現マッチング大文字と小文字を区別するマッチングの場合 ~ ~*は大文字と小文字を区別しな...

vue で wangEditor を使用する方法と、データをエコーし​​てフォーカスを取得する方法

バックグラウンド管理プロジェクトを行う際には、リッチテキストエディタがよく使用されます。ここでは、非...

React プロジェクトで eslint の Baidu スタイルを使用する詳細な説明

1. Baidu Eslint Ruleプラグインをインストールする npm i -D eslint...

ラムダ式の原則と例

ラムダ式ラムダ式 (クロージャとも呼ばれる) は、Java 8 のリリースを推進した最も重要な新機能...

Windows Server 2016 リモート デスクトップ サービスの構成とライセンスのアクティブ化 (2 ユーザー)

Server 2016 のリモート デスクトップ接続のデフォルト数は 2 ユーザーです。2 人以上...

Tomcat Nativeを使用してTomcat IO効率を向上させる方法の詳細な説明

目次導入Tomcatへの接続方法APR と Tomcat ネイティブtomcat で APR を使用...

HTML 名 ID とクラスの違い_PowerNode Java アカデミー

名前タグの名前を指定します。形式 <input type="text" n...

Vueはデータを初期状態にリセットします

場合によっては、データ内のデータを再利用する必要がありますが、データ内のデータはさまざまなフォーム、...