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

MySQL 基础知识梳理学习(七)----sync_binlog

程序员文章站 2022-05-02 12:12:24
一般在生产环境中,很少用MySQL单实例来支撑业务,大部分的MySQL应用都是采用搭建集群的方法。搭建MySQL集群,可以进行数据库层面的读写分离、负载均衡或数据备份。基于MySQL原生的Replication是最常见的保证数据库安全的机制,满足数据库的高可用,在数据库发生宕机的情况后,其他节点还能 ......

一般在生产环境中,很少用mysql单实例来支撑业务,大部分的mysql应用都是采用搭建集群的方法。搭建mysql集群,可以进行数据库层面的读写分离、负载均衡或数据备份。基于mysql原生的replication是最常见的保证数据库安全的机制,满足数据库的高可用,在数据库发生宕机的情况后,其他节点还能快速提供服务,并且数据库的数据不丢失。

binlog是用来保存数据库修改的日志信息。一般的主从复制都是基于binlog的,binlog的安全直接关系到主从复制的安全,而binlog的写入方式主要由参数sync_binlog来控制。参数取值主要如下:

参数取值 影响的行为
sync_binlog=0 事务提交时,mysql将binlog信息写入到binlog文件(os cache)中,但是mysql不控制binlog的刷盘操作,由文件系统自己控制其缓存的刷新。缺点是,一旦操作系统宕机,在binlog cache中的所有binlog都会丢失。如果只是数据库宕机,而操作系统不宕机,那么数据库所生成的binlog都不会丢失。
sync_binlog=1 每一个事务提交时,mysql都会把binlog刷新到磁盘中,这样,数据库的安全性最高。缺点是,性能损耗是最大的。此设置可以保证,在数据库或者操作系统宕机的情况下,二进制日志中缺少的任何事务也只能处于准备阶段,那么导致服务器自动恢复时,会回滚这些事务,保证无数据丢失。虽然binlog是顺序io,但是多个事务同时提交,同样会对mysql和io的性能带来很大的影响,不过mysql可以通过group commit来缓解这种压力。
sync_binlog=n(n>1) 表示每n次事务提交,mysql调用文件系统的刷新操作将缓存刷新到磁盘中。如果数据库或者操作系统在这个时候宕机,数据库库可能会丢失一些数据。

 

附:两阶段提交

mysql在开始binlog后,事务在提交时会自动被分成prepare 和 commit 两个阶段。

* prepare 阶段:告诉innodb引擎做prepare,innodb更改事务状态,并且redo log刷入磁盘。

* commit 阶段:先记录binlog日志,然后告诉innodb引擎commit。

mysql通过两阶段提交的方式保证宕机时数据的安全。 

 

-----主要内容参考梳理于网络知识,此短文仅为学习笔记,在此原创作者感谢!