DRDS 新增字段报错 ERR 1062 - Duplicate entry

具体问题

上周四下午执行数据库新增字段的时候,中途提示主键冲突,然后执行中断。

1
2
ALTER TABLE 'is_base' ADD COLUMN 'cargo_name' varchar(200);
[Err] 1062 - Duplicate entry '1-8186300008005054-4400173320-29228291' for key 'IDX_IS_BASE'.

然后根据错误原因[ERR] 1062去GOOGLE一下,发现也有小伙伴遇到同样的问题RDS 在线DDL诡异报错ERROR 1062 (23000): Duplicate entry

MYSQL文档提示

Online DDL Limitations

When running an online DDL operation, the thread that runs the ALTER TABLE statement applies an online log of DML operations that were run concurrently on the same table from other connection threads. When the DML operations are applied, it is possible to encounter a duplicate key entry error (ERROR 1062 (23000): Duplicate entry), even if the duplicate entry is only temporary and would be reverted by a later entry in the online log. This is similar to the idea of a foreign key constraint check in InnoDB in which constraints must hold during a transaction.

运行联机DDL操作时,运行ALTER TABLE语句的线程应用从其他连接线程在同一表上并发运行的DML操作的联机日志。
应用DML操作时,可能会遇到重复的密钥输入错误(ERROR 1062(23000):重复条目),即使重复条目只是临时条目,也会被在线日志中的后续条目恢复。
这类似于InnoDB中的外键约束检查的想法,其中约束必须在事务期间保持。

大概就是在高并发操作下,有大量的Alter操作,引起了DDL Limitations,然后结果是执行被中断了。所以根据文档,这应该算是MYSQL的预期行为。


优化建议

一、官方建议:Online DDL Performance and Concurrency

Applications that access the table are more responsive because queries and DML operations on the table can proceed while the DDL operation is in progress. Reduced locking and waiting for MySQL server resources leads to greater scalability, even for operations that are not involved in the DDL operation.
(减少锁)

In-place operations avoid the disk I/O and CPU cycles associated with the table-copy method, which minimizes overall load on the database. Minimizing load helps maintain good performance and high throughput during the DDL operation.
(避免磁盘I/O和CPU处理)

二、rds官方技术支持

RDS for MySQL 如何使用 Percona Toolkit

注:

  • pt-online-schema-change 和 pt-archiver 工具均须指定 –no-version-check 选项方能搭配 RDS MySQL 实例使用。
  • 样例使用 Percona Toolkit 2.2.17 版本测试。
  • 样例仅做为样例使用,不承担任何因此示范导致的问题责任。具体操作手册请参考 Percona Toolkit 的相关文档。

从这两者来看,需要解决的工作量都不小,而且还有可能引起新的问题。


小结

一开始以为3千万条记录的表数据量不算大,新增或者修改表结构应该还行,有张表是300w条记录,新增字段耗时92秒,也没有报错。

然后执行另一张表(2千万条记录)时报了这个错误

总结一下,由于是线上数据库,在没有切流之前,还是会有很多并发操作,对于大表(大概可以定在超过500万条记录)进行表结构修改时,需要等用户少或者停机发布时进行处理,避免高并发操作引起Alter操作错误。

PS:DRDS表修改大概耗时

  • 300w数据 :92.210s
  • 2000w数据:394.331s

参考资料

  1. RDS 在线DDL诡异报错ERROR 1062 (23000): Duplicate entry
  2. Online DDL Limitations