签到成功

知道了

CNDBA社区CNDBA社区

Mysql sync_binlog参数

2021-11-27 16:06 1040 0 原创 mysql
作者: hbhe0316

sync_binlog :这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性。对于“sync_binlog”参数的各种设置的说明如下:

http://www.cndba.cn/hbhe0316/article/22619

1、sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。http://www.cndba.cn/hbhe0316/article/22619

http://www.cndba.cn/hbhe0316/article/22619

2、sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。http://www.cndba.cn/hbhe0316/article/22619http://www.cndba.cn/hbhe0316/article/22619

在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响,就是对写入性能影响太大,binlog虽然是顺序IO,多个事务同时提交,同样很大的影响MySQL和IO性能。虽然可以通过group commit的补丁缓解,但是刷新的频率过高对IO的影响也非常大。对于高并发事务的系统说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。http://www.cndba.cn/hbhe0316/article/22619

所以很多MySQL DBA设置的sync_binlog并不是最安全的1,而是100、1000 或者是0。这样牺牲一定的一致性,可以获得更高的并发和吞吐量!http://www.cndba.cn/hbhe0316/article/22619

编写存储过程http://www.cndba.cn/hbhe0316/article/22619

DROP PROCEDURE if exists insert_t2;
DELIMITER //
CREATE PROCEDURE insert_t2(IN loop_times INT)
BEGIN
    DECLARE var INT DEFAULT 0;
    WHILE var < loop_times DO
        INSERT INTO testdb.t2 VALUES (var,'aaa');
        SET var = var + 1;
    END WHILE;
END //
DELIMITER ;

1.设置sync_binlog=0http://www.cndba.cn/hbhe0316/article/22619

mysql> SET GLOBAL sync_binlog=0;
Query OK, 0 rows affected (0.00 sec)

mysql> call insert_t2(500000);
Query OK, 1 row affected (23 min 28.71 sec)

2.设置sync_binlog=1

http://www.cndba.cn/hbhe0316/article/22619

mysql> SET GLOBAL sync_binlog=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 1     |
+---------------+-------+
1 row in set (0.00 sec)

mysql> truncate table t2;
Query OK, 0 rows affected (0.01 sec)

mysql> call insert_t2(500000);
Query OK, 1 row affected (1 hour 10 min 34.30 sec)

版权声明:本文为博主原创文章,未经博主允许不得转载。

MYSQL

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
hbhe0316

hbhe0316

关注

1.只有承认无知,才能装下新的东西; 2.进步来自一点点滴滴的积累; 3.广博让你更优秀,而专业让你无法替代; 4.挫折和失败能够转换为一种财富。

  • 889
    原创
  • 1
    翻译
  • 13
    转载
  • 24
    评论
  • 访问:1180868次
  • 积分:1523
  • 等级:核心会员
  • 排名:第6名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ