mysql数据一致性解析
什么是 innodb_support_xa?
关于 innodb_support_xa 的一个常见误解是,它启用用户发起的 XA 事务,即使用外部事务协调器在多个系统上准备并提交的事务。这实际上并不是该选项的确切用途。它启用InnoDB 中的两阶段提交(准备,然后提交)。这不仅对于用户发起的 XA 是必要的,而且对于InnoDB 事务日志和 MySQL 二进制日志之间的内部XA 协调也是必要的,以确保它们是一致的。一致是一个具有特殊含义的重要词。
mysql8.0中此参数已经删除。
参数innodb_support_xa被移除,原因是该参数已经失效,一方面当XA设置为OFF时,PREPARE事务只能回滚,无法提交;另一方面要保证Binlog/Engine故障恢复的数据一致性。
删除此参数后,XA 默认启用。
似乎有许多系统变量会影响 binlog 与 InnoDB 的一致性:
– sync_binlog #同步binlog,为一,表示同步写磁盘的方式来写二进制日志。一个事务发出commit前,会将binlog写入磁盘,如果提交还没有发生,并且此时发生了宕机,那么在下次启动时,这个事务会回滚,为了保证数据的一致性,就关系到innodb_support_xa事务有关。
– binlog_format
– innodb_flush_log_at_trx_commit #控制MySQL实例在事务提交后,是否立即将日志缓冲数据更新至log file文件中,用于进行数据持久化。
– innodb_locks_unsafe_for_binlog
– innodb_support_xa
– tx_isolation
sync_binlog
sync_binlog是MySQL Binlog日志的重要参数,用于控制Binlog的更新策略,通过对该参数的调优,可以提升数据库的性能和数据安全性:
-
当sync_binlog=1时,MySQL会在每次事务提交后,将Log Buffer中的数据更新到磁盘上,此时MySQL安全性较高,但是IO消耗也较高。
-
当sync_binlog=0时,MySQL会在每次事务提交后将binlog_cache中的数据更新至文件系统缓冲区,但不会进行持久化,而是依赖操作系统来调度数据刷入磁盘。
-
当sync_binlog=N时,MySQL会在每N组事务提交后将数据更新到磁盘中。通过这种方式,可以在一定程度上平衡MySQL的性能和数据的安全性。如果N设置得比较大,可以提高系统的性能,但会降低数据的安全性。
综上所述,innodb_flush_log_at_trx_commit和sync_binlog参数需要根据具体的需求来设置:
-
在对数据安全性要求较高的场景下,建议将这两个参数设置为1。
-
在对实例性能要求较高的场景下,建议将这两个参数设置为0或者将innodb_flush_log_at_trx_commit设置为0,sync_binlog设置为N,以提高系统的性能,但需要注意可能会增加数据丢失的风险。