Mysql-binlog介绍及使用

519 阅读4分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

一、binlog基本概念

  • binlog是一个二进制格式的文件,可以说是MySQL最重要的日志,它记录了所有的DDL(create、alter、drop)和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。需要注意的一点是,即便update操作没有造成数据变化,也是会记入binlog。

  • 默认情况下,binlog日志是二进制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看

二、binlog使用场景

  • 主从复制:mysql replication在master端开启binlog,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的。

  • 数据恢复:通过mysqlbinlog工具来恢复数据。

三、binlog相关配置

备注:我是在docker中装的mysql,操作都是在容器内进行的。

1.修改mysql配置文件my.cnf,在末尾添加代码:

[mysqld]
log-bin=mysql-bin
server-id=1s

2.重启docker容器,使配置生效

docker restart 容器ID

备注:每次重启服务,mysql都会自动调用flush logs,创建一个新的binlog日志。

3.查看binlog日志是否开启

mysql -uroot -p
show variables like 'log_%';

image.png

如图所示mysql的binlog开启成功。

四、binlog日志常用操作命令

1.查看所有binlog日志列表

show master logs;

image.png

2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值

show master status;

image.png

3.flush刷新log日志,自此刻开始产生一个新编号的binlog日志文件

flush logs;

image.png

注意:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

4.清空所有的binlog日志

reset master;

image.png

五、查看binlog日志内容

1.使用mysqlbinlog命令查看

mysqlbinlog mysql-bin.000001

image.png

2.在MySQL中使用show命令查询

命令格式:

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

参数解释:

IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos   :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset] :偏移量(不指定就是0)
row_count :查询总条数(不指定就是所有行)
show binlog events in 'mysql-bin.000001'\G;

image.png

上面这条语句可以将指定的binlog日志文件,分成有效事件行的方式返回,并可使用limit指定pos点的起始偏移,查询条数! 如下操作示例:

1)查询第一个(最早)的binlog日志:

show binlog events\G;

2)指定查询 mysql-bin.000001这个文件:

show binlog events in 'mysql-bin.000001'\G;

3)指定查询 mysql-bin.000001这个文件,从pos点:624开始查起:

show binlog events in 'mysql-bin.000001' from 624\G;

4)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,查询10条(即10条语句)

mysql> show binlog events in 'mysql-bin.000002' from 624 limit 10\G;

5)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,偏移2行(即中间跳过2个),查询10条

show binlog events in 'mysql-bin.000002' from 624 limit 2,10\G;

使用binlog日志恢复MySQL数据

1.创建test数据库

create database test;

2.查看数据库是否创建成功

show databases;

image.png

3.创建member表,查看表是否创建成功

use test;
CREATE TABLE IF NOT EXISTS `member` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
`age` tinyint(3) unsigned NOT NULL,
`classid` varchar(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
show tables;

image.png

4.插入数据

insert into member(`name`,`age`,`classid`) values('LL',24,'cls1'),('HH',23,'cls2');
select * from member;

image.png

5.误删除数据库,数据全部丢失

drop database test;

image.png

6.查看最新一个binlog日志,并记录下关键的pos点,到底是哪个pos点的操作导致了数据库的破坏(通常在最后几步);

7.接着执行一次刷新日志索引操作,重新开始新的binlog日志记录文件。

flush logs;

8.读取binlog日志,分析问题。

9.从binlog日志恢复数据,恢复命令的语法格式:

mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名

常用参数选项解释:

--start-position=687 起始pos点
--stop-position=772 结束pos点
--start-datetime="2016-9-25 22:01:08" 起始时间点
--stop-datetime="2019-9-25 22:09:46" 结束时间点
--database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)

不常用选项:

-u --user=name 连接到远程主机的用户名
-p --password[=name] 连接到远程主机的密码
-h --host=name 从远程主机上获取binlog日志
--read-from-remote-server 从某个MySQL服务器上读取binlog日志
mysqlbinlog --start-position=311 --database=test /var/lib/mysql/mysql-bin.000001 | /usr/bin/mysql -uroot -proot  -v

image.png