在了解binlog日志的三种模式之前,先了解下解析binlog日志的命令工具mysqlbinlog。mysqlbinlog工具的作用是解析mysql的二进制binlog日志内容,将二进制日志解析成MySQL数据库中可以执行的SQL语句。binlog日志的原始数据以二进制形式存在,需要使用mysqlbinlog工具转换成SQL语句形式。mysql的binlog日志的作用是记录mysql数据库的增删改查等更新内容的记录(修改数据库的操作)。查询数据库的语句,如show、select等,不会被binlog日志记录,主要用于数据库的主从复制和增量恢复。案例:在对数据库进行定期备份时,只能备份到某个时间点。如果凌晨0:00进行全量备份,中午12:00发生故障,需要恢复数据,那么0:00的全量备份只能恢复到0:00的数据,是否可以0:00到12:00的数据丢失?这时候就体现出binlog日志的重要性了。需要定期推送binlog日志(一分钟一次或五分钟一次,视业务场景而定)完成增量备份。当发生故障时,可以通过定时备份和增量备份的方式恢复故障点的数据。具体的恢复方案这里就不简单介绍了,后面会写一篇文章来说明。binlog日志三种模式的ROWLevel记录方式为row,即如果批量修改数据,则不记录每条记录的SQL语句事件,而是记录每条记录发生变化的SQL语句。所以ROW模式下的binlog日志文件会发生变化。非常重”。优点:行级别的binlog日志内容,会清楚的记录每一行数据被修改的细节。并且不会出现某些特定情况下存储过程或函数,以及触发器调用和触发器无法正确复制的问题。缺点:在行级别,当所有执行的语句都记录到日志中时,记录为每行记录的修改,可能会产生大量的日志内容,产生的binlog日志量惊人。批量修改百万条数据,然后记录百万行...语句级别(默认)记录每条修改数据的SQL语句(批量修改时,记录的不是单个SQL语句,而是批量修改的SQL语句事件)。看看上面的插图,您可以更好地理解行级别和语句级别之间的区别。优点:statement方式记录的变化的SQ语句事件并不是每条变化记录,所以大大减少了binlog日志量,节省了磁盘IO,提高了性能。缺点:一些特殊函数在语句级别的复制效果不是很好,例如:函数和存储过程的复制。由于行级别是根据每一行的变化来记录的,所以不会出现类似的问题。Mixed实际上是前两种模式的结合。在Mixed模式下,MySQL会根据每条执行的具体SQL语句来区分记录的日志形式,即Statement和Row二选一。企业场景如何选择binlog的模式1.如果生产中用到的MySQL的特殊功能(存储过程、触发器、函数)比较少。选择默认语句模式,StatementLevel。2、如果生产中使用到MySQL的很多特殊功能,可以选择Mixed模式。3、如果生产中使用的MySQL特殊功能比较多,希望数据优化一致,那就激活Rowlevel模式;但是注意这种模式下的binlog是很“重”的。查看binlog方式mysql>showglobalvariableslike"%binlog_format%";+----------------+------------+|Variable_name|Value|+-------------+------------+|binlog_format|STATEMENT|+----------------+-----------+配置binlog日志方式vimmy.cnf(在[mysqld]模块中配置)log-bin=/data/3306/mysql-binbinlog_format="STATEMENT"#binlog_format="ROW"#binlog_format="MIXED"不重启,使配置在msyql中生效SETglobalbinlog_format='STATEMENT';
