随着敏捷方法的广泛应用,表结构的更改变得尤为重要。项目不断演进,需求也在变化——随着时间的推移,必然需要添加/更改/删除列。在生产数据库中,这些更改尤其风险很高。
结构修改可能导致:
对于大型表(数百万行),尤其复杂,这些表被其他服务频繁使用。
通过ALTER TABLE进行合理的分阶段操作、创建数据副本、在测试环境中测试、限制停机时间。使用事务、阶段性迁移和在大规模更改前进行备份。在高负荷的数据库管理系统中,通常使用“在线”ALTER算法。
示例代码:
-- 添加带默认值的新列 ALTER TABLE orders ADD COLUMN status VARCHAR(20) DEFAULT 'new'; -- 逐步填充新列 UPDATE orders SET status = CASE WHEN shipped_at IS NOT NULL THEN 'shipped' ELSE 'pending' END;
关键特性:
ALTER TABLE是原子性操作吗?
通常不是:修改表可能需要很长时间。如果出现故障,部分更改可能会回滚,但部分更改会保留。因此,DDL命令的事务保护只是某些数据库(例如PostgreSQL)实现的。
可以无痛地将列类型从INTEGER更改为VARCHAR吗?
并不总是可以:如果列中有不符合新格式的旧数据或相关对象(索引、触发器、键),数据库可能不允许更改类型,或数据会被损坏。
ALTER TABLE总是对整个表施加排他锁吗?
这取决于数据库管理系统:在MySQL和旧版本的SQL Server中,任何ALTER操作通常会完全锁定表,直到完成,但现代数据库管理系统支持“在线DDL”,以减少锁定时间。
DevOps工程师通过ALTER TABLE对三个重要表进行了批量更改并删除了旧列。没有考虑到这些列链接了外键和触发器。在执行ALTER期间,数据库占用20分钟——在此期间,由于缺少所需的字段,服务“宕机”。
优点:
缺点:
分析师计划分阶段添加列:首先创建带默认值的列,在副本上进行测试负载,然后才在夜间进行实际的ALTER,并通知所有开发者即将进行的迁移窗口。
优点:
缺点: