mysql事务持久性与性能的矛盾如何平衡_调整刷盘频率配置

夏枫同学_8332

夏枫同学_8332

2026-05-11

823人浏览

原创

会丢数据,但仅在特定崩溃场景下丢失最近1秒(设为0)或最多1秒(设为2)的事务日志;innodb数据文件仍受doublewrite和redo log保护,风险仅限未刷入ib_logfile的commit记录。

mysql事务持久性与性能的矛盾如何平衡_调整刷盘频率配置

innodb_flush_log_at_trx_commit 设为 0/2 会丢数据吗?

会,但只在特定崩溃场景下丢最近 1 秒(设为 0)或最多 1 秒(设为 2)的事务日志,不是全量数据丢失。InnoDB 的数据文件(ibd)本身仍受 doublewrite 和 redo log 恢复机制保护,真正风险在于未刷入 ib_logfile 的那部分 commit 记录。

  • 设为 1(默认):每次 COMMIT 都强制 fsync 到磁盘,强持久性,性能最差
  • 设为 2:写入 OS 缓存即返回成功,每秒由后台线程 fsync 一次;断电且 OS 缓存未落盘时,最多丢 1 秒事务
  • 设为 0:仅写入 log buffer,每秒刷一次到 OS 缓存 + fsync;MySQL 崩溃(非 OS 崩溃)时可能丢最多 1 秒,OS 崩溃则可能全丢

什么时候能放心调低 innodb_flush_log_at_trx_commit?

核心看业务对“已确认事务”的容忍边界——不是所有写操作都要求强持久。典型可调场景:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 日志类、埋点类、统计汇总表等允许少量丢失的写入
  • 内部工具后台任务,失败可重跑,且事务间无强依赖
  • 读多写少 + 写入吞吐瓶颈明显,监控显示 Innodb_log_waits > 0 或 innodb_os_log_pending_fsyncs 持续不为 0
  • 使用了可靠的 UPS + 文件系统支持 barrier(如 ext4/xfs mount 时带 barrier=1),可降低 2 的风险

sync_binlog 和 innodb_flush_log_at_trx_commit 必须配对调吗?

必须。否则主从一致性或崩溃恢复会出问题。MySQL 5.7+ 在启用 binlog 时,若 sync_binlog != 1 且 innodb_flush_log_at_trx_commit != 1,无法保证 crash-safe replication。

  • 要开启 GTID 或半同步复制,建议两个都设为 1
  • 若接受主从延迟和小概率不一致,可设为 sync_binlog = 1000 + innodb_flush_log_at_trx_commit = 2,但需确保 binlog_format = ROW
  • 设为 0 时,sync_binlog 实际失效,因为 binlog 刷盘依赖于事务提交路径,此时 binlog 可能比 redo log 更滞后

调整后怎么验证效果和风险?

不能只看 TPS 上升,重点查三件事:日志刷盘压力是否缓解、崩溃恢复是否正常、主从延迟有无异常波动。

  • 监控 SHOW GLOBAL STATUS LIKE 'Innodb_log_waits',值长期为 0 表示 log buffer 不再频繁等待刷盘
  • 用 mysqladmin debug 后检查 error log 中是否有 Log sequence number 跳变或 recovery warning
  • 模拟 kill -9 杀 MySQL 进程(非 service stop),重启后查 SELECT COUNT(*) FROM t WHERE ctime > '最近1秒时间戳' 是否有记录缺失
  • 对比调整前后 pt-stalk 抓取的 SHOW ENGINE INNODB STATUS,关注 LOG 小节中 log i/o's done 和 pending log writes
实际调参时最容易被忽略的是存储层行为:NVMe 盘上 fsync 延迟可能只有 0.1ms,但某些云盘(尤其共享型)的 fsync 延迟波动极大,有时单次超 50ms —— 这时候设成 1 反而比 2 更卡,得结合 iostat -x 1 看 await 和 %util 综合判断。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2353

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1419

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

835

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3292

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5608

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1219

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5891

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

5102

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6834

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 191人学习