MySQL的binlog有啥用?谁写的?在哪里?怎么配置

1、唠嗑

文章公号 首发!连载中!关注微信公号回复:“抽奖” 还可参加抽📖活动
html

算上这一篇文章,白日梦的MySQL专题已经写了18篇了。前面的文章中有跟你们分享过undo log、redo log、以及接下来要有几篇文章跟你们分享bin log。mysql

前一阵跟一个同窗唠嗑,说到了MySQL的这几个日志。那同窗就感受这几个日志挺深奥的挺难懂的。其实不用这么吓唬本身。golang

就好比说这几个日志,你有没有想过MySQL为啥要写日志呢?写日志就得有磁盘IO、不写不香吗?速度、性能还会变快。其实否则,MySQL会写日志,是由于记录下的日志能赋予MySQL必定的能力。sql

好比undo log让mysql有回滚事物的能力,redo log让mysql有崩溃恢复的能力,以及咱们如今说的bin log让MySQL有搭建集群、数据备份、恢复数据的能力。数据库

那你说,我不想让MySQL记录那些日志不行吗?确定行啊!甚至默认状况下,MySQL都不会主动为你记录bin log ,可是话说回来,你不让它写那些日志,它就没有相应的能力给你用。是吧!因此综合来讲,写日志仍是很香的。缓存

知道了这些,再去学相关的知识点是否是目的性很强了呢?关于undo log、redo log白日梦前面已经和你们分享过了,知无不言的那种分享哈,若是你又有感受了,欢迎关注我而后去翻看。bash

对于大部分研发同窗来讲,确定据说过bin log。而后却不必定知道binlog在哪里?谁写的?怎么配置binlog?以及binlog有啥用。因此接下来的几篇文章,咱们一块儿看看binlog的二三事,让你更好的理解binlog。微信


2、什么是bin log?

bin log是MySQL的二进制日志文件,翻译成中文名反到是感受怪怪的。因此说下面直接称他为binlog。工具

咱们都知道MySQL分为两大部分。上层是MySQL-Server,下层是可插拔的存储引擎。性能

binlog就是由MySQL的Server层产生。


3、它在哪里?

binlog存放的位置由datadir参数控制。

你能够经过下面的方式查看到它

知道了binlog具体在哪里,你就能够看一眼,以下

目录下有两种文件:mysql-bin.0000XX 和 mysql-bin.index

前者保存着对MySQL更改的逻辑

然后者长下面这样,估计你一看就懂了~


4、bin log的相关配置

通常关于binlog的配置都写在MySQL的配置文件中: my.cnf , 以方便启动mysql时直接让这些配置生效

做为了解,你能够大概搂一眼binlog的配置项

[mysqld]
# binlog相关配置

# 指定binlog日志存储的位置
datadir                  = /home/mysql/mysql/var

# 规范binlog的命名为 mysql-bin.0000XX
# 若是加这行配置,binlog文件名为主机名
log-bin                  = mysql-bin

# 索引当前全部的binlog
log-bin-index            = mysql-bin.index

# 最大的大小
max_binlog_size          = 1G

# binlog的sync时机
sync-binlog              = 1

# binlog的格式
binlog-format            = ROW

# 保留七天的binlog
expire_logs_days = 7

5、binlog 有啥用?

若是说redolog中记录的是偏向物理层面的记录,如:对哪一个数据页的那个记录作了什么修改。

那么binlog中记录的是偏向逻辑层面的记录:如:对xxx表中的id=yyy的行作作了什么修改,更改后的值是什么。

binlog不会记录你的 select 、show这类的操做。

你能够在query log中找到曾经执行过的诸如select、show这种仅查询的SQL。

常见的binlog有以下的做用。

  1. delete没加where条件?不慌!binlog能够帮你恢复数据
  2. 搭建一套一主两从的MySQL集群,binlog帮你完成主从的数据同步。
  3. 审计,经过分析binlog能够排查是否存在SQL注入攻击。

可是你知道吗?

默认binlog是不开启的。由于开启binlog后会稍微下降一点mysql的性能(1%)。

可是开启binlog后你就能够搭建MySQL集群,排查SQL注入,恢复误删的数据。因此线上的MySQL集群都是开启binlog的,是否是感受开启binlog颇有保障!很香呢?


6、超有用的参数 sql_log_bin

跟你们分享一种线上实际存在的场景,你就能知道该参数的妙用了。

好比你线上使用的是一个一主两从的MySQL集群,而后有一个活动来了,你须要给线上某库的某数据表添加一列,而且这个表里面的数量很是之庞大。

添加一列是须要获取表锁的,而且庞大的数据量让你alter table异常缓慢,在获取表锁的过程当中,正常的DML也会被阻塞。这时你就得考虑无损DDL,好比golang的ghost(怎么作的无损ddl原理我后门的文章会写的,本篇不展开)。

ghost工具的特色是,它须要预执行一些SQL目的是先校验一下你的集群符不符合它的要求,为了避免对线上产生影响,你确定会想把这些预执行的sql放到从库上执行。放在从库上执行当然没问题,可是你执行的sql会产生bin log。出现新的GTID(后面讲MySQL集群时会跟你们分享,这里你只须要理解成是一个事物的惟一标识就行)更要命的是,主库中没有这些GTID。

当主从都正常运行时,主从bin log不一致不要紧,可是当从库宕机的时候,从库重启会将本身的GTID集合发送给主库,因为从库多出来一部分主库没有的GTID,会致使该从库不能再次加入集群。

其实这个问题也好解决。使用这个参数 sql_log_bin

sql_log_bin变量控制是否为当前会话启用到二进制日志的日志记录(假设二进制日志自己已启用)。默认值为ON。要为当前会话禁用或启用二进制日志记录,请将会话sql_log_bin变量设置为 OFFON

全局sql_log_bin变量是只读的,没法修改。


7、将来几篇文章

本文到这里就行将结束了,归纳性的在各个方面讲述了一下binlog,让你对binlog有了一个大概的了解。

在后续的几篇文章中我会尝试针对binlog的某个点展开问答式的叙述。以下,欢迎关注,敬请期待。

binlog的写入时机?binlog到底长啥样?有哪些格式?各类格式的binlog的优缺点?恢复数据?

关于 “搭建一套一主两从的MySQL集群,binlog帮你完成主从的数据同步。”会放在MySQL集群部分穿插串讲起来。

参考:

https://dev.mysql.com/doc/refman/5.7/en/binary-log.html

https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html

https://dev.mysql.com/doc/refman/5.7/en/set-sql-log-bin.html


推荐阅读

  1. 你们常说的基数是什么?(已发布)

  2. 讲讲什么是慢查!如何监控?如何排查?(已发布)

  3. 对NotNull字段插入Null值有啥现象?(已发布)

  4. 能谈谈 date、datetime、time、timestamp、year的区别吗?(已发布)

  5. 了解数据库的查询缓存和BufferPool吗?谈谈看!(已发布)

  6. 你知道数据库缓冲池中的LRU-List吗?(已发布)

  7. 谈谈数据库缓冲池中的Free-List?(已发布)

  8. 谈谈数据库缓冲池中的Flush-List?(已发布)

  9. 了解脏页刷回磁盘的时机吗?(已发布)

  10. 用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!(已发布)

  11. 据说过表空间没?什么是表空间?什么是数据表?(已发布)

  12. 谈谈MySQL的:数据区、数据段、数据页、数据页究竟长什么样?了解数据页分裂吗?谈谈看!(已发布)

  13. 谈谈MySQL的行记录是什么?长啥样?(已发布)

  14. 了解MySQL的行溢出机制吗?(已发布)

  15. 说说fsync这个系统调用吧! (已发布)

  16. 简述undo log、truncate、以及undo log如何帮你回滚事物! (已发布)

  17. 我劝!这位年轻人不讲MVCC,耗子尾汁! (已发布)

  18. MySQL的崩溃恢复究竟是怎么回事? (已发布)

  19. MySQL的binlog有啥用?谁写的?在哪里?怎么配置 (已发布)

相关文章
相关标签/搜索