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

mysql 双1设置

程序员文章站 2022-07-15 13:23:59
...

os: centos 7.4
db: mysql 5.7.28

mysql 写入数据时,在不允许丢数据的场景下就需要采用双1策略。

双1指的是 sync_binlog、innodb_flush_log_at_trx_commit 这两个参数都要设置为1,
适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务(磁盘为 PCIE SSD)

sync_binlog=1;
innodb_flush_log_at_trx_commit=1;

秒杀或者高并发场景下推荐的做法是
innodb_flush_log_at_trx_commit=2 ,
sync_binlog=N (N为500 或1000)
且使用带蓄电池后备电源的缓存 cache ,防止系统断电异常。

版本

# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core) 
# 
# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.28 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.28    |
+-----------+
1 row in set (0.00 sec)

mysql> 

sync_binlog

该参数表示事务写入 binary log 并使用 fdatasync() 函数同步到磁盘的过程。
取值为0:mysql 自己不主动同步,依赖操作系统本身不定期把文件内容刷新到磁盘。性能最佳

取值为1:每次事务提交后将 binlog_cache 中的数据强制写入磁盘 bin log日志中,是最慢的,但是最安全

取值 >1:当进行n次事务提交后,mysql 将 binlog_cache 中的数据强制写入磁盘中。

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

innodb_flush_log_at_trx_commit

该参数表示 log buffer 写入 log file 以及刷新到磁盘的过程。
取值为0:log buffer 每秒写入日志文件 log file 并刷新 flush 到磁盘。这种情况下,mysql 的日志刷写操作和事务提交操作没有关系。因此 mysql 的性能是最好的时刻。不过不安全

取值为1:每次事务提交时,log buffer 会被写入到日志文件并且还要刷写到磁盘上。由于每次事务都要提交到I/O设备,因此会慢一点,不过是最安全的。

取值为2:0和1的中间效果,即每次的事务提交会写入 log buffer,而刷写到磁盘则是一秒进行一次。性能属于一般。

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

当 sync_binlog 和 innodb_flush_log_at_trx_commit 都为 1 时是最安全的,在 mysqld 服务崩溃或者服务器主机 crash 的情况下,binary log 只有可能丢失最多一个语句或者一个事务。
但是双11 会导致频繁的io操作,因此该模式也是最慢的一种方式。

参考:
https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html#sysvar_sync_binlog
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

相关标签: # mysql parameter