MySQL 執行 ALTER TABLE ... ADD COLUMN 會鎖表(5.6+ InnoDB 支援 Online DDL 但仍有鎖定風險),大表操作可能導致:
-- 1. 建立新表複製結構(含索引)
CREATE TABLE new_table LIKE old_table;
-- 2. 新表新增欄位
ALTER TABLE new_table ADD COLUMN new_col VARCHAR(255) DEFAULT '' COMMENT '新欄位' AFTER id;
-- 3. 複製資料(可分批次)
INSERT INTO new_table (col1, col2, ...) SELECT col1, col2, ... FROM old_table;
-- 4. 增量同步(若有建立時間欄位)
-- 記錄開始複製時間點 T1
INSERT INTO new_table (col1, col2, ...)
SELECT col1, col2, ... FROM old_table WHERE create_time > 'T1';
-- 5. 低峰期切換
RENAME TABLE old_table TO old_table_bak, new_table TO old_table;
風險:切換瞬間極少量新寫入可能丟失,極高一致性要求建議停機窗口操作。
ALTER TABLE 加欄位前提:主從架構健全、切換工具成熟(MHA、Orchestrator)。
# pt-osc 範例
pt-online-schema-change --alter "ADD COLUMN new_col VARCHAR(255)" \
D=db,t=old_table --execute --max-load Threads_running=50 --critical-load Threads_running=100
| 資料量 | 建議策略 |
|---|---|
| < 10 萬行 | 直接 ALTER TABLE 通常秒級完成 |
| 10 萬 - 1000 萬 | 影子表法或 pt-osc,低峰期操作 |
| > 1000 萬 | gh-ost 或主從切換,嚴格監控 |
| 極高一致性要求 | 停機維護窗口 |
mysqldump 或快照)Threads_running、主從延遲、磁碟 I/O