0.フラッシュバックツールの概要
-
公式ツールmysqlbinlog
はすぐに開始でき、オフライン分析をサポートしますが、互換性が低くなります。 -
独立したツールbinlog2sqlは、binlogをプルするスレーブになりすまして処理されます。
優れた互換性。インストールと使用は簡単ですが、オフライン分析をサポートしていないため、MySQLをオンにする必要があります。
1.Binlogの紹介
、Binlog(バイナリログファイル)は、テーブル構造の変更のためのDDLステートメント、テーブルデータの変更のためのDMLステートメント、およびアクセス許可ステータスのためのDCLステートメントを含む、すべてのデータベースイベントを記録する論理ログです。
DML:insert update delete
DCL: grant revoke lock
DDL: create drop alter truncate
Binlogは、SELECTやSHOWなどの操作を記録しません。これらの操作はデータ自体を変更しないためですが、general_logにクエリを実行して、MySQLが実行したすべてのステートメントを表示できます。
データベースで発生する変更操作(DDL、DCL、DML)を記録します(SQLステートメントレコードと同様)。
2.ビンログ機能
数据恢复。
主从复制。
3.Binlogの構成方法
デフォルト:無効
vim /etc/my.cnf
server_id=66
binlog_format = ROW
log_bin = /data/3306/binlog/mysql-bin
log_bin_index = /data/3306/binlog/mysql-bin.index
# 强烈建议再开启GTID
gtid_mode=on # 开关
enforce_gtid_consistency=on # 强制GTID一致性
log_slave_updates=ON # 强制从库更新binlog
GTID (Global transaction identifiers) 全局事务ID
全局唯一:对每个事务,进行单独编号。连续不断进行增长。
GTID具有幂等性
表示方式
GTID 分两部分(uuid:trans_id)
mysql> select @@log_bin;
+-----------+
| @@log_bin |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
mysql> select @@log_bin_basename;
+-----------------------------+
| @@log_bin_basename |
+-----------------------------+
| /data/3306/binlog/mysql-bin |
+-----------------------------+
1 row in set (0.00 sec)
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 66 |
+-------------+
1 row in set (0.00 sec)
mysql> select @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| ROW |
+-----------------+
1 row in set (0.00 sec)
4.DDL誤操作の回復
アイデアの処理:
データベースにログインしてエンドポイントを見つける(データベースを削除する);
開始点を見つける(データベースを構築する);
開始点の前にbinlogログをインターセプトしてエンドポイントに到達する;インターセプトされたbinlogログを
復元する。
找终点(删库操作)----查看当前的binlog文件
show master status;
+------------------+----------+--------------+------------------+---------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+---------------------------------------------+
| mysql-bin.000010 | 353 | | | ffc6b8d8-402f-11eb-982a-00163e2ebbf7:1-1826 |
+------------------+----------+--------------+------------------+---------------------------------------------+
查看当前binlog文件确定终点的position号或者GTID号
show binlog events in 'mysql-bin.000010';
..............
| mysql-bin.000010 | 3427 | Xid | 66 | 3458 | COMMIT /* xid=32988 */ |
| mysql-bin.000010 | 3458 | Gtid | 66 | 3523 | SET @@SESSION.GTID_NEXT= 'ffc6b8d8-402f-11eb-982a-00163e2ebbf7:1824' |
| mysql-bin.000010 | 3523 | Query | 66 | 3738 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*13D630121C940C9189D36C6EB7E03304BB59A837' |
| mysql-bin.000010 | 3738 | Gtid | 66 | 3803 | SET @@SESSION.GTID_NEXT= 'ffc6b8d8-402f-11eb-982a-00163e2ebbf7:1825' |
| mysql-bin.000010 | 3803 | Query | 66 | 3897 | DROP DATABASE `test`
刷新新的binlog文件:
flush logs;
找起点(建库操作)
mysql> pager grep 'create database test';
PAGER set to 'grep 'create database test''
经过查找确认在6号文件
mysql> show binlog events in 'mysql-bin.000006';
......
| mysql-bin.000006 | 12131489 | Query | 66 | 12131583 | create database test xxxx
......
| mysql-bin.000006 | 16767492 | Query | 66 | 16767616 | use `test`; /*!40000 ALTER TABLE `t_yq_from_to` ENABLE KEYS */ |
| mysql-bin.000006 | 16767616 | Stop | 66 | 16767639 | |
+------------------+---------+----------------+-----------+-------------+----------------------------------------------------------------------+
15574 rows in set (0.02 sec)
現在、ライブラリを作成するためのbinlogはファイル番号6で、DROPライブラリはファイル番号10です。
方法1:GTIDに基づいてインターセプトし、グローバルトランザクション番号は一意です。
方法2:位置に基づいてインターセプトし、ファイルごとにインターセプトします。
非常に効率的な、その時点で最初の方法を使用します。次に、2番目の方法を使用します。方法は似ています。
查找7号文件的起点和终点
+------------------+---------+----------------+-----------+-------------+----------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+---------+----------------+-----------+-------------+----------------------------------------------------------------------+
| mysql-bin.000007 | 4 | Format_desc | 66 | 123 | Server ver: 5.7.28-log, Binlog ver: 4 |
| mysql-bin.000007 | 123 | Previous_gtids | 66 | 154 | |
| mysql-bin.000007 | 154 | Anonymous_Gtid | 66 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
..............
| mysql-bin.000007 | 22230466 | Delete_rows | 66 | 22230574 | table_id: 123 flags: STMT_END_F |
| mysql-bin.000007 | 22230574 | Xid | 66 | 22230605 | COMMIT /* xid=20521 */ |
| mysql-bin.000007 | 22230605 | Stop | 66 | 22230628 |
+------------------+---------+----------------+-----------+-------------+----------------------------------------------------------------------+
查找8号文件的起点和终点
+------------------+---------+----------------+-----------+-------------+----------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+---------+----------------+-----------+-------------+----------------------------------------------------------------------+
| mysql-bin.000008 | 4 | Format_desc | 66 | 123 | Server ver: 5.7.28-log, Binlog ver: 4 |
| mysql-bin.000008 | 123 | Previous_gtids | 66 | 154 | |
| mysql-bin.000008 | 154 | Gtid | 66 | 219 | SET @@SESSION.GTID_NEXT= 'ffc6b8d8-402f-11eb-982a-00163e2ebbf7:1' |
| mysql-bin.000008 | 219 | Query | 66 | 302 | use `kodcloud`; FLUSH TABLES |
.......
| mysql-bin.000008 | 394042 | Xid | 66 | 394073 | COMMIT /* xid=2085 */ |
| mysql-bin.000008 | 394073 | Stop | 66 | 394096 | |
+------------------+---------+----------------+-----------+-------------+----------------------------------------------------------------------+
查找9号文件的起点和终点
+------------------+---------+----------------+-----------+-------------+----------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+---------+----------------+-----------+-------------+----------------------------------------------------------------------+
| mysql-bin.000009 | 4 | Format_desc | 66 | 123 | Server ver: 5.7.28-log, Binlog ver: 4 |
| mysql-bin.000009 | 123 | Previous_gtids | 66 | 194 | ffc6b8d8-402f-11eb-982a-00163e2ebbf7:1-168 |
| mysql-bin.000009 | 194 | Gtid | 66 | 259 | SET @@SESSION.GTID_NEXT= 'ffc6b8d8-402f-11eb-982a-00163e2ebbf7:169' |
| mysql-bin.000009 | 259 | Query | 66 | 336 | BEGIN |
.........
| mysql-bin.000009 | 9760280 | Table_map | 66 | 9760346 | table_id: 108 (wordpress.wp_options) |
| mysql-bin.000009 | 9760346 | Delete_rows | 66 | 9760454 | table_id: 108 flags: STMT_END_F |
| mysql-bin.000009 | 9760454 | Xid | 66 | 9760485 | COMMIT /* xid=32005 */ |
| mysql-bin.000009 | 9760485 | Rotate | 66 | 9760532 | mysql-bin.000010;pos=4 |
+------------------+---------+----------------+-----------+-------------+----------------------------------------------------------------------+
テストライブラリの下でログをインターセプトします(この場合、位置番号に従ってログをインターセプトし、GTIDべき等性チェックをスキップする必要があります)
mysqlbinlog -d test --skip-gtids --start-position=12131489 --stop-position=16767616 /data/3306/binlog/mysql-bin.000006 >/root/6.sql
mysqlbinlog -d test --skip-gtids --start-position=4 --stop-position=22230605 /data/3306/binlog/mysql-bin.000007 >/root/7.sql
mysqlbinlog -d test --skip-gtids --start-position=4 --stop-position=394073 /data/3306/binlog/mysql-bin.00000 >/root/8.sql
mysqlbinlog -d test --skip-gtids --start-position=4 --stop-position=9760485 /data/3306/binlog/mysql-bin.000009 >/root/9.sql
mysqlbinlog -d test --skip-gtids --start-position=4 --stop-position=3803 /data/3306/binlog/mysql-bin.000010 >/root/10.sql
傍受されたbinlogログを復元する
mysql -uroot -p
set sql_log_bin=0; 临时关闭当前窗口的二进制日志
source /root/6.sql;
source /root/7.sql;
source /root/8.sql;
source /root/9.sql;
source /root/10.sql;
set sql_log_bin=1;
e.检验是否恢复成功
mysql> use test;
Database changed
mysql> show tables;
+-----------------------------------------+
| Tables_in_test |
+-----------------------------------------+
| con_info_xxxxx |
| con_xxxxxxxx_area |
| con_xxxxxxxxxxxxxxxxxxrea_ref |
| xxxxxxxxxxxxxxxxxxxure_area_ref |
| xxxxxxxxxxxxxxxxxxxe_log |
| ........ |
| water_cxxxxxxxxn_view |
+-----------------------------------------+
92 rows in set (0.02 sec)
抽查表中数据是否正确
mysql> select count(*) from test.t_yq_province_num;
+----------+
| count(*) |
+----------+
| 337 |
+----------+
5.DMLの誤操作の回復
日常業務では、更新、バッチの削除の誤操作など、DMLの誤操作のいくつかの状況にも遭遇します。binlog2sqlを使用して、すばやくロールバックできます。
binlog2sqlは、Pythonで開発されたオープンソースのMySQL Binlog解析ツールであり、Binlogを元のSQLに解析できます。また、データ回復のためにBinlogをロールバックされたSQLに解析することもサポートしています。
binlog2sqlをインストールします
git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
yum install python3
cd binlog2sql-master
pip3 install -r requirements.txt
pip3 show pymysql
pip3 install --upgrade PyMySQL
ログイベントSQLの解析
a。パラメータオプション
基本パラメータ
-h host
-P port
-u user
-p password
解析モード
--stop-never 持续解析binlog。可选。默认False,同步至执行命令时最新的binlog位置。
-B 生成回滚SQL,可解析大文件,不受内存限制。可选。默认False。与stop-never或no-primary-key不能同时添加。
--back-interval -B模式下,每打印一千行回滚SQL,加一句SLEEP多少秒,如不想加SLEEP,请设为0。可选。默认1.0。
解像度範囲制御
--start-file 起始解析文件,只需文件名,无需全路径 。
--start-position/--start-pos 起始解析位置。可选。默认为start-file的起始位置。
--stop-file/--end-file 终止解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。
--stop-position/--end-pos 终止解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效。
--start-datetime 起始解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。
--stop-datetime 终止解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。
オブジェクトフィルタリング
-d, --databases 只解析目标db的sql,多个库用空格隔开,如-d db1 db2。可选。默认为空。
-t, --tables 只解析目标table的sql,多张表用空格隔开,如-t tbl1 tbl2。可选。默认为空。
--only-dml 只解析dml,忽略ddl。可选。默认False。
--sql-type 只解析指定类型,支持INSERT, UPDATE, DELETE。多个类型用空格隔开,如--sql-type INSERT DELETE。
b。テーブルのbinlogを個別にフィルタリングします
cd /root/binlog2sql/binlog2sql/
# python3 binlog2sql.py -h 127.0.0.1 -P3306 -uroot -p123 -d test1 -t t1 --start-file='mysql-bin.000003'
INSERT INTO `test1`.`t1`(`id`) VALUES (1); #start 1647 end 1891 time 2020-09-18 08:46:53 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (2); #start 1922 end 2166 time 2020-09-18 08:46:54 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (3); #start 3125 end 3369 time 2020-09-18 08:47:50 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (4); #start 3400 end 3644 time 2020-09-18 08:47:53 gtid
c。特定のタイプのbinlogを個別にフィルタリングする
python3 binlog2sql.py -h 127.0.0.1 -P3306 -uroot -p123 -d test1 -t t1 --sql-type=delete --start-file='mysql-bin.000003'
DELETE FROM `test1`.`t1` WHERE `id`=3 LIMIT 1; #start 5172 end 5416 time 2020-09-18 09:17:48 gtid
python3 binlog2sql.py -h 127.0.0.1 -P3306 -uroot -p123 -d test1 -t t1 --sql-type=update --start-file='mysql-bin.000003'
UPDATE `test1`.`t1` SET `id`=10 WHERE `id`=1 LIMIT 1; #start 4882 end 5141 time 2020-09-18 09:17:35 gtid
d。指定されたイベントロールバックステートメントを生成します
python3 binlog2sql.py -h 127.0.0.1 -P3306 -uroot -p123 -d test -t t1 --start-file='mysql-bin.000003' --sql-type=delete --start-position=932 --stop-position=1198 -B >/tmp/flashback.sql
mysql -uroot -p
source /tmp/flashback.sql
よりエキサイティングなコンテンツについては、WeChatパブリックアカウントに注意してください。