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 mysqlログイン名とパスワードを表示および変更し、phpmyadminをインストールする

MySQLをインストールした後、ターミナルでmysql -u root -pと入力してEnterを押...

外部ファイル(js/vbs/css)をインポートするときに文字化けを回避する方法

ページ内にはjs、cssなどの外部ファイルが導入されており、外部ファイルのエンコードが現在のページフ...

MySQL カーソルの定義と使用法

カーソルの作成まず、MySql でデータ テーブルを作成します。 存在しない場合はテーブルを作成 `...

MySQL MyISAM と InnoDB の違い

違い: 1. InnoDB はトランザクションをサポートしていますが、MyISAM はサポートしてい...

Vue v-model 関連の知識のまとめ

​v-model は、入力とフォーム データ間、または 2 つのコンポーネント間の双方向データ バイ...

MySQL でスロークエリを有効にする方法の例

序文スロー クエリ ログは、MySQL で非常に重要な機能です。MySQL のスロー クエリ ログ機...

RHCE ブリッジング、パスワード不要のログイン、ポート番号の変更の概要

目次1. ブリッジを設定し、検証のためにパケットをキャプチャする1. ブリッジデバイスとセッションを...

CentOS7 は yum を使用して mysql 8.0.12 をインストールします

この記事では、centos7にyumを使用してMySQL 8.0.12をインストールする詳細な手順を...

MySQLインストール後のデフォルトデータベースの役割の詳細な説明

MySQL を学習すると、インストール後にいくつかのデフォルトのデータベースが付属していることに気付...

MySQL 最適化 Zabbix パーティション最適化

zabbix を利用する上での最大のボトルネックはデータベースです。zabbix のデータストレージ...

MySQLでカーソルを宣言する方法

MySQL でカーソルを宣言する方法: 1. 変数とカーソルを宣言する 結果をvarchar(300...

Docker インストール Nginx チュートリアル 実装図

Nginx をインストールして試してみましょう。画像はクラスであり、コンテナはオブジェクトであること...

JavaScript タイマーの種類の概要

目次1.setInterval() 2.タイムアウトを設定する() 1.setInterval()指...

Vue を使用した Amap アプリケーション開発のベスト プラクティス

目次序文非同期読み込みパッケージコンポーネントコンポーネントの使用インターフェースをカスタマイズする...

Javascriptはセキュリティ検証に整合性属性を使用します

目次1. スクリプトタグを使用してファイルをインポートする1. ローカルファイルをインポートする2....