ご存知のとおり、binlog ログは MySQL データベースにとって非常に重要です。万が一、データ損失が発生した場合、危険を回避するために、binlog ログ機能を使用してデータを回復すること (スケジュールされたフルバックアップ + 増分データの binlog ログ回復) を考えることがよくあります。 では、早速、binlog ログ操作について説明します。 1. binlogの予備知識
MySQL のバイナリ ログ binlog は、MySQL の最も重要なログと言えます。すべての DDL および DML ステートメント (データ クエリ ステートメントの選択を除く) がイベントの形式で記録され、ステートメントの実行に費やされた時間も含まれます。MySQL のバイナリ ログはトランザクション セーフです。 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- DDL ----データ定義言語 データベース定義言語の主なコマンドは、CREATE、ALTER、DROPなどです。DDLは主に、テーブル(TABLE)の構造、データ型、テーブル間のリンクと制約、その他の初期化作業を定義または変更するために使用されます。主にテーブルを作成するときに使用されます。 DMML の ----データ操作言語 データ操作言語の主なコマンドは、SELECT、UPDATE、INSERT、DELETE です。その名前が示すように、これら 4 つのコマンドはデータベース内のデータを操作するために使用されます。 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- mysqlbinlog の一般的なオプションは次のとおりです。
--start-datetime: ローカルコンピュータのタイムスタンプと同じかそれ以降の時刻をバイナリログから読み取ります
--stop-datetime: バイナリ ログから、タイムスタンプより小さいか、ローカル コンピューターの時刻に等しい時刻値を読み取ります。値は上記と同じです。
--start-position: バイナリ ログから指定された位置のイベント位置を開始として読み取ります。
--stop-position: バイナリログから指定された位置のイベント位置をイベント終了として読み取ります。 **************************************************************************** 一般的に、binlog を有効にするとパフォーマンスが約 1% 低下します。
Binlog ログには、最も重要な 2 つの使用シナリオがあります。
1) MySQLマスタースレーブレプリケーション: MySQLレプリケーションはマスター側でバイナリログを開始し、マスターはスレーブにバイナリログを渡して マスターとスレーブ間のデータ一貫性の目的。
2) 当然、mysqlbinlog ツールを使用してデータが回復されます。
binlog ログには 2 種類のファイルが含まれます。
1) バイナリログインデックスファイル(ファイル名のサフィックスは.index )は、すべてのバイナリファイルを記録するために使用されます。
2) バイナリ ログ ファイル (ファイル名のサフィックスは .00000* ) には、データベース内のすべての DDL および DML (データ クエリ ステートメントの選択を除く) ステートメント イベントが記録されます。 2. binlog ログを開きます。
1) MySQL設定ファイル/etc/mys.cnfを編集して開きます。
[root@vm-002 ~]# vim /etc/my.cnf [mysqld]セクションに追加 log-bin=mysql-bin は、それがオンになっていることを確認します (mysql-bin はログのベース名またはプレフィックス名です)。 2) 設定を有効にするためにmysqldサービスを再起動します。
[root@vm-002 ~]# /etc/init.d/mysqld を停止します [root@vm-002 ~]# /etc/init.d/mysqldを再起動します mysqldを停止しています: [ OK ] mysqldを起動しています: [ OK ] 3) binlogが有効になっているか確認する
mysql> 'log_%' のような変数を表示します。 +---------------------------------+---------------------+ | 変数名 | 値 | +---------------------------------+---------------------+ | log_bin | オン | | log_bin_trust_function_creators | オフ | | log_bin_trust_routine_creators | オフ | | log_error | /var/log/mysqld.log | | ログ出力 | ファイル | | log_queries_not_using_indexes | オフ | | log_slave_updates | オフ | | log_slow_queries | オフ | | ログ警告 | 1 | +---------------------------------+---------------------+ セット内の行数は 9 です (0.00 秒) 3. よく使われるbinlogログ操作コマンド
1) すべてのbinlogログリストを表示する
mysql> マスターログを表示します。 +------------------+-----------+ | ログ名 | ファイルサイズ | +------------------+-----------+ |mysql-bin.000001 | 149 | |mysql-bin.000002 | 4102 | +------------------+-----------+ セット内の 2 行 (0.00 秒) 2) マスターステータス、つまり最後の(最新の)binlogログの番号名と、その最後の操作イベントのposエンドポイント値を確認します。
mysql> マスターステータスを表示します。 +------------------+----------+--------------+------------------+ | ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 4102 | | | +------------------+----------+--------------+------------------+ セット内の 1 行 (0.00 秒) 3) フラッシュはログを更新し、この時点から新しい番号付きbinlogログファイルを生成します。
mysql> ログをフラッシュします。 クエリは正常、影響を受けた行は 0 行 (0.13 秒) mysql> マスターログを表示します。 +------------------+-----------+ | ログ名 | ファイルサイズ | +------------------+-----------+ |mysql-bin.000001 | 149 | |mysql-bin.000002 | 4145 | |mysql-bin.000003 | 106 | +------------------+-----------+ セット内の 3 行 (0.00 秒) 知らせ:
mysqld サービスが再起動されるたびに、このコマンドが自動的に実行され、binlog ログが更新されます。mysqldump を使用してデータをバックアップするときに -F オプションを追加すると、binlog ログも更新されます。 4) すべてのbinlogログをリセット(クリア)する
mysql> マスターをリセットします。 クエリは正常、影響を受けた行は 0 行 (0.12 秒) mysql> マスターログを表示します。 +------------------+-----------+ | ログ名 | ファイルサイズ | +------------------+-----------+ |mysql-bin.000001 | 106 | +------------------+-----------+ セット内の 1 行 (0.00 秒) 4. binlog ログの内容を表示する一般的な方法は 2 つあります。
1) mysqlbinlog の組み込み表示コマンド方式を使用します。
知らせ:
-->binlog はバイナリ ファイルです。cat、more、vim などの通常のファイル ビューアでは開くことができません。表示するには、組み込みの mysqlbinlog コマンドを使用する必要があります。
-->binlogログとデータベースファイルは同じディレクトリにあります
-->MySQLバージョン5.5未満でmysqlbinlogコマンドを使用する際にエラーが発生する場合は、「--no-defaults」オプションを追加します。 mysqlデータ保存ディレクトリを確認します。次の結果から、/var/lib//mysqlであることがわかります。
[root@vm-002 ~]# ps -ef|grep mysql ルート 9791 1 0 21:18 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/ lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql mysql 9896 9791 0 21:18 pts/0 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock ルート 9916 9699 0 21:18 pts/0 00:00:00 mysql -px xxxx ルート 9919 9715 0 21:23 pts/1 00:00:00 grep --color mysql [root@vm-002 ~]# cd /var/lib/mysql/ [root@vm-002 mysql]# ls ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index mysql.sock ops テスト mysqlbinlog コマンドを使用して、binlog ログの内容を表示します。以下はスニペット分析です。 [root@vm-002 mysql]# mysqlbinlog mysql-bin.000002 .............. # 624 で #160925 21:29:53 サーバー ID 1 end_log_pos 796 クエリ thread_id=3 exec_time=0 error_code=0 タイムスタンプを 1474810193/*!*/ に設定します。 insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2') #実行されたSQL文 //*!*/; # 796 で #160925 21:29:53サーバーID 1 end_log_pos 823 Xid = 17 #実行時間 ............. 説明する:
サーバー ID 1: データベース ホストのサービス番号。 end_log_pos 796: SQL の最後の POS ノード thread_id=11: スレッド番号 2) 上記の方法では、binlogログの全文をより多く読み取るため、POSポイント情報を区別して表示することは容易ではありません。
より便利なクエリ コマンドを次に示します。
コマンド形式:
mysql> binlog イベントを表示します [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]; パラメータの説明:
IN 'log_name': 照会するバイナリログファイル名を指定します (指定しない場合は、最初のバイナリログファイルになります) FROM pos: 検索の開始点を指定します (指定しない場合は、ファイル全体の最初の pos ポイントから開始されます) LIMIT [offset,] :オフセット(指定しない場合は0) row_count : 行の合計数を照会します(指定されていない場合はすべての行) mysql> マスターログを表示します。 +------------------+-----------+ | ログ名 | ファイルサイズ | +------------------+-----------+ |mysql-bin.000001 | 125 | |mysql-bin.000002 | 823 | +------------------+-----------+ セット内の 2 行 (0.00 秒) mysql> 'mysql-bin.000002' の binlog イベントを表示します\G; ************************** 1. 行 **************************** ログ名: mysql-bin.000002 順位: 4 イベントタイプ: フォーマットの説明 サーバーID: 1 終了ログ位置: 106 情報: サーバーバージョン: 5.1.73-log、Binlog バージョン: 4 ************************** 2. 行 **************************** ログ名: mysql-bin.000002 順位: 106 イベントタイプ: クエリ サーバーID: 1 終了ログ位置: 188 情報: `ops` を使用します。テーブル customers を削除します。 ************************** 3. 行 **************************** ログ名: mysql-bin.000002 順位: 188 イベントタイプ: クエリ サーバーID: 1 終了ログ位置: 529 情報: `ops` を使用します。CREATE TABLE IF NOT EXISTS `member` ( `id` int(10) 符号なし NOT NULL AUTO_INCREMENT, `name` varchar(16) NOT NULL, `sex` enum('m','w') NOT NULL デフォルト 'm', `age` tinyint(3) 符号なし NOT NULL, `classid` char(6) デフォルト NULL, 主キー (`id`) ) エンジン=InnoDB デフォルト文字セット=utf8 ************************** 4. 行 **************************** ログ名: mysql-bin.000002 ポジション: 529 イベントタイプ: クエリ サーバーID: 1 終了ログ位置: 596 情報: 開始 ************************** 5. 行 **************************** ログ名: mysql-bin.000002 順位: 596 イベントタイプ: Intvar サーバーID: 1 終了ログ位置: 624 情報: INSERT_ID=1 ************************** 6. 行 **************************** ログ名: mysql-bin.000002 ポジション: 624 イベントタイプ: クエリ サーバーID: 1 終了ログ位置: 796 情報: `ops` を使用します。member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2') に挿入します。 ************************** 7. 行 **************************** ログ名: mysql-bin.000002 順位: 796 イベントタイプ: Xid サーバーID: 1 終了ログ位置: 823 情報: COMMIT /* xid=17 */ セット内の行数は 7 です (0.00 秒) エラー: クエリが指定されていません マイSQL> 上記のステートメントは、指定された binlog ログ ファイルを有効なイベント ラインの形式で返すことができ、limit を使用して pos ポイントの開始オフセットを指定してエントリの数を照会できます。 操作例は以下の通りです。
a) 最初の(最も古い)binlog ログをクエリします。
mysql> binlog イベントを表示します\G; b) ファイル mysql-bin.000002 をクエリします。
mysql> 'mysql-bin.000002' の binlog イベントを表示します\G; c) クエリファイル mysql-bin.000002 を指定します。位置は 624 から始まります。
mysql> 624\G から 'mysql-bin.000002' の binlog イベントを表示します。 d) ファイル mysql-bin.000002 をクエリするように指定します。位置ポイント: 624 から開始し、10 レコード (つまり、10 ステートメント) をクエリします。
mysql> 'mysql-bin.000002' の 624 制限から 10\G までの binlog イベントを表示します。 e) クエリファイル mysql-bin.000002 を指定し、位置ポイント 624 からクエリを開始し、2 行オフセットし (つまり、途中で 2 行スキップ)、10 レコードをクエリします。
mysql> 'mysql-bin.000002' の binlog イベントを 624 の制限 2,10\G から表示します。 5. binlogログを使用してmysqlデータを復元する 以下の操作は、opsライブラリのメンバーテーブルに対して実行されます。
mysql> ops を使用します。 mysql> テーブルが存在しない場合は `member` を作成します ( -> `id` int(10) 符号なし NOT NULL AUTO_INCREMENT, -> `name` varchar(16) NOT NULL, -> `sex` enum('m','w') NOT NULL DEFAULT 'm', -> `age` tinyint(3) 符号なし NOT NULL, -> `classid` char(6) デフォルト NULL, -> 主キー (`id`) -> ) ENGINE=InnoDB デフォルト文字セット=utf8; クエリは正常、影響を受けた行は 0 行 (0.10 秒) mysql> テーブルを表示します。 +---------------+ | テーブル_in_ops | +---------------+ | メンバー | +---------------+ セット内の 1 行 (0.00 秒) mysql> desc メンバー; +---------+---------------------+------+-----+---------+----------------+ | フィールド | タイプ | Null | キー | デフォルト | 追加 | +---------+---------------------+------+-----+---------+----------------+ | id | int(10) 符号なし | NO | PRI | NULL | auto_increment | | 名前 | varchar(16) | NO | | NULL | | | 性別 | enum('m','w') | いいえ | | m | | | 年齢 | tinyint(3) 符号なし | NO | | NULL | | | クラスID | char(6) | はい | | NULL | | +---------+---------------------+------+-----+---------+----------------+ セット内の行数は 5 です (0.00 秒) 事前に2つのデータを挿入する
mysql> メンバーに挿入(`name`,`sex`,`age`,`classid`) 値('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2'); クエリは正常、2 行が影響を受けました (0.08 秒) 記録: 2 重複: 0 警告: 0 mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | guohuihui | w | 27 | cls2 | +----+-----------+-----+-----+---------+ セット内の 2 行 (0.00 秒) シーンシミュレーションを始めましょう:
1)
ops ライブラリは、次のように毎日午前 4 時にスケジュールされた完全バックアップ タスクを実行します。 [root@vm-002 ~]# crontab -l 0 4 * * * /usr/bin/mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(日付 +%F).sql.gz 以下は、ops データベースを /opt/backup/ops_$(date +%F).sql.gz ファイルにバックアップする手動実行です。 [root@vm-002 ~]# mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(日付 +%F).sql.gz パスワードを入力してください: [root@vm-002 ~]# ls /opt/backup/ ops_2016-09-25.sql.gz -----------------
パラメータの説明:
-B: データベースを指定する -F: ログを更新 -R: バックアップ保存処理など -x: テーブルをロック --master-data: CHANGE MASTER ステートメントと binlog ファイルおよび場所の情報をバックアップ ステートメントに追加します。 -----------------
データベースのバックアップが完了すると、完全なバックアップデータが存在するため、データ損失を心配する必要はありません。 ! 上記の完全バックアップでは -F オプションが使用されているため、データ バックアップ操作が開始されると、システムによってログが自動的に更新され、新しい binlog ログが自動的に生成されます。この新しい binlog ログは、バックアップ後のデータベースの「追加、削除、および変更」操作を記録するために使用されます。
それをチェックしてください:
mysql> マスターステータスを表示します。 +------------------+----------+--------------+------------------+ | ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 106 | | | +------------------+----------+--------------+------------------+ セット内の 1 行 (0.00 秒) つまり、mysql-bin.000003 は、4:00 以降のデータベースに対するすべての「追加、削除、変更」操作を記録するために使用されます。 2)
朝9時に出勤します。業務上の必要性により、データベースに対してさまざまな「追加、削除、変更」操作が実行されます。
たとえば、ops データベースの member テーブルにデータが挿入または変更されます。 まず、午前中にデータを挿入します。
mysql> ops.member(`name`,`sex`,`age`,`classid`) に値を挿入します('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6'); クエリは正常、5 行が影響を受けました (0.08 秒) 記録: 5 重複: 0 警告: 0 mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | guohuihui | w | 27 | cls2 | | 3 | イーイー | w | 20 | cls1 | | 4 | シャオエル | m | 22 | cls3 | | 5 | 張三 | w | 21 | cls5 | | 6 | lisi | m | 20 | cls4 | | 7 | 王武 | w | 26 | cls6 | +----+-----------+-----+-----+---------+ セット内の行数は 7 です (0.00 秒) 3) 正午に、データ変更操作が再度実行されました。
mysql> update ops.member set name='李四' where id=4; クエリは正常、1 行が影響を受けました (0.07 秒) 一致した行: 1 変更された行: 1 警告: 0 mysql> update ops.member set name='小二' where id=2; クエリは正常、1 行が影響を受けました (0.06 秒) 一致した行: 1 変更された行: 1 警告: 0 mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | シャオエル | w | 27 | cls2 | | 3 | イーイー | w | 20 | cls1 | | 4 | リー・シ | 男性 | 22 | cls3 | | 5 | 張三 | w | 21 | cls5 | | 6 | lisi | m | 20 | cls4 | | 7 | 王武 | w | 26 | cls6 | +----+-----------+-----+-----+---------+ セット内の行数は 7 です (0.00 秒) 4)
午後18時、不可解な悲劇が起こりました!
誤って drop ステートメントを実行し、ops ライブラリを直接削除してしまいました。死ぬほど怖い! mysql> データベース操作を削除します。 クエリは正常、1 行が影響を受けました (0.02 秒) 5)
こんな時でも慌てないでください! ! !
まず、最後の binlog ログを注意深く確認し、重要な POS ポイントを記録します。どの POS ポイント操作がデータベースの破損を引き起こしたか (通常は最後の数ステップ)。 まず、最後の binlog ログ ファイルをバックアップします。 [root@vm-002 ~]# cd /var/lib/mysql/ [root@vm-002 mysql]# cp -v mysql-bin.000003 /opt/backup/ `mysql-bin.000003' -> `/opt/backup/mysql-bin.000003' [root@vm-002 mysql]# ls /opt/backup/ mysql-bin.000003 ops_2016-09-25.sql.gz 次に、ログ インデックスの更新操作を実行し、新しい binlog ログ ファイルを再起動します。 mysql-bin.000003は当然のことです
このファイルは、原因を分析してオペレーション ノードを見つけるのに便利なため、再度書き込まれることはありません。今後、すべてのデータベース操作は次のログ ファイルに書き込まれます。
mysql> ログをフラッシュします。 クエリは正常、影響を受けた行は 0 行 (0.13 秒) mysql> マスターステータスを表示します。 +------------------+----------+--------------+------------------+ | ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 106 | | | +------------------+----------+--------------+------------------+ セット内の 1 行 (0.00 秒) 6)
binlog ログを読み、問題を分析します。 binlog ログの読み取り方法は上記で説明しました。
方法 1: mysqlbinlog を使用して binlog ログを読み取ります。
[root@vm-002 ~]# cd /var/lib/mysql/ [root@vm-002 mysql]# mysqlbinlog mysql-bin.000003 方法2: サーバーにログインして表示する(推奨)
mysql> 'mysql-bin.000003' の binlog イベントを表示します。 +------------------+-----+-------------+-------------+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ | ログ名 | 位置 | イベント タイプ | サーバー ID | ログ終了位置 | 情報 | +------------------+-----+-------------+-------------+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ | mysql-bin.000003 | 4 | Format_desc | 1 | 106 | サーバーバージョン: 5.1.73-log、Binlog バージョン: 4 | | mysql-bin.000003 | 106 | クエリ | 1 | 173 | BEGIN | | mysql-bin.000003 | 173 | 整数 | 1 | 201 | INSERT_ID=3 | | mysql-bin.000003 | 201 | クエリ | 1 | 444 | `ops` を使用します。ops.member(`name`,`sex`,`age`,`gsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6') に挿入します | | mysql-bin.000003 | 444 | Xid | 1 | 471 | COMMIT /* xid=66 */ | | mysql-bin.000003 | 471 | クエリ | 1 | 538 | 開始 | | mysql-bin.000003 | 538 | クエリ | 1 | 646 | `ops` を使用します。update ops.member set name='李四' where id= | | mysql-bin.000003 | 646 | Xid | 1 | 673 | COMMIT /* xid=68 */ | | mysql-bin.000003 | 673 | クエリ | 1 | 740 | 開始 | | mysql-bin.000003 | 740 | クエリ | 1 | 848 | `ops` を使用します。ops.member を更新し、name='小等' を設定します (id= の場合) | | mysql-bin.000003 | 848 | Xid | 1 | 875 | COMMIT /* xid=69 */ | | mysql-bin.000003 | 875 | クエリ | 1 | 954 |データベース削除操作| | mysql-bin.000003 | 954 | 回転 | 1 | 997 | mysql-bin.000004;pos=4 | +------------------+-----+-------------+-------------+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ セット内の行数は 13 です (0.00 秒) または: mysql> 'mysql-bin.000003' の binlog イベントを表示します\G; ......... ......... ************************** 12 行目 **************************** ログ名: mysql-bin.000003 ポジション: 875 イベントタイプ: クエリ サーバーID: 1 終了ログ位置: 954 情報:データベース操作の削除 ************************** 13 行目 **************************** ログ名: mysql-bin.000003 ポジション: 954 イベントタイプ: 回転 サーバーID: 1 終了ログ位置: 997 情報: mysql-bin.000004;pos=4 セット内の行数は 13 です (0.00 秒) 分析の結果、データベースの損傷を引き起こした POS ポイント間隔は875 〜 954 (ログ間隔の POS ノードに基づいて計算)であり、 875 より前に復元するだけで済みます。 7)
まず、午前 4 時に完全バックアップ データを復元します。 [root@vm-002 ~]# cd /opt/backup/ [root@vm-002 バックアップ]# ls mysql-bin.000003 ops_2016-09-25.sql.gz [root@vm-002 バックアップ]# gzip -d ops_2016-09-25.sql.gz [root@vm-002 バックアップ]# mysql -uroot -p -v < ops_2016-09-25.sql パスワードを入力してください: -------------- /*!40101 @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT を設定します */ -------------- -------------- /*!40101 @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS を設定します */ -------------- ............. ............. -------------- /*!40111 SQL_NOTES=@OLD_SQL_NOTES を設定します */ -------------- これにより、同日早朝(4:00)までのバックアップデータがすべて復元されます。 mysql> show databases; #opsデータベースが復元されたことが分かりました mysql> ops を使用します。 テーブル名と列名の補完のためのテーブル情報の読み取り -Aでこの機能をオフにすると起動が速くなります。 データベースが変更されました mysql> テーブルを表示します。 +---------------+ | テーブル_in_ops | +---------------+ | メンバー | +---------------+ セット内の 1 行 (0.00 秒) mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | guohuihui | w | 27 | cls2 | +----+-----------+-----+-----+---------+ セット内の 2 行 (0.00 秒) マイSQL> しかし、これで復元されたのは当日の午前4時までのデータのみで、4:00~18:00の間のデータは復元されていません。 ! どうすればいいですか? 慌てないで!これは、前述の mysql-bin.000003 の新しい binlog ログに基づいて回復できます。
8)
binlogからデータを回復する 復元コマンドの構文形式は次のとおりです。 mysqlbinlog mysql-bin.0000xx | mysql -u ユーザー名 -p パスワード データベース名 -------------------------------------------------------- 共通パラメータオプションの説明: --start-position=875 開始位置 --stop-position=954 終了位置 --start-datetime="2016-9-25 22:01:08" 開始時刻 --stop-datetime="2019-9-25 22:09:46" 終了時間 --database=zyyshop は、zyyshop データベースのみを復元することを指定します (ホスト上には複数のデータベースが存在することが多く、ローカル ログのみが制限されます)
-------------------------------------------------------- あまり一般的ではないオプション: -u --user=name リモートホストに接続するためのユーザー名 -p --password[=name] リモートホストに接続するためのパスワード -h --host=name リモートホストからbinlogログを取得します --read-from-remote-server MySQL サーバーから binlog ログを読み取ります --------------------------------------------------------
概要: 実際には、読み取られた binlog ログの内容はパイプ文字を介して mysql コマンドに渡されます。これらのコマンドとファイルは、可能な限り絶対パスとして記述する必要があります。 a) 完全なリカバリ (vim を使用して mysql-bin.000003 を手動で編集し、drop ステートメントを削除する必要があります)
[root@vm-002 バックアップ]# /usr/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops b) pos エンドポイント回復 (部分回復) を指定します。
--stop-position=471 pos 終了ノード (トランザクション間隔に応じて 471) 知らせ: この pos 終了ノードは、「メンバー テーブルの元のデータ」と「name='李四'」を更新する前のデータの間にあるため、「name='李四'」を変更する前のデータを復元できます。
操作は以下のとおりです。
[root@vm-002 ~]# /usr/bin/mysqlbinlog --stop-position=471 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | guohuihui | w | 27 | cls2 | | 3 | イーイー | w | 20 | cls1 | | 4 | シャオエル | m | 22 | cls3 | | 5 | 張三 | w | 21 | cls5 | | 6 | lisi | m | 20 | cls4 | | 7 | 王武 | w | 26 | cls6 | +----+-----------+-----+-----+---------+ セット内の行数は 7 です (0.00 秒) 「name='李四'」が変更された時点までのデータを復元します(トランザクション間隔で673)
[root@vm-002 ~]# /usr/bin/mysqlbinlog --stop-position=673 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | guohuihui | w | 27 | cls2 | | 3 | イーイー | w | 20 | cls1 | | 4 | リー・シ | 男性 | 22 | cls3 | | 5 | 張三 | w | 21 | cls5 | | 6 | lisi | m | 20 | cls4 | | 7 | 王武 | w | 26 | cls6 | +----+-----------+-----+-----+---------+ セット内の行数は 7 です (0.00 秒) c) PSO ポイント間隔回復 (部分回復) を指定します。
name='李四'のデータを更新します。ログ間隔はPos[538] --> End_log_pos[646]です。トランザクション間隔はPos[471] --> End_log_pos[673]です。 name='小等'のデータを更新します。ログ間隔はPos[740] --> End_log_pos[848]、トランザクション間隔はPos[673] --> End_log_pos[875]です。 c1)
name='李四' を個別に復元するには、次のようにします。
binlog ログ間隔に従って個別に復元します。
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=538 --stop-position=646 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops トランザクション間隔ごとに個別に回復する [root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=471 --stop-position=673 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops c2)
name='小二' を個別に復元するには、次のようにします。 binlog ログ間隔に従って個別に復元します。 [root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=740 --stop-position=848 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops トランザクション間隔ごとに個別に回復する [root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=673 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops c3)
name='李四' と name='小二' のマルチステップ操作を一緒に復元するには、トランザクション間隔に従う必要があります。これは次のように実行できます。 [root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=471 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops データベースを表示します:
mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | シャオエル | w | 27 | cls2 | | 3 | イーイー | w | 20 | cls1 | | 4 | リー・シ | 男性 | 22 | cls3 | | 5 | 張三 | w | 21 | cls5 | | 6 | lisi | m | 20 | cls4 | | 7 | 王武 | w | 26 | cls6 | +----+-----------+-----+-----+---------+ セット内の行数は 7 です (0.00 秒) このようにして、削除前のデータの状態が復元されます! ! 加えて: リカバリ(部分リカバリ)のタイムノード間隔を指定することもできます。 POS ノード方式によるリカバリのほかに、時間ノード間隔を指定して復元することもできます。時間で復元するには、mysqlbinlog コマンドを使用して binlog ログの内容を読み取り、時間ノードを見つける必要があります。 上記のように、誤って ops ライブラリを削除した後:
まず完全なバックアップの復元を実行します [root@vm-002 バックアップ]# mysql -uroot -p -v < ops_2016-09-25.sql オペレーションデータベースを表示する
mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | guohuihui | w | 27 | cls2 | +----+-----------+-----+-----+---------+ セット内の 2 行 (0.00 秒) マイSQL>
mysq-bin00003ログをチェックしてタイムノードを見つける
[root@vm-002 ~]# cd /var/lib/mysql [root@vm-002 mysql]# mysqlbinlog mysql-bin.000003 ............. ............. 始める //*!*/; # 173 で #160925 21:57:19 サーバーID 1 end_log_pos 201 Intvar INSERT_ID=3/*!*/ を設定します。 # 201 で #160925 21:57:19 サーバー ID 1 end_log_pos 444 クエリ thread_id=3 exec_time=0 error_code=0 `ops`/*!*/ を使用します。 タイムスタンプを 1474811839/*!*/ に設定します。 insert into ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6') #実行されたSQL文 //*!*/; # 444 で #160925 21:57:19サーバーID 1 end_log_pos 471 Xid = 66 #実行時間の開始 専念/*!*/; # 471 で #160925 21:58:41サーバー ID 1 end_log_pos 538 クエリ thread_id=3 exec_time=0 error_code=0 #終了時間 タイムスタンプを 1474811921/*!*/ に設定します。 始める //*!*/; # 538 で #160925 21:58:41サーバー ID 1 end_log_pos 646 クエリ thread_id=3 exec_time=0 error_code=0 タイムスタンプを 1474811921/*!*/ に設定します。 update ops.member set name='李四' where id=4 #実行されたSQL文 //*!*/; # 646 で #160925 21:58:41サーバーID 1 end_log_pos 673 Xid = 68 #実行時間の開始 専念 /*!*/; # 673 で #160925 21:58:56サーバー ID 1 end_log_pos 740 クエリ thread_id=3 exec_time=0 error_code=0 #終了時間 タイムスタンプを 1474811936/*!*/ に設定します。 始める //*!*/; # 740 で #160925 21:58:56 サーバー ID 1 end_log_pos 848 クエリ thread_id=3 exec_time=0 error_code=0 タイムスタンプを 1474811936/*!*/ に設定します。 update ops.member set name='小二' where id=2 #実行されたSQL文 //*!*/; # 848 で #160925 21:58:56サーバーID 1 end_log_pos 875 Xid = 69 #実行時間の開始 専念 /*!*/; # 875 で #160925 22:01:08サーバー ID 1 end_log_pos 954 クエリ thread_id=3 exec_time=0 error_code=0 #終了時間 タイムスタンプを 1474812068/*!*/ に設定します。 データベース操作の削除 //*!*/; # 954 で #160925 22:09:46 サーバー ID 1 end_log_pos 997 mysql-bin.000004 にローテーション pos: 4 区切り文字 ; # ログファイルの終了 ROLLBACK /* mysqlbinlog によって追加されました */; /*!50003 COMPLETION_TYPE を @OLD_COMPLETION_TYPE に設定*/; 「name='李四'」を変更する前のデータに復元します
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:57:19" --stop-datetime="2016-09-25 21:58:41" -- データベース=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | guohuihui | w | 27 | cls2 | | 3 | イーイー | w | 20 | cls1 | | 4 | シャオエル | m | 22 | cls3 | | 5 | 張三 | w | 21 | cls5 | | 6 | lisi | m | 20 | cls4 | | 7 | 王武 | w | 26 | cls6 | +----+-----------+-----+-----+---------+ セット内の行数は 7 です (0.00 秒) [root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:58:41" --stop-datetime="2016-09-25 21:58:56" --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | guohuihui | w | 27 | cls2 | | 3 | イーイー | w | 20 | cls1 | | 4 | リー・シ | 男性 | 22 | cls3 | | 5 | 張三 | w | 21 | cls5 | | 6 | lisi | m | 20 | cls4 | | 7 | 王武 | w | 26 | cls6 | +----+-----------+-----+-----+---------+ セット内の行数は 7 です (0.00 秒)
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:58:56" --stop-datetime="2016-09-25 22:01:08" --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops mysql> メンバーから * を選択します。 +----+-----------+-----+-----+---------+ | ID | 名前 | 性別 | 年齢 | クラス ID | +----+-----------+-----+-----+---------+ | 1 | 王世博 | m | 27 | cls1 | | 2 | シャオエル | w | 27 | cls2 | | 3 | イーイー | w | 20 | cls1 | | 4 | リー・シ | 男性 | 22 | cls3 | | 5 | 張三 | w | 21 | cls5 | | 6 | lisi | m | 20 | cls4 | | 7 | 王武 | w | 26 | cls6 | +----+-----------+-----+-----+---------+ セット内の行数は 7 です (0.00 秒)
このように削除前の状態が復元されます!
要約:
リカバリーとは、バイナリログ内の指定された段落間隔に保存された SQL 文を MySQL に 1 つずつ再実行させることです。 上記のMySQL binlogログの説明とbinlogログを使用してデータを回復する方法は、編集者が皆さんと共有する内容のすべてです。参考になれば幸いです。また、123WORDPRESS.COMを応援していただければ幸いです。 以下もご興味があるかもしれません:- mysql バイナリ ログ ファイル データベースの復元
- MySQLデータベースのログファイル(binlog)を自動的に復元する方法を説明します
- MySQLバイナリログを介してデータベースデータを復元する方法の詳細な説明
- MySQLはデータ復旧を実装するためにbinlogログを使用する
- ログファイルからMySQLデータを復元する方法を教えます
|