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;
这将替换前面的两个配置更改:
- 重做日志不会首先写入,因此刷新日志设置毫无意义。
- 不会写入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模式是有原因的。加载完成后撤消所有这些操作。然后检查它们是否已撤消。 最好在不重要的实例上执行此操作,因为您可以承受失败。这意味着,这应该是一个为数据加载而断开连接的副本,成功后可以用作克隆源,而一旦失败可以将其报废。