欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL binlog日志参数简介

程序员文章站 2024-01-26 16:08:48
...

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%';

MySQL 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.%
相关标签: mysql binlog日志