一、唠嗑

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

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

前一阵跟一个同学唠嗑,说到了MySQL的这几个日志。那同学就感觉这几个日志挺深奥的挺难懂的。其实不用这么吓唬自己。

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

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

那你说,我不想让MySQL记录那些日志不行吗?肯定行啊!甚至默认情况下,MySQL都不会主动为你记录bin log ,但是话说回来,你不让它写那些日志,它就没有相应的能力给你用。是吧!所以综合来说,写日志还是很香的。

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

对于大部分研发同学来说,肯定听说过bin log。然后却不一定知道binlog在哪里?谁写的?怎么配置binlog?以及binlog有啥用。所以接下来的几篇文章,我们一起看看binlog的二三事,让你更好的理解binlog。

二、什么是bin log?

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

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

binlog就是由MySQL的Server层产生。

三、它在哪里?

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

你可以通过下面的方式查看到它

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

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

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

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

四、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

五、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很有保障!很香呢?

六、超有用的参数 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变量是只读的,无法修改。

七、未来几篇文章

本文到这里就行将结束了,概括性的在各个方面讲述了一下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有啥用?谁写的?在哪里?怎么配置 (已发布)

MySQL的binlog有啥用?谁写的?在哪里?怎么配置的更多相关文章

  1. 解说mysql之binlog日志以及利用binlog日志恢复数据

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废 ...

  2. 【MySQL】binlog缓存的问题和性能

    之前在没有备库的情况下,遇到过more than 'max_binlog_cache_size' bytes of storage 的错误,今天在主备复制的时候又遇到了这个问题 Last_SQL_Er ...

  3. 【Mysql学习笔记】浅析mysql的binlog

    最近读一份关于“数据库事务故障恢复"的技术资料,发现对mysql的binlog的认识不够清楚,查阅mysql reference manual有所收获,作为笔记,记录于此. 1. What' ...

  4. mysql对binlog的处理

    --mysql对binlog的处理 ------------------------2014/05/28 Binlog是mysql以二进制形式打印的日志,它默认不加密,不压缩.每个正常的binlog文 ...

  5. MySQL基于binlog主从复制

    MySQL复制介绍 默认情况 下复制是异步进行的,从库也不需要一直连接到主库来同步数据 MySQL复制的数据粒度可以是主实例上所有的数据库,也可以是指定的一个或多个数据库 ,也可以是一个数据库里的指定 ...

  6. mysql之binlog

    binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...

  7. MySQL的binlog恢复(Windows下)

    前言 在最近的工作中,由于自己粗(zuo)心(si)误update操作导致几百行的数据出现错误,在心急如焚的同时(那时候我竟然不知道除了备份之后还有binlog日志恢复)立马查资料学习binlog的恢 ...

  8. Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 一 ...

  9. MySQL的binlog日志<转>

    binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...

随机推荐

  1. centos下多网卡做bond脚本

    多网卡或者单网卡形式下的网卡bonding #! /bin/sh #获取当前网卡数 ethnum=`lspci | grep Ethernet | wc -l` echo $ethnum #如果网卡数 ...

  2. 总是说spring难学?来看完这些spring的注解及其解释,真香!

    前言 用过spring的人都知道,spring简单的通过注解就可以完成很多事情,但这些东西是如何实现的呢以及如何应用到我们自己的代码中?接下来,让我们一起开启注解的旅程. 1. @Controller ...

  3. 怎么用MindManager自带的模板和设计画思维导图

    小编知道大家平时工作学习都很忙,思维导图能完成的效率越高越好.所以今天,小编就为大家介绍两个能高效使用思维导图软件完成制作思维导图的小技巧.保证内容充实美观,还不费时间. 一.使用模板 打开MindM ...

  4. 使用iMindMap思维导图软件的活动策划模板制定策划方案

    活动策划不单单是一个头脑风暴的过程,更是一个整合各项资源.条件的过程.因此我们可以合理的使用思维导图软件来做活动策划.iMindMap(Windows系统)思维导图软件提供了快捷而方便的活动策划模板, ...

  5. Win搭建JAVA环境

    一:下载JDK 下载链接:https://www.oracle.com/java/technologies/javase-downloads.html 选择你的系统环境进行下载 二:安装JDK 直接运 ...

  6. IPv6 Rapid Deployment, IPv6 6rd初探

    IPv6 Rapid Deployment: Provide IPv6 Access to Customers over an IPv4-Only Network 原文地址:https://www.c ...

  7. 4 种高可用 RocketMQ 集群搭建方案!

    背景 笔者所在的业务线,最初化分为三个服务,由于业务初期业务复杂度相对简单,三个业务服务都能很好的独立完成业务功能. 随着产品迭代,业务功能越来越多后慢慢也要面对高并发.业务解耦.分布式事务等问题,所 ...

  8. 【mq读书笔记】消息确认(失败消息,定时队列重新消费)

    接上文的集群模式,监听器返回RECONSUME_LATER,需要将将这些消息发送给Broker延迟消息.如果发送ack消息失败,将延迟5s后提交线程池进行消费. 入口:ConsumeMessageCo ...

  9. C# WinForm UDP 发送和接收消息

    using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; ...

  10. 06_Intent和IntentFilter

    Intent是同一个或不同的应用中的组件之间的消息传递的媒介,是一个将要执行动作的抽象描述,一般来说是作为参数来使用. Intent描述要启动的基本组件: IntentFilter对组件进行过滤. 下 ...