在线字段修改表机构,遇到新问题。
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操作结束后的表被锁定在应用日志中的数据上需要很长时间。