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を使用して折れ線グラフと円グラフを実装します

推薦する

仮想マシンUbuntu 16.04がインターネットに接続できない問題の解決策

Ubuntu をインストールしたばかりですが、開いたときにネットワーク接続がありませんでした。右上隅...

Postman に基づく HTTP インターフェース テスト プロセスの分析

偶然、素晴らしい人工知能のチュートリアルを発見したので、みんなと共有せずにはいられませんでした。この...

MySQL で指定した桁数の乱数を生成する方法と、バッチで乱数を生成する方法

1. まず、よく使われるMySQL関数をいくつか紹介しますRAND() は 0 から 1 (0<...

ウェブサイトのコンテンツの一部を傍受するための iframe を実装するためのアイデアとコード

コードをコピーコードは次のとおりです。 <div スタイル="幅:630px;高さ:...

Nginx 環境での WordPress マルチサイト構成の詳細な説明

WordPress のマルチサイト機能を使用すると、1 つの WordPress プログラムをインス...

mysql8.0 パスワードを忘れた場合の修正とネットコマンドのサービス名が無効になる問題

cmdにnet start mysqlと入力すると、プロンプトが表示されます: サービス名が無効です...

一般的なDockerコマンドの詳細な説明

1. ヘルプコマンド1. 現在のDockerバージョンを表示する docker バージョン2. イメ...

CentOS での MySQL ログイン 1045 問題を解決する

アプリケーション全体を CentOS にデプロイする必要があるため、当然ながらデータベース操作は不可...

スタイル属性 (element.style) で定義されたインライン スタイルを削除する方法

Magento を頻繁に変更する場合、element.style に遭遇することがあります。 これは...

Velocity.js はページスクロール切り替え効果を実装します

今日は、複数ページのスクロール切り替え効果を備えた Web サイトを簡単かつ効率的に開発できる、小さ...

VUE ユニアプリの基本コンポーネントの簡単な紹介

1. スクロールビュー垂直スクロールを使用する場合は、固定の高さを指定して CSS で高さを設定する...

MySQL で指定エンコーディングを実装する際の落とし穴について

前面に書かれた環境: MySQL 5.7+、MySQL データベースの文字エンコードは utf8、テ...

Linux dateコマンドの知識ポイントのまとめ

使用法: date [オプション]... [+フォーマット]または: date [-u|--utc|...

docker を使用して Spring Boot をデプロイし、Skywalking に接続する方法

目次1. 概要1. スカイウォーキング入門2. スカイウォーキング建築3. スカイウォーキングはどの...

SNMP4J サーバー接続タイムアウト問題の解決策

弊社のネットワーク管理センターは管理センター兼サーバーとして機能します!各管理対象デバイスは、TCP...