什么是二进制日志
二进制日志记录导致数据改变的SQL语句,记录已提交的日志,不依赖于存储引擎类型。 二进制日志不但可以记录语句,还能够通过”重放“日志文件中的事件来生成数据副本,以实现备份的功能。在生产环境中建议将二进制日志和数据文件分开存放。
查看二进制日志是否开启
SELECT @@sql_log_bin;#值为1或者ON就表示已经开启
如果没有开启,可以在配置文件中添加此选项(注意使用横线而不是下划线)
[mysqld]
log-bin
开启二进制日志,并修改二进制日志的路径(存放日志的文件夹所有者必须改成mysql否则会提示权限不够)
[mysqld]
log-bin=/data/binlog/binlog
如果你的系统是ubuntu,配置文件语法正确,文件夹也有访问权限,修改了二进制日志的存放路径后服务启动不了,提示配置错误。可以尝试以下解决方法:
修改文件
vim /etc/apparmor.d/usr.sbin.mysqld
找到# Allow log file access这个配置块,在后面添加以下配置,路径(这里是/data/binlog)替换成你存放二进制日志的文件夹。
/data/binlog/ r,
/data/binlog/** rw,
最后重读配置生效
/etc/init.d/apparmor reload
临时禁用二进制日志(还原时常用)
set sql_log_bin=0;
二进制日志格式
二进制日志的格式有三种,分别是STATEMENT、ROW、MIXED。可以通过binlog_format来配置,在官方文档里,它既是配置文件选项又是系统变量(BOTH)。如果需要实现备份功能,建议使用ROW格式,更加安全可靠。(STATEMENT的缺点:记录数据不全,在不同的时间执行结果可能会不同,还原的时间点一定是未来某个时间,起不到备份效果)
方法一:修改配置文件
[mysqld]
binlog_format=ROW
方法二:设置全局变量
SET GLOBAL binlog_format=ROW;#退出重新登录MYSQL后生效
二进制日志相关命令
查看二进制日志文件列表和大小
SHOW MASTER LOGS;
SHOW BINARY LOGS;
查看使用中的二进制日志文件
SHOW MASTER STATUS;
查看二进制文件中的指定内容
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
范例
show binlog events in 'binlog.000001' from 125;#查看binlog.000001中的从125开始的日志
刷新日志
每次重启MYSQL服务会自动刷新,生成新的二进制日志文件
FLUSH LOGS;
删除二进制日志
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
范例
PURGE MASTER LOGS TO 'binlog.000003';#删除binlog.000003之前的日志
PURGE MASTER LOGS BEFORE '2022-06-28 10:38:00';#删除某个时间点之前的日志
删除所有二进制日志,重新计数
RESET MASTER [TO #];删除所有日志,并从#开始计数,默认从1开始
MYSQLBINLOG
mysqlbinlog是二进制日志的客户端命令工具,支持离线查看二进制日志。
mysqlbinlog [OPTIONS] log_file
选项
--start-position= #开始位置
--stop-position= #结束位置
--start-datetime= #时间格式:YYYY-MM-DD hh:mm:ss
--stop-datetime=
--base64-output[=name]
-v -vvv
范例
mysqlbinlog /var/lib/mysql/binlog.000001 -v #查看更详细的日志
mysqlbinlog /var/lib/mysql/binlog.000001 --stop-position=313 #从头查看日志到Pos 313为止