MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句。二进制日志(binary log)中记录了对MySQL数据库执行更改的所有操作,并且记录了语句发生时间、执行时长、操作数据等其它额外信息,但是它不记录SELECT、SHOW等那些不修改数据的SQL语句。二进制日志(binary log)主要用于数据库恢复和主从复制,以及审计(audit)操作。
二进制日志(Binary log)
a、它包含的内容及作用如下:
包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)
包含关于每个更新数据库(DML)的语句的执行时间信息
不包含没有修改任何数据的语句,如果需要启用该选项,需要开启通用日志功能
主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新
用于在主复制服务器上记录所有将发送给从服务器的语句
启用该选项数据库性能降低1%,但保障数据库完整性,对于重要数据库值得以性能换完整。有些类似于oracle开启归档模式。
b、开启二进制日志的方法及属性
使用--log-bin[=file_name]选项或在配置文件中指定log-bin启动时,mysqld写入包含所有更新数据的SQL命令的日志文件。
对于未给出file_name值, 默认名为-bin后面所跟的主机名。
在未指定绝对路径的情形下,缺省位置保存在数据目录下。
每个二进制日志名会添加一个数字扩展名用于日志老化,因此不支持自定义的扩展名,会被mysql数字扩展名动态替换。
若当前的日志大小达到max_binlog_size,则自动创建新的二进制日志。
对于大的事务,二进制日志会超过max_binlog_size设定的值。也即是事务仅仅写入一个二进制日志。
由是可知,二进制日志文件大小接近,其size不是完全相等,这点不同于oracle。
二进制日志文件会有一个对应二进制日志索引文件,该文件包含所有的二进制日志,其文件名与二进制日志相同,扩展名为.index
二进制索引文件通过--log-bin-index[=file_name]选项来指定
RESET MASTER语句将删除所有二进制日志文件,这将影响到从库。也可以用PURGE MASTER LOGS只删除部分二进制文件。
系统变量log_bin的值为OFF表示没有开启二进制日志(binary log)。ON表示开启了二进制日志(binary log) show variables like 'log_bin';
查看当前服务器所有的二进制日志文件 show binary logs; show master logs;
查看当前二进制日志文件状态 show master status;
show binlog events用于在二进制日志中显示事件。如果未指定'log_name',则显示第一个二进制日志。
方法1:使用show binlog events方式可以获取当前以及指定binlog的日志,不适宜提取大量日志。
SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
方法2: 使用mysqlbinlog命令行查看日志内容(适宜批量提取日志)。
查看第一个binlog文件的内容(show binlog events) show binlog events;
查看某个特定binglog文件的内容。 show binlog events in 'DB-Server-bin.000012';
show binlog events in 'DB-Server-bin.000012' from 336;
二进制日志开启方法:查看系统变量log_bin,如果其值为OFF,表示没有开启二进制日志(binary log),如果需要开启二进制日志,则必须在my.cnf中[mysqld]下面添加log-bin [=DIR\[filename]] ,DIR参数指定二进制文件的存储路径;filename参数指定二级制文件的文件名。 其中filename可以任意指定,但最好有一定规范。系统变量log_bin是静态参数,不能动态修改的(因为它不是Dynamic Variable)。如下所示:
show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set global log_bin=mysql_bin;
ERROR 1238 (HY000): Variable 'log_bin' is a read only variable
修改my.cnf,在[mysqld]下面增加log_bin=mysql_bin_log,重启MySQL后,你就会发现log_bin变为了ON,二进制日志(binary log)默认放在数据目录下(系统变量datadir下),如下所示:
校验:show variables like 'log_bin';
使用命令flush logs切换二进制日志
验证切换前:show master status;
切换:flush logs;
切换后:show master status;
请注意,每次重启MySQL服务也会生成一个新的二进制日志文件,相当于二进制日志切换。切换二进制日志时,你会看到这些number会不断递增。另外,除了这些二进制日志文件外,你会看到还生成了一个DB-Server-bin.index的文件,这个文件中存储所有二进制日志文件的清单又称为二进制文件的索引。
二进制日志的删除可以通过命令手工删除,也可以设置自动清理。下面简单介绍一下,如何删除二进制日志。
purge binary logs to xxx; 表示删除某个日志之前的所有二进制日志文件。这个命令会修改index中相关数据 purge binary logs to 'on.000004';
清除某个时间点以前的二进制日志文件。 purge binary logs before '2017-03-10 10:10:00';
清除7天前的二进制日志文件 purge master logs before date_sub( now( ), interval 7 day);
清除所有的二进制日志文件(当前不存在主从复制关系) reset master;
设置expire_logs_days参数,设置自动清理,其默认值为0,表示不启用过期自动删除功能,如果启用了自动清理功能,表示超出此天数的二进制日志文件将被自动删除,自动删除工作通常发生在MySQL启动时或FLUSH日志时。
系统变量log_bin_trust_function_creators,默认为OFF,这个参数开启会限制存储过程、Function、触发器的创建。
系统变量sql_log_bin 用于控制会话级别二进制日志功能的开启或关闭,默认为ON,表示启用二进制日志功能。
系统变量binlog_format 指定二进制日志的类型。分别有STATEMENT、ROW、MIXED三种值。MySQL 5.7.6之前默认为STATEMENT模式。MySQL 5.7.7之后默认为ROW模式。这个参数主要影响主从复制。
复制的模式有下面几种:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。
mysql 5.5.20-log(路径不能有空格)
一配置mysql 的my.ini,在[mysqld] 下添加二进制日志所在文件(log-bin-file) = C:/Program Files/MySQL/MySQL Server 5.0/log-bin/logbin.log
上面是配置mysql二进制日志存放的目录,目录可以随便指定,在指定路径时要注意以下两点:
1 在目录的文件夹命名中不能有空格,比如“aa bb”文件夹 是不允许的,这样,在访问日志时候会报错;
2 指定目录时候一定要以*.log结尾,即不能仅仅指定到文件夹的级别,如上面我写的logbin.log,这时候,日志文件的名称是logbin.000001 logbin.000002。。。不然不会有日志文件产生。
二 mysql.ini 修改后,保存,然后重启mysql服务,重启后在C:/Program Files/MySQL/MySQL Server 5.0/log-bin 目录下会产生logbin.000001 和 logbin.index 两个文件。
三 查看二进制文件
在dos命令行中,进入到mysql的安装目录下,即C:/Program Files/MySQL/MySQL Server 5.0,再进到bin/目录下,执行mysqlbinlog命令查看日志:
mysqlbinlog ..\log-bin\logbin.000001
值得注意的是后面的路径问题,路径可以使用绝对路径也可以使用相对路径,分隔符可以是“/"也可以是“\”,两种分割符都能正常识别,路径中的文件夹名称中不能有空格 ,这个测试过(如果是绝对路径C:/Program Files/MySQL/MySQL Server 5.0/log-bin/logbin.000001就会报错找不到文件 因为“C:/Program Files”带空格)
为了方便查看日志内容 可以导出到.sql文件
mysqlbinlog ..\log-bin\logbin.000001 ->a.sql
d、删除历史日志
--使用purge手动删除指定日志
--使用expire-log-days删除失效日志,设置变量expire_logs_days,删除超出这个变量保留期之前的所有日志被删除
--自动日志删除通常发生在服务器启动以及日志flush
--reset master方式
--使用before子句purge日志,binlog.000003被删除
--重置所有日志
--reset master将删除在索引文件中列出所有的日志文件并重置索引文件,最后生成一个新的binlog文件。
--该操作之前先备份binlog至其它位置以备以后需要。
--reset之后,从000001开始生成全新空日志
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#100830 16:30:55 server id 1 end_log_pos 98 Start: binlog v 4, server v 5.0.
67-community-nt-log created 100830 16:30:55 at startup
# Warning: this binlog was not closed properly. Most probably mysqld crashed wri
ting it.
ROLLBACK/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SETCOMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;