当前位置: 首页 > 图灵资讯 > 技术篇> ERROR 1799 (HY000): Creating index 'PRIMARY' innodb_online_alter_log_max_size

ERROR 1799 (HY000): Creating index 'PRIMARY' innodb_online_alter_log_max_size

来源:图灵教育
时间:2023-06-07 09:38:17

在线字段修改表机构,遇到新问题。

mysql> alter table productinfo.pd_info add is_batch tinyint(1) unsigned not null default 1,add index idx_is_batch (is_batch);

ERROR 1799 (HY000): Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.

错误报告分析:该表是在线核心表,每秒至少有4个数据插入。因此,在修改表结构时,默认innodb_online_alter_log_max_size=128M 远远不够。

此外,该表的数量约为25G,因此要成功修改,必须增加该值,但该值不易过大。需要调试到合适的值。

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

set global innodb_online_alter_log_max_size=268435456;mysql> alter table productinfo.pd_info add is_batch tinyint(1) unsigned not null default 1,add index idx_is_batch (is_batch); ^[[AQuery OK, 0 rows affected (3 hours 32 min 2.33 sec) Records: 0  Duplicates: 0  Warnings: 0

修改成功。

总结如下:

innnodb_根据错误信息中的内容在MySQL手册中找到online_alter_log_max_size这个参数。该参数为MySQL5.6..6新增加的参数用于指定InnoDB表在线DDL操作中使用的临时日志文件的最大尺寸(默认为128M)。临时文件将用于创建索引或ALTER表。该文件记录了DDL操作过程中插入、更新和删除的数据。必要时,日志文件的大小将基于innodb_sort_buffer_size的值增加容量,直到达到innodb_online_alter_log_max_size指定的最大值。如果临时表的大小超过此上限,ALTER表的操作将失败,所有未提交的DML操作将回滚。因此,一个较大的值允许更多的DML在在在线DDL操作过程中执行,但过大的值会使DDL操作结束后的表被锁定在应用日志中的数据上需要很长时间。