MySQL的YOLO模式

115 阅读3分钟

MySQL的YOLO模式

KRISTIAN KÖHNTOPP [hudson译]

2022年9月2日

哦:

“现在,让我们快速将20亿行数据推送到这个数据库VM中。”

这最好在YOLO模式下完成。这是数据库的一种操作模式,它可以最大限度地减少磁盘写入,从而支持成批批量写入。

它不是ACID,因此如果在加载过程中出现任何错误,实例就会丢失。所以称之为YOLO模式。

您应该在备用副本而不是生产主副本上执行此操作。如果您的MySQL部署中没有至少多出一个副本,我认为您的设置有缺陷。

提交时禁用刷新

set global innodb_flush_log_at_trx_commit = 2;

此配置变量 放弃ACID提交:提交时,数据被写入文件系统缓冲区缓存,但不强制执行fdatasync(2)。相反,数据每秒同步一次。

禁用双写缓冲区

设置全局innodb_doublewrite=OFF;

禁用InnoDB DoubleWrite Buffer。此缓冲区存储由多个磁盘块组成的整个页面的临时副本,它可以在从不覆盖数据和不进行计划内更新的文件系统(btrfs、ZFS)上永久关闭,但在传统文件系统(XFS、ext4)上则不能。在页面大小等于硬件保证的原子写块大小(即4 KB页面大小和保证原子写块写入4 KB块的企业驱动器,甚至在断电时)的系统上,它可以永久关闭。也就是说,正常设置需要始终启用此功能,否则在页面写入过程中,因为存在断电的风险,可能会出现页面撕裂,部分新页面和部分旧页面。

关闭实例重做日志

Oracle MYSQL 8.0.21或更新版本的用户可以使用single command 关闭 “redo log turn off”和“doublewrite buffer turn offs” :

alter instance disable innodb redo_log;

这将替换前面的两个配置更改:

  1. 重做日志不会首先写入,因此刷新日志设置毫无意义。
  2. 不会写入doublewrite缓冲区。

关闭Binlog

MySQL仍将写入binlog。特别是MySQL 8在默认情况下总是打开binlog。您可能希望在每个会话中关闭它:

set sql_log_bin = off;

这将在加载期间终止另一个磁盘写入源和潜在的磁盘同步。

“延迟生成二级索引”

mysqldump仍将生成一条语句,该语句尝试禁用二级索引生成:

alter table t disable keys;

此命令已被接受,但它仅在MyISAM中有效,2022年将不再使用MyISAM。你可以:

set autocommit = 0; set unique_checks = 0; set foreign_key_checks = 0;

向YOLO加载InnoDB表,但在MySQL中,非常大的事务可能有自己的挑战。因此,最好每加载 1000 行到 10000 行就提交一次。确保没有任何事务大于 1 GB,如果启用,它将中断压缩的binlog。使用组复制时,需要更严格地控制事务大小。

YOLO的含义

称为YOLO模式是有原因的。加载完成后撤消所有这些操作。然后检查它们是否已撤消。 最好在不重要的实例上执行此操作,因为您可以承受失败。这意味着,这应该是一个为数据加载而断开连接的副本,成功后可以用作克隆源,而一旦失败可以将其报废。