欢迎重视MySQL专栏MySQL历险记
强烈建议收藏本导航文【MySQL历险记】MySQL的核心特性汇总
前语
bin log想必咱们多多少少都有听过,它是MySQL中一个非常重要的日志,所以各位架构师们,假设有不了解的,一定要好好学习了,由于它涉及到数据库层面的主从仿制、高可用等规划。
bin log是什么?
bin log
全称binary log
,二进制日志文件,它记载了数据库一切履行的 DDL
和 DML
等数据库更新的句子,可是不包含select
或许show
等没有修正任何数据的句子。它是MySQL级别的日志,也便是说一切的存储引擎都会产生bin log
,而redo log
或许undo log
业务日志只有innoDB
存储引擎才有。
那bin log
有什么用呢?
-
数据康复,假设MySQL数据库意外挂了,能够使用
bin log
进行数据康复,由于该日志记载一切数据库一切的改变,确保数据的安全性。 - 数据仿制,使用一定的机制将主节点MySQL的日志数据传递给从节点,完成数据的共同性,完成架构的高可用和高性能。
所以bin log
关于数据备份、主从、主主等都都起到了关键作用。
bin log和redo log差异?
看了上面的bin log
介绍,是不是感觉和业务日志redo log
特别像呢?也是在业务履行的时分记载日志,可是他们还是有差异的。
你知道redo log吗, 假设不了解的话请参阅这篇文章:详解MySQL业务日志——redo log
咱们现在从多个视点对比下他们俩终究有什么不一样?
从使用场景视点来说:
-
redo log
主要完成故障情况下的数据康复,确保业务的持久性 -
bin log
主要用于数据灾备、同步
从数据内容视点来说:
-
redo log
是”物理日志”, 记载的是详细数据页上做了什么修正 -
bin log
是”逻辑日志”, 记载内容是句子的原始逻辑,相似于“给 ID=2 这一行的 name 改为alvin”
从生成范围视点来说:
-
redo log
是InnoDB
存储引擎生成的业务日志,其他存储引擎没有 -
bin log
是MySQL Server生成的日志,一切的存储引擎都有
从生成时机视点来说:
-
redo log
是在业务履行进程中就会write -
bin log
是在业务提交的时分write
bin log怎样写的?
那bin log
是什么时分写的,写入的机制又是怎样样的呢?
bin log
写入的全体流程如下图所示:
- 为了确保写的功率,会将业务的
bin log
先写到binlog cache
中,留意,这个cache
坐落业务线程的内存中,主要是一个业务的bin log
不能被拆开,是一个全体 - 在提交业务的时分,将
binlog cache
中的数据共同写道文件体系缓存page cache
中,这个进程速度也很快 - 然后依据不同的战略,将文件体系缓存中的
bin log
fsync刷到磁盘中,这儿的战略后边详细解说。
3种刷盘战略:
bin log
和 redo log
相似,都有3种刷盘战略, bin log
的write和fsync时机是由参数 sync_binlog
操控,默认是 0 。
sync_binlog = 0
为0的时分,表明每次提交业务都只 write
,由体系自行判断什么时分履行fsync
。虽然性能得到提高,可是机器宕机,page cache
里边的 binglog
会丢掉。
- sync_binlog = 1
- 表明每次提交业务都会履行
fsync
,愈加安全
- sync_binlog = N
- 能够设置为N(N>1),表明每次提交业务都write,但累积N个业务后才fsync
咱们现已知道,业务履行时会一起记载redo log
和bin log
两种日志,那会有日志犯错不共同问题吗?
-
redo log
在业务履行进程中能够不断写入 -
bin log
只有在提交业务时才写入
假设业务履行sqlupdate T set c = 1 where id = 2
,在写完redo log
日志后,bin log
日志写期间产生了反常,会呈现什么情况呢?
由于bin log
没写完就反常,这时分bin log
里边没有对应的修正记载。因此,之后用bin log
日志康复数据时,就会少这一次更新,康复出来的这一行c值为0,而原库由于redo log
日志康复,这一行c的值是1,最终数据不共同。
那有什么解决计划吗?二阶段提交计划。
为了解决两份日志之间的共同性问题,InnoDB存储引擎使用两阶段提交计划。将redo log
的写入拆成了两个步骤prepare
和commit
。
- 假设现在写入
bin log
时MySQL产生反常,这时分的redo log
还处于prepare
阶段,重启MySQL后,依据redo log
记载中的业务ID,发现没有对应的bin log
日志,回滚前面已写入的数据。 - 假设
redo log
在commit
阶段产生移除,可是能通过业务id找到对应的bin log
日志,所以MySQL认为是完好的,就会提交业务康复数据。
bin log写到哪了?
前面解说了bin log
写入的进程,那么它写到了哪里去了呢?
- 检查bin log方位
能够通过指令show variables like '%log_bin%';
检查bin log
最终输出的方位。
-
log_bin_basename
: 是bin log
日志的根本文件名,后边会追加标识来表明每一个文件 -
log_bin_index
: 是binlog文件的索引文件,这个文件管理了一切的binlog文件的目录
通过 SHOW BINARY LOGS;
检查当时的二进制日志文件列表及巨细,如下图:
- 修正 bin log方位
修正MySQL的my.cfg
或my.ini
配置
#启用二进制日志
log-bin=cxw-bin
binlog_expire_logs_seconds=600
max_binlog_size=100M
-
log-bin
:bin log
日志保存的方位 -
binlog_expire_logs_seconds
:bin log
日志保存的时间,单位是秒 -
max_binlog_size
: 单个bin log
日志的容量
bin log内容长啥样?
咱们现已知道了bin log
的方位了,那它里边的内容长什么样呢?
咱们能够用show binlog events
指令东西检查bin log
日志中的内容。
show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
- IN ‘log_name’ :指定要查询的binlog文件名(不指定便是第一个binlog文件)
- FROM pos :指定从哪个pos起始点开端查起(不指定便是从整个文件首个pos点开端算)
- LIMIT [offset] :偏移量(不指定便是0)
- row_count :查询总条数(不指定便是一切行)
bin log 格局
实际上bin log输出的格局类型有3种,默认是ROW类型,便是上面比方中的格局。
-
Statement格局:每一条会修正数据的sql都会记载在
bin log
中
- 长处:不需要记载每一行的变化,减少了
bin log
日志量,节约了IO,提高性能。 - 缺陷:比方sql中存在函数如now()等,依赖环境的函数,会导致主从同步、康复数据不共同
- ROW格局:为了解决Statement缺陷,记载详细哪一个分区中的、哪一个页中的、哪一行数据被修正了
- 长处:清楚的记载下每一行数据修正的细节,不会呈现某些特定情况下 的存储进程,或function无法被正确仿制的问题。
- 缺陷:比方对
ID<600
的一切数据进行了修正操作,那么意味着许多数据产生变化,最终导致同步的log许多,那么磁盘IO、网络带宽开销会很高。
- Mixed格局: 混合形式,即Statment、Row的结合版
- 关于能够仿制的SQL选用Statment形式记载,关于无法仿制的SQL选用Row记载。
总结
本文解说了MySQL中的一个非常重要的日志bin log,它主要用来做数据康复和同步的,所以作为程序员的咱们,还是很有必要对它有一个深化的认识。
假设本文对你有协助的话,请留下一个赞吧
本文正在参与「金石计划 . 分割6万现金大奖」