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通过两阶段提交的方式保证宕机时数据的安全。
-----主要内容参考梳理于网络知识,此短文仅为学习笔记,在此原创作者感谢!
上一篇: SQL 存储过程中事务回滚
下一篇: Linuxg环境搭建