视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL通过binlog恢复数据的方法介绍(代码示例)
2020-11-09 08:40:49 责编:小采
文档


mysql 按照功能分为服务层模块和存储引擎层模块,服务层负责客户端连接、SQL 语句处理优化等操作,存储引擎层负责数据的存储和查询;binlog 属于服务层模块的日志,即引擎无关性,所有数据引擎的数据更改都会记录binlog日志。当数据库发生崩溃时,如果使用InnoDB 引擎,binlog 日志还可以检验 InnoDB 的 redo 日志的 commit 情况。

binlog 日志开启

日志开启方式:

1、添加配置

log_bin=ON
log_bin_basename=/path/bin-log
log_bin_index=/path/bin-log.index

2、仅仅设置log-bin参数

 log-bin=/path/bin-log

当开启 binlog 日志之后,mysql 会创建一个 log_bin_index 指定的 .index 文件和多个二进制日志文件,index 中按顺序记录了mysql使用的所有 binlog 文件。binlog 日志则会以指定的名称(或默认值) 加自增的数字作为后缀,ex:bin-log.000001,当发生下述三种情况时,binlog 日志便会进行重建:

文件大小达到 max_binlog_size 参数的值
执行 flush logs 命令
重启 mysql 服务

binlog 日志格式

通过参数 binlog_format 参数的值,可以设置 binlog 的格式,可选值有 statement、row、mixed

 * statement 格式:记录数据库执行的原始 SQL 语句
 * row 格式:记录具体的行的修改,这个为目前默认值
 * mixed 格式:因为上边两种格式各有优缺点,所以就出现了 mixed 格式

binlog 日志查看工具:mysqlbinlog

因为 binlog 是二进制文件,不能像其他文件一样,直接打开查看。但 mysql 提供了binlog 查看工具 mysqlbinlog,可以解析二进制文件。当然不同格式的日志解析结果是不一样的;

1. statement 格式日志,执行 mysqlbinlog /path/bin-log.000001,可以直接看到原始执行的 SQL 语句
2. row格式日志,则可读性没有那么好,但仍可通过参数使文档更加可读 mysqlbinlog -v /path/bin-log.000001

mysqlbinlog两对非常重要的参数

 1. --start-datetime --stop-datetime 解析某一个时间段内的binlog;
 2. --start-position --stop-position 解析在两个position之间的binlog;

使用 binlog 恢复数据:

使用 binlog 恢复数据,本质上就是通过 binlog 找到所有 DML 操作,去掉错误的 SQL 语句,然后重走一遍长征路,就可以将数据恢复;

线下实操:

创建数据表并插入初始值

 CREATE TABLE `users` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(255) DEFAULT NULL,
 `age` int(8) DEFAULT NULL,
 PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 INSERT INTO `users` (`id`, `name`, `age`)
 VALUES
 (null, '姓名一', 5);

找到上一次全量备份的数据库和binlog的position(ps:当然也可以通过时间进行恢复)。此处以目前状态作为备份的初始值,

 mysqldump -uroot -p T > /path/xxx.sql; # 备份数据库
 show master status; # 查看当前的position位置,此时值为154

插入多条记录

 INSERT INTO `users` (`id`, `name`, `age`)
 VALUES
 (null, '姓名二', 13),
 (null, '姓名三', 14),
 (null, '姓名四', 15),
 (null, '姓名五', 16),
 (null, '姓名六', 17);

进行误操作,并且在误操作之后又插入几条数据

update users set age = 5;
 INSERT INTO `users` (`id`, `name`, `age`)
 VALUES
 (null, '姓名七', 16),
 (null, '姓名八', 18);

发现误操作之后,进行数据恢复,首先停止 mysql 对外的服务,利用备份数据恢复到上次数据;

通过 mysqlbinlog 命令对二进制文件进行分析,分析发现

 误操作发生在position为706位置,且上次正常操作的结束位置在513
 在1152到结尾位置有正常执行的SQL执行

通过 mysqlbinlog 命令从 binlog 日志中导出可执行的 SQL 文件,并将数据导入到mysql

 mysqlbinlog --start-position=154 --stop-position=513 bin-log.000001 > /path/bak.sql;
 mysql -uroot -p < /path/bak.sql;

跳过错误的更新语句,再通过步骤7的逻辑把后续正常语句重新跑一遍,完成数据恢复工作

小结

无论什么时间,数据库发生崩溃都会令人愁眉紧锁,心烦意乱。binlog可以说是在各种情况下,数据库崩溃、数据丢失之后的一粒后悔药,本文通过线下环境,简单的对数据库进行了一次数据恢复实验,如有不对,还请指教

本篇文章到这里就全部结束了,关于MySQL的更多知识大家可以关注Gxl网的MySQL教程栏目!!!

下载本文
显示全文
专题