乐趣区

关于mysql:谈一谈MySQL的binlog日志

基本概念

二进制日志(binnary log)以 事件模式 记录了对 MySQL 数据库执行更改的所有操作。

binlog 是逻辑日志,记录内容是语句的原始逻辑,相似于“给 ID=2 这一行的 c 字段加 1”,属于MySQL Server 层。

binlog 是记录所有数据库表构造变更(例如 CREATE、ALTER TABLE…)以及表数据批改(INSERT、UPDATE、DELETE…)的二进制日志。不会记录 SELECT 和 SHOW 这类操作,因为这类操作对数据自身并没有批改,但能够通过查问通用日志来查看 MySQL 执行过的所有语句。

须要留神的一点是,即使update 操作没有造成数据变动,也是会记入 binlog

不论用什么存储引擎,只有产生了表数据更新,都会产生 binlog 日志。

binlog 有两个罕用的应用场景:

  • 主从复制:mysql replication 在 master 端开启 binlog,master 把它的二进制日志传递给 slaves 来达到 master-slave 数据统一的目标。
  • 数据恢复:通过 mysqlbinlog 工具来复原数据。

binlog会记录所有波及更新数据的逻辑操作,并且是程序写。

记录格局

binlog 日志有三种格局,能够通过 binlog_format 参数指定。

  • statement
  • row
  • mixed

指定statement,记录的是逻辑 SQL 语句,比方执行一条update T set update_time=now() where id=1,记录的内容如下。长处是日志文件小,节约 IO,进步性能。

同步数据时,会执行记录的 SQL 语句,然而有个问题,update_time=now()这里会获取以后零碎工夫,间接执行会导致与原库的数据不统一。

row 记录表的行更改状况,准确性强,能够为数据库的复原、复制带来更好的可靠性;然而二进制文件的大小相较于 STATEMENT 会有所增加,较大的网络 IO 和磁盘 IO。

mixed:STATEMENT 和 ROW 模式的混合。默认采纳 STATEMENT 格局进行二进制日志文件的记录,然而在一些状况下会应用 ROW 格局。

写入机制

binlog的写入机会也非常简单,事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把binlog cache 写到 binlog 文件中。

因为一个事务的 binlog 不能被拆开,无论这个事务多大,也要确保一次性写入,所以零碎会给每个线程调配一个块内存作为binlog cache

咱们能够通过 binlog_cache_size 参数管制单个线程 binlog cache 大小,如果存储内容超过了这个参数,就要暂存到磁盘(Swap)。

binlog日志刷盘流程如下

  • 上图的 write,是指把日志写入到文件系统的 page cache(binlog file),并没有把数据长久化到磁盘,所以速度比拟快
  • 上图的 fsync,才是将数据长久化到磁盘的操作。个别状况下,咱们认为 fsync 才占磁盘的 IOPS。

writefsync 的机会,能够由参数 sync_binlog 管制,默认是1

  • N=1:示意采纳同步写磁盘的形式来写二进制日志,这时写操作不应用操作系统的缓冲来写二进制日志,每次事务提交都会写入文件。
  • N=0:为 0 的时候,示意每次提交事务都只 write,由零碎自行判断什么时候执行fsync。尽管性能失去晋升,然而机器宕机,page cache 外面的 binlog 会失落。
  • 最初还有一种折中形式,能够设置为 N(N>1),示意每次提交事务都write,但累积N 个事务后才 fsync。在呈现IO 瓶颈的场景里,将 sync_binlog 设置成一个比拟大的值,能够晋升性能。同样的,如果机器宕机,会失落最近 N 个事务的 binlog 日志。

binlog_cache 相干参数介绍

属性 阐明
binlog_cache_size 示意 binlog_cache 的容量,默认大小为 32K.
binlog_cache_use 记录了应用缓冲写二进制日志的次数
binlog_cache_disk_use 记录了应用临时文件写二进制日志的次数

binlog_cache_size 是基于会话 (session) 的。每个线程一个,参数 binlog_cache_size 用于管制单个线程内 binlog cache 所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘(临时文件中)。

binlog 的存储地位

show variables like 'datadir'

查问 binlog 文件的默认大小

show variables  like 'max_binlog_size'

max_binlog_size 指定了单个二进制文件的最大值(默认 1G)。如果超过该值,则产生新的二进制文件,后缀名 +1,并记录到 index 文件。

日志主动清理

show variables  like 'expire_logs_days'
退出移动版