能避免,但需满足条件:MySQL 5.6+末尾加列默认INPLACE、仅持MDL锁,理论上不阻塞DML;但长事务、非末尾加列(8.0.12前)、TEXT/BLOB列或隐式降级仍会导致卡住。
能避免,但得看操作类型、MySQL版本、表大小和当前负载——不是加个 ALGORITHM=INPLACE 就万事大吉。
MySQL 5.6+ 对末尾加列默认走 INPLACE,只持 MDL 锁(元数据锁),理论上不阻塞 DML。但实际中仍可能卡住,原因常是:
SHOW PROCESSLIST 看不到它,但 SELECT * FROM information_schema.INNODB_TRX 能查到LOCK TABLES users WRITE 没释放TEXT 或 BLOB 列,或加在非末尾位置(MySQL 8.0.12+ 才支持非末尾 INSTANT)LOCK=NONE 被忽略:MySQL 判定无法满足无锁条件时,会静默降级为 LOCK=SHARED 或更重的锁,不会报错当你要 MODIFY COLUMN、改字段长度、调整 ENUM 值列表、或 MySQL 版本 COPY 模式 → 全表重建 → 长时间写锁。这时 pt-online-schema-change 是更可控的选择,但它不是银弹:
--dry-run,重点看它生成的 RENAME TABLE 语句是否跨库、是否涉及视图或外键依赖能,但仅限于特定场景:
AFTER last_column),且类型不能是 TEXT/BLOB/JSON
COPY 算法做过 DDL(否则内部 flag 被置位,后续 INSTANT 失效)验证是否生效:执行后查 information_schema.COLUMNS,新列 ORDINAL_POSITION 应等于原列数 + 1,且 ALTER TABLE 返回耗时通常
DDL 卡住,别先急着 KILL —— 很可能杀的是无辜的等待者,真正持锁的事务还在运行:
SELECT * FROM performance_schema.metadata_locks WHERE OBJECT_SCHEMA = 'db' AND OBJECT_NAME = 'tbl';
SELECT * FROM performance_schema.threads t JOIN performance_schema.events_statements_current e USING (THREAD_ID) WHERE e.SQL_TEXT LIKE '%ALTER%';
SELECT * FROM information_schema.INNODB_TRX WHERE TIME_TO_SEC(NOW()) - TIME_TO_SEC(TRX_STARTED) > 60;
TRX_STATE = 'RUNNING' 且 TRX_QUERY 是普通 SELECT 的事务,而不是那个 ALTER 进程本身(它可能正等锁)最易被忽略的一点:MDL 锁不体现在 SHOW OPEN TABLES WHERE In_use > 0 里,这个命令只反映表缓存状态,跟元数据锁无关。
Tplink企业版路由器WiFi名称的默认设置介绍(Tplink企业版路由器WiFi名称的默认设置是什么)
Tplink路由器灯常亮无法上网的原因分析(如何解决Tplink路由器灯常亮无法上网的问题)
Tplink千兆企业级路由器自动重启的作用和优势介绍(如何设置Tplink千兆企业级路由器自动重启功能)
一根天线的tplink路由器有哪些(一根天线的Tplink路由器的特点和优势介绍)
tplink路由器外网访问不了nas(Tplink路由器外网访问NAS的原因分析)
Tplink无法搜到路由器的原因分析(如何解决Tplink无法搜到路由器的问题)