MySQL-binlog日志初识
概要
binlog 即 binary log,二进制日志。
这个日志文件以事件的形式记录了数据结构的变更以及数据表的变更(DDL和DML),不包括select和show操作,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
事件(event)即二进制日志的最小记录单元。对于DDL和DCL而言,一个语句就是一个事件;而对于DML语句来讲,只记录已提交的事务,也就是说会有多个事件。
一、 开启binlog日志
1)vi /etc/my.cnf
在[mysqld] 区块下面添加:
log-bin=mysql-bin
2)重启mysqld服务使配置生效
二、 查看二进制日志是否已开启
show variables like 'log_%';
三、常用binlog日志操作命令
1) 查看所有binlog日志列表
show master logs;
binlog日志与数据库文件在同目录中,下面我们可以到目录中去看下这些文件:
cd /www/server/data
ls -la
2) 查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
show master status;
3) 刷新log日志,自此刻开始产生一个新编号的binlog日志文件
flush logs;
注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
4) 重置(清空)所有binlog日志
reset master;
四、查看binlog日志内容
1. 查看方式:使用mysqlbinlog自带查看命令
注: binlog是二进制文件,普通文件查看器cat more vi等都无法打开,必须使用自带的 mysqlbinlog 命令查看
cd /www/server/mysql/bin
2. 日志内容分析
执行命令:/www/server/mysql/bin/mysqlbinlog mysql-bin.000023
说明:如果在MySQL5.5以下版本使用mysqlbinlog命令时报错,就加上 “--no-defaults”选项
下面截取一部分来分析:
补充:
二进制日志中的每条记录是从一个【at 数字】开始到一个【at 数字】结束,之间是一条二进制日志记录。每条记录的end_log_pos的值与记录结束的at后的值是一致的。
比如最上面那条是从 at 24734754开始,接着end_log_pos为 24735151 ,紧跟着下面的内容为:at 24735151 表示这一条语句结束
3. 更方便的查看binlog命令
上面这种办法读取出binlog日志的全文内容较多,不容易分辨查看pos点信息,这里介绍一种更为方便的查询命令
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 查询总条数(不指定就是所有行)
说明:这条语句可以将指定的binlog日志文件,分成有效事件行的方式返回,并可使用limit指定pos点的起始偏移,查询条数;
下面是常用的查询语句:
1) 查询第一个(最早)的binlog日志: show binlog events; 2) 指定查询 mysql-bin.000023 这个文件: show binlog events in 'mysql-bin.000023'; 3)指定查询 mysql-bin.000023 这个文件,从pos点:1755开始查起: show binlog events in 'mysql-bin.000023' from 1755; 4)指定查询 mysql-bin.000023 这个文件,从pos点:1755开始查起,查询10条 show binlog events in 'mysql-bin.000023' from 1755 limit 10; 5)指定查询 mysql-bin.000023 这个文件,从pos点:1755开始查起,偏移2行,查询10条 show binlog events in 'mysql-bin.000023' from 1755 limit 2,10;
举个例子,执行命令:
show binlog events in 'mysql-bin.000023' limit 10;
下面是关于结果的分析:
Log_name 查询的binlog日志文件名 Pos pos起始点 Event_type 事件类型:Query Server_id 标识是由哪台服务器执行的 End_log_pos pos结束点(即:下行的pos起始点) Info 执行的sql语句
我们随便抽取一个info字段对应的值,来看下:
1 USE `redis_manager`; 2 CREATE TABLE 3 IF 4 NOT EXISTS `group` ( 5 group_id INTEGER ( 4 ) NOT NULL AUTO_INCREMENT, 6 group_name VARCHAR ( 255 ) NOT NULL, 7 group_info VARCHAR ( 255 ) DEFAULT NULL, 8 update_time datetime ( 0 ) NOT NULL, 9 PRIMARY KEY ( group_id ), 10 UNIQUE KEY ( group_name ) 11 ) ENGINE = INNODB CHARACTER 12 SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic
可以看到这个值其实就是一条DDL的建表语句
参考链接:https://www.cnblogs.com/martinzhang/p/3454358.html