二进制日志(binarylog)主要记录mysql数据库的变化,日志包含所有更新数据或者潜在更新了数据(比如没有匹配到任何行的delete语句),语句以时间的形式保存,描述了数据的更改,二进制日志还包含执行每个更新数据库语句的时间信息,使用二进制日志的主要目的是最大可能的恢复数据库,因为二进制日志包含备份后进行的所有更新,不记录没有修改任何数据的语句
开启设置二进制日志
1.默认情况下二进制日志是关闭的,通过配置文件来启动和设置二进制日志,修改my.cng,插入如下内容,重启服务mysql服务
server-id = 1 # mysql5.7必须加,否则mysql服务启动报错
log-bin = /data/3306/tmp/binlog/mysql-bin # 路径及命名,默认在data下
expire_logs_days = 10 # 过期时间,二进制文件自动删除的天数,0代表不删除
max_binlog_size = 100M # 单个日志文件大小
2.通过show variables like ‘log_bin%’查看二进制日志设置
mysql> show variables like 'log_bin%';
+---------------------------------+---------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------+
| log_bin | ON |
| log_bin_basename | /data/3306/tmp/binlog/mysql-bin |
| log_bin_index | /data/3306/tmp/binlog/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+---------------------------------------+
3、查看当前服务器所有的二进制日志文件 show binary logs / show master logs
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 732 |
+------------------+-----------+
4、查看当前二进制日志状态 show master status
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 732 | | | |
+------------------+----------+--------------+------------------+-------------------+
日志切换
每次重启mysql服务器也会生成一个新的二进制日志文件,相当于二进制日志切换,切换日志时,你会看到这些number会不断递增,另外除了这些二进制文件外,你会看到还生成一个DB-Server-bin.index的文件,这个文件中存储所有二进制日志文件的清单,又被称为二进制文件的索引,
执行 flush logs 可以刷新切换二进制文件
日志查看
- 使用show binlog events 可以获取当前及指定日志 show binlog events ‘mysql-bin.000002’ from 639(只产看639)
- show master logs;
- show binlog events in ‘logbin1.000002’;
- 打印二进制日志到一个明文文件,该文件记录的更新了数据的sql,但是在5.7以上已经被加密
日志删除
1、reset mstaer 可以删除所有日志文件 (不存在主从复制关系),执行完该语句,所有二进制日志被删除。mysql重新创建二进制日志,编号从000001开始
2、purge master logs语句删除指定日志文件使用日志恢复数据
如果开启了二进制日志,出现了数据丢失,可以通过二进制日志恢复数据库,语法如下
mysqlbinlog [option] filename | mysql -u user -p passwd
option的参数主要有两个 —start-datetime —stop-datetime 和 start-position —stop-position ,前者指定恢复的时间点,后者指定恢复的位置(位置指的是二进制文件中 # at 580 580就是位置)。原理就是把记录的语句重新执行了一次,如果恢复了两次。会产生重复数据。
注意,要找到插入更新的语句所在的时间点或位置。如果恢复的语句包含只有delete,会报错1032错误。暂停日志功能
可以通过修改配置文件停止二进制日志功能,但是需要重启数据库,mysql提供了语句可以在线停止二进制功能set sql_log_bin = 0 # 停止二进制日志功能 set sql_log_bin = 1 # 开启二进制日志功能
日志的三种模式
二进制日志三种格式:STATEMENT,ROW,MIXED,由参数binlog_format控制
1、STATEMENT模式(SBR)
每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况(如非确定函数,当前时间之类的)下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
基于sql语句的备份,比如update 100条数据,就一条命令
2、ROW模式(RBR)默认
不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。
基于数据行的备份,每条记录修改,记录那条,update 100 ,就会有100条记录
3、 MIXED模式(MBR)
以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式