MySQL:binlog的开启和数据恢复

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL:binlog的开启和数据恢复

测试环境

Mac OS 10.11.6

mysql 5.7.21

python 3.6.5


开启binlog

1、检查是否开启binlog


mysql>show variables like '%log_bin%';

2、开启binlog

mysql的配置文件路径查找优先级为

/etc/my.cnf

/etc/mysql/my.cnf

/usr/local/etc/my.cnf


通过Homebrew安装的my.cnf放在/usr/local/etc/中


$ vim my.cnf


[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

3、重启服务

$ mysql.server restart


4、再次检查是否开启binlog


5、查看日志文件:


$ cd /usr/local/var/mysql
$ ls

数据恢复

0、几个术语

数据查询语言DQL

数据操纵语言DML

数据定义语言DDL

数据控制语言DCL


1、MySQL闪回原理

delete操作,delete -> insert

insert操作,insert -> delete

update操作,交换SET和WHERE


恢复实战

1、确认binlog已开启

2、数据准备

(1) 建表


mysql> use demo
mysql> CREATE TABLE `user` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(20) DEFAULT '',
  `age` tinyint(3) DEFAULT '0',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表测试';

(2) 插入数据


mysql> INSERT INTO `user` (`name`, `age`)
VALUES 
    ('小王', 21), 
    ('小张', 22), 
    ('小红', 22), 
    ('小楠', 23), 
    ('小柱', 25);

(3) 查看数据


mysql> select * from user;
+----+--------+------+---------------------+
| id | name   | age  | create_time         |
+----+--------+------+---------------------+
|  1 | 小王   |   21 | 2019-01-21 18:18:41 |
|  2 | 小张   |   22 | 2019-01-21 18:18:41 |
|  3 | 小红   |   22 | 2019-01-21 18:18:41 |
|  4 | 小楠   |   23 | 2019-01-21 18:18:41 |
|  5 | 小柱   |   25 | 2019-01-21 18:18:41 |
+----+--------+------+---------------------+

(4) 删除数据


mysql> delete from user;

(5)确认数据被删除


mysql> select * from user;
Empty set (0.00 sec)

3、数据恢复

(1)下载所需工具


> git clone https://github.com/danfengcao/binlog2sql.git
> cd binlog2sql
> pip install -r requirements.txt

(2)查看目前的binlog


mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       467 |
| mysql-bin.000002 |       732 |
| mysql-bin.000003 |      4574 |
+------------------+-----------+

最新的biglog是 mysql-bin.000003


(3)查找删除语句



$ python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'123456' -ddemo -tuser --start-file='mysql-bin.000003' --start-datetime='2019-01-21 18:10:00' --stop-datetime='2019-01-21 18:25:00' > raw.sql
$ more raw.sql

字段说明

-h127.0.0.1  # 数据库地址
-P3306  # 端口号
-uroot # 用户名
-p'123456'  # 密码
-ddemo  # 数据库名称
-tuser  # 表名称
--start-file='mysql-bin.000003'  # binlog日志文件
--start-datetime='2019-01-21 18:10:00' # 开始时间
--stop-datetime='2019-01-21 18:25:00'  # 结束时间

找到DELETE语句中类似如下字段,回忆一下时间是否差不多


#start 4228 end 4543 time 2019-01-21 18:20:15

(4)生成回滚语句


$ python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'123456' -ddemo -tuser --start-file='mysql-bin.000003' --start-position=4228 --stop-position=4543 -B > rollback.sql
$ more rollback.sql

(5) 执行回滚操作

其实就是重新插入数据


$ mysql -h127.0.0.1 -P3306 -uroot -p'123456' < rollback.sql

(6) 检查数据恢复情况

mysql> select * from user;
+----+--------+------+---------------------+
| id | name   | age  | create_time         |
+----+--------+------+---------------------+
|  1 | 小王   |   21 | 2019-01-21 18:18:41 |
|  2 | 小张   |   22 | 2019-01-21 18:18:41 |
|  3 | 小红   |   22 | 2019-01-21 18:18:41 |
|  4 | 小楠   |   23 | 2019-01-21 18:18:41 |
|  5 | 小柱   |   25 | 2019-01-21 18:18:41 |
+----+--------+------+---------------------+

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
768 4
|
5天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
1月前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志(Redo Log)和二进制日志(Binary Log)是两种重要的日志系统。重做日志主要用于保证事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务更改。二进制日志则记录了数据库的所有逻辑变化操作,用于数据的复制、恢复和审计。两者在写入时机、存储方式、配置参数和使用范围上有所不同,共同确保了数据库的稳定性和可靠性。
|
3月前
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
361 11
|
2月前
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
150 0
|
4月前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
469 2
|
4月前
|
SQL 关系型数据库 MySQL
【MySQL】根据binlog日志获取回滚sql的一个开发思路
【MySQL】根据binlog日志获取回滚sql的一个开发思路
|
4月前
|
监控 关系型数据库 MySQL
MySQL如何快速获取binlog的开始时间和结束时间
【8月更文挑战第17天】在MySQL中快速获取binlog的开始与结束时间可通过多种途径:1) 使用`mysqlbinlog`结合`head`和`tail`命令查看单个或多个binlog文件的时间范围;2) 查询`information_schema.binlog_events`表获取近似的开始与结束时间戳;3) 利用第三方工具如Percona Toolkit的`pt-mysql-summary`获取binlog信息。选择适当方法前应考虑操作环境及数据安全性。
454 2
|
4月前
|
关系型数据库 MySQL Shell
MySQL回滚脚本: 误操作delete binlog回滚shell脚本
MySQL回滚脚本: 误操作delete binlog回滚shell脚本
|
4月前
|
关系型数据库 MySQL 数据库
MySQL回滚工具:binlog 闪回工具 MyFlash工具
MySQL回滚工具:binlog 闪回工具 MyFlash工具