MySQL--------基于binlog实现闪回最佳实战
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,1. 背景* 为了数据安全,搭建了主从。实时主从备份只能防止硬件问题,比如主库的硬盘损坏。但对于误操作,则无能为力。比如在主库误删一张表,或者一个update语句没有指定where条件,导致全表被更新
千家信息网最后更新 2025年02月05日MySQL--------基于binlog实现闪回最佳实战
1. 背景
* 为了数据安全,搭建了主从。实时主从备份只能防止硬件问题,比如主库的硬盘损坏。但对于误操作,则无能为力。比如在主库误删一张表,或者一个update语句没有指定where条件,导致全表被更新。当操作被同步到从库上后,则主从都"回天无力"。
* 闪回用于快速恢复由于误操作丢失的数据。在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos)。比如忘了带where条件的update、delete操作,传统的恢复方式是利用全备+二进制日志前滚进行恢复,相比于传统的全备+增备,flashback显然更为快速、简单。
2. 测试环境
mysql> show variables like 'version';+---------------+------------+| Variable_name | Value |+---------------+------------+| version | 5.6.36-log |+---------------+------------+1 row in set (0.03 sec)mysql> show variables like 'datadir';+---------------+--------------------+| Variable_name | Value |+---------------+--------------------+| datadir | /data/mysql_data6/ |+---------------+--------------------+1 row in set (0.00 sec)mysql> show variables like 'log_bin';+---------------+-------+| Variable_name | Value |+---------------+-------+| log_bin | ON |+---------------+-------+1 row in set (0.00 sec)mysql> show variables like 'binlog_format';+---------------+-------+| Variable_name | Value |+---------------+-------+| binlog_format | ROW |+---------------+-------+1 row in set (0.00 sec)mysql> show variables like 'binlog_row_p_w_picpath';+------------------+-------+| Variable_name | Value |+------------------+-------+| binlog_row_p_w_picpath | FULL |+------------------+-------+1 row in set (0.00 sec)
3. 闪回实战
* 创建数据库与测试表,并插入数据
mysql> create table users( -> id BIGINT NOT NULL AUTO_INCREMENT, -> name VARCHAR(255) NOT NULL, -> sex ENUM('M', 'F') NOT NULL DEFAULT 'M', -> age INT UNSIGNED NOT NULL DEFAULT '0', -> PRIMARY KEY (id) -> )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;Query OK, 0 rows affected (0.04 sec)mysql> insert into users values(null, 'tom', 'M', 25), (null, 'jak', 'F', 32), (null, 'ses', 'M', 45), (null, 'lisea', 'M', 35);Query OK, 4 rows affected (0.13 sec)Records: 4 Duplicates: 0 Warnings: 0mysql> select * from users;+----+-------+-----+-----+| id | name | sex | age |+----+-------+-----+-----+| 1 | tom | M | 25 || 2 | jak | F | 32 || 3 | ses | M | 45 || 4 | lisea | M | 35 |+----+-------+-----+-----+4 rows in set (0.00 sec)
* 下载闪回工具binlog2sql[ 由上海美团DBA团队出品 ]
[root@MySQL ~]# git clone https://github.com/danfengcao/binlog2sql.gitInitialized empty Git repository in /root/binlog2sql/.git/remote: Counting objects: 244, done.remote: Total 244 (delta 0), reused 0 (delta 0), pack-reused 244Receiving objects: 100% (244/244), 121.72 KiB | 27 KiB/s, done.Resolving deltas: 100% (124/124), done.
* 安装相关依赖
[root@MySQL ~]# yum install pip -y[root@MySQL ~]# pip install --upgrade pip[root@MySQL ~]# pip install -r binlog2sql/requirements.txt
* 提前刷新binlog [ 测试中好区分文件 ]
mysql> flush logs;Query OK, 0 rows affected (0.02 sec)
* 查看当前binlog信息
mysql> show master status;+------------+----------+--------------+------------------+-------------------------------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------+----------+--------------+------------------+-------------------------------------------+| bin.000006 | 191 | | | c7f82640-6b2d-11e7-9316-000c29f0b169:1-22 |+------------+----------+--------------+------------------+-------------------------------------------+1 row in set (0.01 sec)
* 误操作,delete没带where条件
mysql> delete from users;Query OK, 4 rows affected (0.01 sec)
* binlog2sql工具通过文件输出操作信息,定位SQL开始位置与结束位置
可通过--start-datetime与--stop-datetime定位时间
由此得到开始position为239,结束position为483
[root@MySQL ~]# python binlog2sql/binlog2sql/binlog2sql.py -hlocalhost -P3306 -uroot -p'123' -dmytest -tusers --start-file='bin.000006' DELETE FROM `mytest`.`users` WHERE `age`=25 AND `sex`='M' AND `id`=1 AND `name`='tom' LIMIT 1; #start 239 end 483 time 2017-07-19 01:02:49DELETE FROM `mytest`.`users` WHERE `age`=32 AND `sex`='F' AND `id`=2 AND `name`='jak' LIMIT 1; #start 239 end 483 time 2017-07-19 01:02:49DELETE FROM `mytest`.`users` WHERE `age`=45 AND `sex`='M' AND `id`=3 AND `name`='ses' LIMIT 1; #start 239 end 483 time 2017-07-19 01:02:49DELETE FROM `mytest`.`users` WHERE `age`=35 AND `sex`='M' AND `id`=4 AND `name`='lisea' LIMIT 1; #start 239 end 483 time 2017-07-19 01:02:49
* binlog2sql通过flashback生成回滚SQL
[root@MySQL ~]# python binlog2sql/binlog2sql/binlog2sql.py -hlocalhost -P3306 -uroot -p'123' -dmytest -tusers --start-file='bin.000006' --start-position=239 --stop-position=483 -B > rollback.sql
* 导入回滚SQL [ 导入前检查SQL语句是否正常 ]
[root@MySQL ~]# mysql -hlocalhost -uroot -p'123' < rollback.sql
* 查看
mysql> select * from mytest.users;+----+-------+-----+-----+| id | name | sex | age |+----+-------+-----+-----+| 1 | tom | M | 25 || 2 | jak | F | 32 || 3 | ses | M | 45 || 4 | lisea | M | 35 |+----+-------+-----+-----+4 rows in set (0.00 sec)
4. 总结
以需求驱动技术,技术本身没有优略之分,只有业务之分。
数据
主从
条件
测试
传统
位置
信息
工具
技术
数据库
文件
时间
语句
全备
定位
实战
无能
安全
无能为力
回天无力
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
mvn编写数据库抽取
psql数据库
软件开发的活动背景
云加互联网科技有限公司
网络安全教育广播稿大学生
商品销售管理系统数据库文档
汪存友网络技术
新一代加密数据库
我国食品安全大数据库
宁波手机软件开发项目管理
pascal数据库
传感器网络安全体系结构图
财富数据库杨冰
西安医学软件开发
数据库创建和使用代码
网络安全法何时开始的
龙口ios软件开发公司
德阳软件开发商家
数据库的创建和管理心得
云服务器 ddos
丁甲网络技术服务有限公司
释放数据库资源
法院系统网络安全测评报告
网络安全工作通报制度
吉林省中小学校园网络安全
计算机网络技术专业的面试
写个页面查询数据库数据
网络安全知识教育演讲稿
广东智慧养老软件开发
联想sr588服务器备份数据库