mysql alter 风险_MySQLAlter Table注意事项

本文探讨了在MySQL中执行ALTER TABLE和FLUSH TABLE可能导致的间接等待问题,以及ALTER TABLE过程中遇到的主键重复错误。介绍了在业务高峰期执行DDL操作的注意事项,提出了解决错误的方法,包括在低峰期执行和使用阻塞方式。此外,还讨论了修改表名的两种语法及其原子性特点。
摘要由CSDN通过智能技术生成

========================================================================

ALTER TABLE 和FLUSH TABLE导致的间接等待

场景:

1、会话A执行耗时较长的操作;

2、会话B执行ALTER TABLE 或FLUSH TABLES等操作时,会向其他会话(线程)发送表变更通知,要求其他会话关闭再重新打开相关表;

3、会话A执行过程中收到会话B的变更通知,在会话A执行结束前,会话A阻塞会话B执行;

4、会话C收到会话B的变更通知,等待会话B完成,形成等待链:会话C>>会话B>>会话A

5、会话B因为其他原因执行失败或被关闭,ALTER TABLE或FLSUH TABLE等操作被取消

6、会话C转为等待会话A执行完成。

官方文档:

The thread got a notification that the underlying structure for a table has changed and it needs to reopen the table to get the new structure. However, to reopen the table, it must wait until all other threads have closed the table in question.

This notification takes place if another thread has used FLUSH TABLES or one of the following statements on the table in question: FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, orOPTIMIZE TABLE.

========================================================================

ALTER TABLE过程报主键重复

在MySQL 5.6版本中引入Online DDL特性,很多ALTER TABLE操作可以联机修改,该特性使用ROW LOG来保存ALTER操作期间发生的数据变化,并回放到新表中,保证数据一致性。

如果在业务高峰期执行Online DDL操作,可能报下面错误:

ERROR 1062 (23000) at line 13: Duplicate entry 'xxx' for key 'PRIMARY'

解决办法:

1、将DDL操作移到业务低峰期执行,降低错误出现概率

2、如果业务允许阻塞,修改ALTER TABLE语句使用阻塞方式执行

如ALTER命令为:

ALTER TABLE TB001 ADD C2 INT;

修改为:

ALTER TABLE TB001 ADD C2 INT, ALGORITHM =COPY;

========================================================================

修改表名

修改表名有两种语法:

RENAME TABLE old_table TO new_table;

ALTER TABLE old_table RENAME new_table;

使用RENAME TABLE方式可以一次修改多个表的表名,MySQL保证RENAME操作的原子性。

When you execute RENAME TABLE, you cannot have any locked tables or active transactions. With that condition satisfied, the rename operation is done atomically; no other session can access any of the tables while the rename is in progress.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值