| 操作 | 語法 | 示例 |
|---|---|---|
| 增加列 | ADD COLUMN col_def | ALTER TABLE t ADD weight INT; |
| 刪除列 | DROP COLUMN col | ALTER TABLE t DROP weight; |
| 修改列類型/屬性 | MODIFY COLUMN col_def | ALTER TABLE t MODIFY weight VARCHAR(30); |
| 修改列名+類型 | CHANGE COLUMN old_col col_def | ALTER TABLE t CHANGE weight wei VARCHAR(30); |
| 僅修改列名 | CHANGE COLUMN old_col new_col | ALTER TABLE t CHANGE weight wei; |
| 重命名表 | RENAME TO new_tbl | ALTER TABLE t RENAME TO animal; |
INSERT INTO new_tbl SELECT * FROM old_tbl 全量拷貝數據RENAME TABLE old_tbl TO tmp, new_tbl TO old_tbl特點:支持所有 ALTER 操作、需鎖表阻塞寫入、臨時佔用 2x 磁盤空間、耗時與數據量線性相關。
MySQL 5.6+ InnoDB 支持部分操作無需拷貝數據,僅修改元數據或局部重組:
| 操作類別 | 典型操作 | 鎖模式 | 支持版本 |
|---|---|---|---|
| 純元數據 | 重命名列/表、修改默認值、增刪 AUTO_INCREMENT、調整 ENUM 值 | MDL Exclusive (極短) | 5.6+ |
| 即時加列 | ADD COLUMN (末尾、無默認值、非主鍵) | MDL Shared | 8.0.12+ |
| 索引操作 | ADD/DROP INDEX、RENAME INDEX | MDL Shared (允許並發讀寫) | 5.6+ |
| 列類型變更 | 擴大 VARCHAR、INT→BIGINT | 視情況可能需重建 | 8.0+ |
指定算法:ALTER TABLE t ADD INDEX idx_name(name), ALGORITHM=INPLACE, LOCK=NONE;
-- 慢:觸發表重建 (MODIFY COLUMN) ALTER TABLE user MODIFY COLUMN pwd VARCHAR(20) NOT NULL DEFAULT '666666'; -- SHOW STATUS 顯示 Handler_write = 行數 -- 快:僅修改 .frm 元數據 (ALTER COLUMN) ALTER TABLE user ALTER COLUMN pwd SET DEFAULT '666666'; -- Handler_write = 0,毫秒級完成
原理:默認值存儲在 .frm 文件,ALTER COLUMN ... SET DEFAULT 僅更新元數據;MODIFY COLUMN 強制重建表以驗證現有數據符合新定義。
風險警告:直接操作 .frm 繞過 Server 層校驗,可能導致數據字典不一致、崩潰恢復失敗。僅建議在極端維護窗口、已全備、可接受風險時由專家操作。
-- 1. 備份數據目錄 -- 2. 創建目標結構臨時表 CREATE TABLE t_new LIKE t; ALTER TABLE t_new MODIFY col VARCHAR(30) DEFAULT 'new'; -- 3. 全局讀鎖刷盤 FLUSH TABLES WITH READ LOCK; -- 4. 系統層替換 .frm mv t_new.frm t.frm -- 5. 釋放鎖 UNLOCK TABLES; -- 6. 驗證 INSERT INTO t(col) VALUES(DEFAULT); SELECT * FROM t WHERE col='new'; -- 7. 清理 DROP TABLE t_new;
pt-online-schema-change (Percona Toolkit) 實現真正無鎖變更SHOW PROCESSLIST 觀察 copy to tmp table 狀態;SHOW ENGINE INNODB STATUS 看刷盤進度innodb_online_alter_log_max_size:控制行日志緩衝區大小innodb_sort_buffer_size:索引構建排序緩衝tmpdir:指向高性能存儲(NVMe/內存盤)CHANGE COLUMN 不指定類型會報錯,必須完整列定義DROP FOREIGN KEY 再 ALTER 再 ADD FOREIGN KEYADD COLUMN ... DEFAULT 'x' 會重建表,8.0 即時生效ALGORITHM=COPY 強制拷貝模式,可用於規避 Inplace Bug