mysql binlog 使用指南

MySQL binlog 详解

1.前言
     日志是把数据库的每一个变化都记载到一个专用的文件里,这种文件就叫做日志文件。Mysql默认只打开出错日志,因为过多的日志将会影响系统的处理性能。
  在5.0前支持文本格式和二进制格式,5.0后只支持二进制格式,因为二进制日志在性能、信息处理方面有更多的优点。

2.基础知识

2.1、二进制日志的启用
    二进制日志由配置文件的log-bin选项负责启用,Mysql服务器将在数据根目录创建两个新文件XXX-bin.001和XXX-bin.index,若配置选项没有给出文件名,Mysql将使用主机名称命名这两个文件,其中.index文件包含一份全体日志文件的清单。
    Mysql会把用户对所有数据库的内容和结构的修改情况记入XXX-bin.n文件,而不会记录SELECT和没有实际
 2.2、更新的UPDATE语句。
  日志文件的扩展
    当停止或重启时,服务器会把日志文件记入下一个日志文件,Mysql会在重启时生成一个新的日志文件,文件序号递增,此外,如果日志文件超过max_binlog_size系统变量配置的上限时,也会生成新的日志文件。
  2.3、日志文件的查看
    Mysql提供了mysqlbinlog命令来查看日志文件,如mysqlbinlog xxx-bin.001 | more。在记录每条变更日志的时候,日志文件都会把当前时间给记录下来,以便进行数据库恢复。    
  2.4、日志文件的停用
    可以使用SET SQL_LOG_BIN=0命令停止使用日志文件,然后可以通过SET SQL_LOG_BIN=1命令来启用。
  2.5、使用日志进行数据库恢复
    如果遇到灾难事件,应该用最近一次制作的完整备份恢复数据库,然后使用备份之后的日志
  文件把数据库恢复到最接近现在的可用状态。
    使用日志进行恢复时需要依次进行,即最早生成的日志文件要最先恢复:
      mysqlbinlog xxx-bin.00001 | mysql -u root -p
      mysqlbinlog xxx-bin.00002 | mysql -u root -p

3.日志跟换策略
  使用索引来循环文件,在以下条件将循环至下一个索引

a. 服务器重启
  b.服务器被更新
  c.日志达到了最大日志长度max_binlog_size ,一般配置文件中指定
  d.日志被刷新mysql> flush logs;    手动刷新

4.日志格式
  从官网文档中看到,之前的MySQL一直都只有基于statement的复制模式,直到5.1.5版本的MySQL才开始支持row level的复制。从5.0开始,MySQL的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给MySQL Replication复制又带来了更大的新挑战。另外,看到官方文档说,从5.1.8版本开始,MySQL提供了除Statement Level和Row Level之外的第三种复制模式:Mixed,实际上就前两种模式的结合。在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。新版本中的Statement Level还是和以前一样,仅仅记录执行的语句。而新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

--基于SQL语句的复制(statement-based replication,SBR),
  --基于行的复制(row-based replication,RBR),
  --混合模式复制(mixed-based replication,MBR)。

三种格式的优缺点请参考:

http://douya.blog.51cto.com/6173221/1605114

静态设置binlog格式:--永久生效

  log-bin = mysql-bin
  #binlog_format = "STATEMENT"
  #binlog_format = "ROW"
  binlog_format = "MIXED"

动态修改binlog格式: --重启失效

  mysql> SET SESSION binlog_format = ‘STATEMENT‘;
  mysql> SET SESSION binlog_format = ‘ROW‘;
  mysql> SET SESSION binlog_format = ‘MIXED‘; 
  mysql> SET GLOBAL binlog_format = ‘STATEMENT‘;
  mysql> SET GLOBAL binlog_format = ‘ROW‘;
  mysql> SET GLOBAL binlog_format = ‘MIXED‘;

5.binary log相关变量和参数

5.1、命令行参数

  --log-bin [=file_name]

设置此参数表示启用binlog功能,并制定路径名称,名称不写的话默认是主机名

--log-bin-index[=file]

设置此参数是指定二进制索引文件的路径与名称,默认在datadir ,可以不再配置文件中配置

--max_binlog_size  推荐500M

Binlog最大值,最大和默认值是1GB,当binlog日志达到这个最大值时候,将会被自动更新出一个新的日志。

该设置并不能严格控制Binlog的大小,尤其是Binlog比较靠近最大值而又遇到一个比较大事务时,

为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的所有SQL都记录进当前日志,直到事务结束。

--binlog-do-db=db_name

此参数表示只记录指定数据库的二进制日志

--binlog-ignore-db=db_name

此参数表示不记录指定的数据库的二进制日志

-- expire_logs_days  =N             推荐一般保留7天

此参数表示保留N天的binlog,超过这个时间将被自动删除  推荐使用此参数清除过期的日志 ,而不是手动

  5.2、系统变量

  log_bin

binlog_cache_size

此参数表示binlog使用的内存大小,可以通过状态变量binlog_cache_use和binlog_cache_disk_use来帮助测试。

max_binlog_cache_size

此参数表示binlog使用的内存最大的尺寸

binlog_cache_use

使用二进制日志缓存的事务数量

binlog_cache_disk_use

使用二进制日志缓存但超过binlog_cache_size值并使用临时文件来保存事务中的语句的事务数量。

sync_binlog

这个参数直接影响mysql的性能和完整性。

sync_binlog=0:   推荐使用默认的参数 0

当事务提交后,Mysql仅仅是将binlog_cache中的数据写入binlog文件,但不执行fsync之类的磁盘,同步指令通知文件系统将缓存刷新到磁盘,而让Filesystem自行决定什么时候来做同步,这个是性能最好的。

sync_binlog=n,在进行n次事务提交以后,Mysql将执行一次fsync之类的磁盘同步指令,通知文件系统将Binlog文件缓存刷新到磁盘。

Mysql中默认的设置是sync_binlog=0,即不做任何强制性的磁盘刷新指令,这时性能是最好的,但风险也是最大的。一旦系统Crash,在文件系统缓存中的所有Binlog信息都会丢失。

6.常见问题

   6.1实例:

> PURGE MASTER LOGS TO ‘MySQL-bin.010‘;  //清除MySQL-bin.010日志
> PURGE MASTER LOGS BEFORE ‘2008-06-22 13:00:00‘;   //清除2008-06-22 13:00:00前binlog日志
> PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);  //清除3天前binlog日志BEFORE,变量的date自变量可以为‘YYYY-MM-DD hh:mm:ss‘格式。

      6.2.清除binlog时,对从mysql的影响
       如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。

--或使用命令:
  RESET MASTER   谨慎操作

删除之前所有的binlog,并重新生成新的binlog,后缀从000001开始。

注:如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是失败,并伴随一个错误。

不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。

当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。

  6.3、二进制日志不准确的处理

默认情况下,并不是每次写入时都将二进制日志与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能二进制日志中最后的语句丢失。 要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使二进制日志在每N次二进制日志写入后与硬盘同步。 即使sync_binlog设置为1,出现崩溃时,也有可能表内容和二进制日志内容之间存在不一致性。

如果崩溃恢复时MySQL服务器发现二进制日志变短了(即至少缺少一个成功提交的InnoDB事务), 如果sync_binlog =1并且硬盘/文件系统的确能根据需要进行同步(有些不需要)则不会发生,则输出错误消息 (“二进制日志<名>比期望的要小”)。 在这种情况下,二进制日志不准确,复制应从主服务器的数据快照开始。

一般线上环境中,MySQL binlog可以使用以下配置文件

#binlog
log-bin = $dir/mysql-bin
binlog_format = "STATEMENT"
max_binlog_size = 500M
binlog_cache_size = 64M
expire_logs_days  = 7 
sync_binlog=0:
时间: 2024-10-05 12:14:39

mysql binlog 使用指南的相关文章

mysql binlog row格式查看

MySQL 5.1开始,binlog支持row-based的格式,默认情况下只能看到一些经过base-64编码的信息,如 DELIMITER /*!*/; # at 7493962 #090827 5:25:03 server id 1 end_log_pos 0 Start: binlog v 4, server v 5.1.26-rc-community-log created 090827 5:25:03 BINLOG ' L6iVSg8BAAAAZgAAAAAAAAAAAAQANS4xL

原创工具binlog2sql:从MySQL binlog得到你要的SQL

binlog2sql是我开发的mysql binlog解析工具,它能帮助你从binlog得到你要的SQL.根据不同设置,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等. 用途 数据回滚 主从切换后数据不一致的修复 从binlog生成标准SQL,带来的衍生功能 安装 $ git clone https://github.com/danfengcao/binlog2sql.git $ pip install -r requirements.txt 使用 MySQL server必

mysql binlog解析概要

1,dump协议: 根据数据库的ip+port创建socket,如果创建成功,说明链接建立成功,接下来是使用dump协议订阅binlog 链接建立成功之后,服务端会主动向客户端发送如下问候信息greeting(可以理解为经java转换后,是一个java对象), 在下面的代码中可以看到greeting中的信息: this.context.setServerStatus(greeting.getServerStatus());//this.context.setServerVersion(greet

mysql索引详解,摘自《MySQL 5权威指南》

本文介绍了数据库索引,及其优.缺点.针对MySQL索引的特点.应用进行了详细的描述.分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用.本文摘自<MySQL 5权威指南>(3rd)的8.9节.(2007.07.05最后更新)        索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.注:[1]索引不是万能的!索引可以加快数据检索操作,但会使数据修改操作变慢.每修改数据记录,索引

MySQL binlog 自动清理脚本

# vim /data/scripts/delete_mysql_binlog.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

mysql binlog限流问题总结

业务场景: 新建slave连到master,执行start slave时master险些被"搞死". 分析:新建slave连到master时,会将主库上大量的binlog(几百G)拉取到本地保存为relay log,会导致两个问题 1.主库网络带宽被占满 . 2.主库的磁盘I/O负载很高. 解决思路: 1. 在slave拉取master的binlog时,在I/O thread上做限流:每拉取一定数据量master的binlog则sleep时间N. 这个测试效果比较明显,但存在如下几个问

MySQL——binlog

一.binlog简介: 1.什么是binlog: binlog日志用于记录所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句.语句以"事件"的形式保存,它描述数据更改. 2.binlog的记录格式: Mysql binlog日志有三种格式,分别为:Statement ,MiXED ,和ROW: (在MySQL5.7.7版本之后,把binlog_format的默认值修改成了ROW.master将修改表的event写入binlog中,并且master将

MySQL -- binlog 操作与恢复

binlog 开启.查看:> show variables like 'log_bin';   #查看是否开启 > set sql_log_bin=1 || set sql_log_bin=0: #启用 || 停用> show binary logs;   //获取binlog文件列表,对应mysql-bin.index: > show master logs;   //查看主上的binlog> show master status:  //查看当前正在写入的binlog&g

PHP Client for Mysql Binlog

PHP解析Mysql Binlog,依赖于mysql-replication-listener库 详见:https://github.com/bullsoft/php-binlog Install MySQL Replication Listener https://github.com/bullsoft/mysql-replication-listener/archive/master.zip 该源代码,有一处bug,在 tcp_driver.cpp 第 650 行处: int Binlog_