MySQL的binlog日志
binglog的基本认识
MySQL的二进制日志是MySQL重要的日志,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录。
一般来说开启二进制日志大概会有1%的性能损耗。二进制有两个最重要的使用场景:
(1) MySQLReplication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
(2) 数据恢复,通过使用mysqlbinlog工具来使恢复数据。
二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
开启binlog日志
(1)打开mysql的配置文件
sudo vim /etc/mysql/my.cnf
(2)找到Logging and Replication,去掉log_bin的注释,如果找不到的话,可以在[mysqld]区块自己添加 log_bin = /var/log/mysql/mysql-bin.log
(3)重启mysqld服务
sudo service mysql restart;
查看binlog是否开启
登录mysql
mysql> show variables like 'log_bin';
ON表示开启了binlog,OFF表示没有开启。
常用binlog日志操作命令
(1) 查看所有binlog日志列表
mysql> show master logs;
(2) 查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值。
mysql> show master status;
(3) 刷新log日志,自此刻开始产生一个新编号的binlog日志文件。
mysql> flush logs;
(4) 重置(清空)所有binlog日志
mysql> reset master;
查看binlog日志内容
(1) 进入MySQL的日志目录,由上面可以知道路径。
cd /var/log/mysql
(2) 使用mysqlbinlog自带查看命令,binlog是二进制文件,普通文件查看器cat more vim等都无法打开,必须使用自带的 mysqlbinlog 命令查看。(这里打开的二进制日志为mysql-bin.000001)。
sudo mysqlbinlog mysql-bin.000001,如果报错,请执行下面这一句
sudo mysqlbinlog --no-defaults mysql-bin.000001。
上面这种办法读取出binlog日志的全文内容较多,不容易分辨查看pos点信息,这里介绍一种更为方便的查询命令:
mysql> 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] 查询总条数(不指定就是所有行)。
A.查询第一个(最早)的binlog日志:
mysql> show binlog events\G;
B.指定查询mysql-bin.000001 这个文件:
mysql> show binlog events in 'mysql-bin.000001'\G;
C.指定查询mysql-bin.000001 这个文件,从pos点:8224开始查起:
mysql> show binlog events in 'mysql-bin.000001' from 8224\G;
D.指定查询mysql-bin.000001 这个文件,从pos点:8224开始查起,查询10条
mysql> show binlog events in 'mysql-bin.000001' from 8224 limit 10\G;
E.指定查询mysql-bin.000001 这个文件,从pos点:8224开始查起,偏移2行,查询10条
mysql> show binlog events in 'mysql-bin.000001' from 8224 limit 2,10\G;
二进制日志格式
二进制日志方框中第一行表示的是包含日志文件的偏移字节值(这里为199),第二行包含如下:
(1) 事件的日期和时间,MySQL会使用它们来产生 SET TIMESTAMP语句。
(2) server id:原服务器的服务器Id end_log_pos:下一个事件的偏移字节值
Query:时间类型,本例为Query,有很多事件类型
thread_id:原服务器上执行的线程Id
exec_time:语句的时间戳写进二进制文件的时间差
error_code:原服务器上执行事件产生的错误代码
(3) 接下来为执行的SQL语句。