随着业务规模的扩大和数据量的激增,数据库表结构变更已成为常态操作。传统DDL操作(如ALTER TABLE)需要长时间锁表,导致服务不可用,这对7x24小时业务系统是致命威胁。MySQL通过引入Online DDL技术,将DDL操作对业务的影响降到最低:
-- 检查当前未提交事务
SELECT * FROM information_schema.innodb_trx WHERE TIME > 60;
-- 查看表锁状态
SHOW OPEN TABLES WHERE In_use > 0;
-- 监控MDL锁(8.0+)
SELECT * FROM performance_schema.metadata_locks
WHERE OBJECT_NAME = 'your_table';
ALTER TABLE tbl_name
[ALGORITHM = {DEFAULT|INPLACE|COPY|INSTANT}]
[LOCK = {DEFAULT|NONE|SHARED|EXCLUSIVE}]
-- 具体DDL操作语句
-- MySQL 8.0.12+ 支持INSTANT算法
ALTER TABLE orders
ADD COLUMN discount DECIMAL(10,2) NOT NULL DEFAULT 0.00,
ALGORITHM=INSTANT;
-- 允许INPLACE的情况(如扩大VARCHAR长度)
ALTER TABLE users
MODIFY COLUMN email VARCHAR(255) NOT NULL,
ALGORITHM=INPLACE, LOCK=NONE;
-- 需要COPY算法的情况(如VARCHAR转TEXT)
ALTER TABLE logs
MODIFY COLUMN content TEXT,
ALGORITHM=COPY;
-- 创建索引(INPLACE)
ALTER TABLE products
ADD INDEX idx_price (price),
ALGORITHM=INPLACE, LOCK=NONE;
-- 删除索引(INSTANT)
ALTER TABLE orders
DROP INDEX idx_created_at,
ALGORITHM=INSTANT;
-- 查看DDL执行进度(5.7+)
SELECT * FROM information_schema.innodb_alter_table;
操作类型 | 5.6支持 | 5.7优化 | 8.0新特性 |
---|---|---|---|
ADD COLUMN | INPLACE | INPLACE | INSTANT(非重建) |
MODIFY COLUMN类型变更 | COPY | COPY | COPY(多数情况) |
ADD INDEX | INPLACE | INPLACE | INPLACE |
DROP INDEX | INPLACE | INPLACE | INSTANT |
# 预估需要空间(假设原表大小100GB)
INPLACE算法:需要额外100GB空间(临时文件)
COPY算法:需要200GB空间(全量复制)
-- 在从库执行验证
STOP SLAVE;
ALTER TABLE ... ALGORITHM=INPLACE;
START SLAVE;
SHOW SLAVE STATUS\G
# 分阶段执行(以添加索引为例)
pt-online-schema-change \
--alter "ADD INDEX idx_name (name)" \
D=test,t=large_table \
--execute
ALTER TABLE ... ALGORITHM=INPLACE, LOCK=NONE, PRIORITY=LOW;
SET GLOBAL innodb_online_alter_log_max_size=2147483648; -- 2GB
-- 实时监控锁等待
SELECT * FROM sys.schema_table_lock_waits;
-- 8.0原子DDL特性(自动回滚失败操作)
ALTER TABLE ... ALGORITHM=INSTANT;
# 强制终止长耗时DDL(需重启实例)
KILL [process_id];
功能点 | 5.6 | 5.7 | 8.0 |
---|---|---|---|
并发DML支持 | 基础支持 | 优化 | 全面优化 |
INSTANT算法 | 不支持 | 不支持 | 支持(有限操作) |
原子DDL | 不支持 | 不支持 | 支持 |
空间索引Online创建 | 不支持 | 不支持 | 支持 |
操作前72小时:
pt-upgrade
检查版本兼容性操作前1小时:
SELECT CONCAT('KILL ',trx_mysql_thread_id,';')
FROM information_schema.innodb_trx
WHERE TIME > 3600;
执行期间:
# 实时监控
watch -n1 "mysqladmin processlist | grep -E 'Alter|Copy'"
操作后验证:
CHECK TABLE tbl_name EXTENDED;
ANALYZE TABLE tbl_name;
通过严谨的技术方案设计和科学的操作流程控制,可使在线DDL操作成功率提升至99.9%以上。建议结合业务特点建立标准化的变更管理体系,确保数据库架构持续稳定演进。