binlog日志是mysql的二进制日志,记录了所有的DDL(数据定义语言)语句和DML(数据操作语言)语句,但是不包括数据查询语句,语句是以“事件”的形式保存的,它描述数据更改的过程。该日志的两个主要功能是:数据的恢复与数据的复制。
binlog参数
log_bin 设置此参数表示启用binlog功能,并指定路径名称
log_bin_index 设置此参数是指定二进制索引文件的路径与名称
binlog_do_db 此参数表示只记录指定数据库的二进制日志
binlog_ignore_db 此参数表示不记录指定的数据库的二进制日志
max_binlog_cache_size 此参数表示binlog使用的内存最大的尺寸
binlog_cache_size 此参数表示binlog使用的内存大小,可以通过状态变量binlog_cache_use和binlog_cache_disk_use来帮助测试。
binlog_cache_use:使用二进制日志缓存的事务数量
binlog_cache_disk_use:使用二进制日志缓存但超binlog_cache_size值并使用临时文件来保存事务中的语句的事务数量
max_binlog_size Binlog最大值,最大和默认值是1GB,该设置并不能严格控制Binlog的大小,尤其是Binlog比较靠近最大值而又遇到一个比较大事务时,为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的所有SQL都记录进当前日志,直到事务结束
sync_binlog 这个参数直接影响mysql的性能和完整性
sync_binlog=0:当事务提交后,Mysql仅仅是将binlog_cache中的数据写入Binlog文件,但不执行fsync之类的磁盘 同步指令通知文件系统将缓存刷新到磁盘,而让Filesystem自行决定什么时候来做同步,这个是性能最好的。
sync_binlog=n,在进行n次事务提交以后,Mysql将执行一次fsync之类的磁盘同步指令,同志文件系统将Binlog文件缓存刷新到磁盘。
Mysql中默认的设置是sync_binlog=0,即不作任何强制性的磁盘刷新指令,这时性能是最好的,但风险也是最大的。一旦系统绷Crash,在文件系统缓存中的所有Binlog信息都会丢失
binglog_format 可选值有statement(记录逻辑sql语句)、row(记录表的行更动情况)、mixed
查一下binlog日志相关的参数
mysql> show variables like '%binlog%';
上面那么多参数其实不需要都配置,我一般配置以下几个参数
#log-bin设置此参数表示启用binlog功能,并指定路径名称
log-bin=/var/lib/mysql/mysql-bin
sync_binlog=0
#binlog_cache_size此参数表示binlog使用的内存大小
binlog_cache_size=1M
binlog_cache_size:默认大小是37268即32K,正常情况下设置为1M就可以了,如果系统事务多可以设置为2到4M。
max_binlog_cache_size: 默认值是18446744073709547520,这个值很大,够我们使用的了,所以不需要设置。
注意:缓存大小主从服务器要设置的一致,如果不一致会有缓存溢出问题。
sync_binlog设为0是出于系统性能考虑,如果系统有数据安全要求,可以设置1以上的值
binlog_do_db 和binlog_ignore_db建议不要配置,设置后会出现部分数据不能同步的问题,请看下面的例子
$ mysql
mysql> delete from garbage.junk;
mysql> use garbage;
mysql> update production.users set disabled = 1 where user = "root";
复制会broke2次, 第一次,因为 slave尝试着去之西你给第一条语句,但是slave上并没有这样的表"garbage.junk" , 第二次, 隐含的, 因为 对 production.users不会被 复制,因为 root帐号并没有在slave上被禁用掉.
为什么? 因为 binlog-ignore-db 并不像你想的那样执行, 我之前说的, "在garbage数据库中的数据不会被复制" 是错的, 实际上(数据库)并没有这么做.事实上, 他是通过默认的数据库为“garbage" 的连接, 过滤二进制的(SQL)语句日志的. 换句话说, 过滤不是基于 查询的字符串的, 而实际于你used的数据库.
其他我提到的配置选项也都类似. binlog-do-db 和 binlog-ignore-db 语句是特别危险的,因为他们将语句写入了二进制日志. 意味着你不能使用二进制日志从备份恢复指定时间的数据.
在严格控制的环境中, 这些选项是很有用的,但是我不会谈论这些。
安全的替换方案是 在 slave上配置过滤, 使用基于查询中真正涉及到的表的选项, 例如replicate-wild-* 选项
#指定需要同步的表
replicate-wild-do-table=ljzxdb.%