資料庫上線、環境遷移、Schema 演進是開發與 DBA 的高頻作業。本文彙整 mysqldump 邏輯備份、source 還原、ALTER TABLE 結構變更 (增欄位、改型別、加自增主鍵) 的標準指令與生產環境避坑要點,建議收藏備查。
mysqldump -u root -p --databases abc > /backup/abc_full_$(date +%F).sql
# 輸入密碼後生成:建庫語句 + 建表語句 + INSERT 資料
# 含資料
mysqldump -u root -p abc users > /backup/users_data.sql
# 僅結構 (無資料) - 適用 Schema 同步、Code Review
mysqldump -u root -p -d abc users > /backup/users_schema.sql
# 指定多庫
mysqldump -u root -p --databases db1 db2 > multi_db.sql
# 全例項 (含 mysql 系統庫、使用者權限)
mysqldump -u root -p --all-databases --single-transaction --master-data=2 > full_instance.sql
# 方式一:進入 mysql client 後執行 (適合交互式)
mysql -u root -p
USE abc;
SOURCE /backup/abc_full.sql;
# 方式二:管道直導 (適合自動化腳本,更快)
mysql -u root -p abc < /backup/abc_full.sql
# 方式三:壓縮檔案直接導入 (節省磁碟 IO)
gunzip < abc_full.sql.gz | mysql -u root -p abc
-- 末尾新增 NOT NULL 欄位,需給預設值
ALTER TABLE `orders`
ADD COLUMN `status` TINYINT NOT NULL DEFAULT 0 COMMENT '訂單狀態: 0待付款 1已付款 2已發貨';
-- 指定位置新增 (AFTER/FIRST)
ALTER TABLE `users`
ADD COLUMN `phone` VARCHAR(20) AFTER `email`;
-- MODIFY:僅改型別/屬性,欄位名不變
ALTER TABLE `products`
MODIFY COLUMN `price` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '單價(元)';
-- CHANGE:改名 + 改型別 (舊名 新名 新定義)
ALTER TABLE `users`
CHANGE COLUMN `nick_name` `nickname` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '暱稱';
-- 空表直接加
ALTER TABLE `logs`
ADD COLUMN `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
-- 非空表:必須先加可 NULL 欄位 → 回填值 → 改 NOT NULL + AUTO_INCREMENT
ALTER TABLE `old_table` ADD COLUMN `id` BIGINT UNSIGNED NULL FIRST;
UPDATE `old_table` SET `id` = 0; -- 或按業務邏輯賦值
ALTER TABLE `old_table` MODIFY COLUMN `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY;
ALTER TABLE `t1` DROP COLUMN `obsolete_col`;
ALTER TABLE `t1` DROP INDEX `idx_name`;
ALTER TABLE `t1` DROP FOREIGN KEY `fk_id`; -- 先查 SHOW CREATE TABLE 確認 FK 名稱
| 原則 | 執行動作 | 工具推薦 |
|---|---|---|
| 備份優先 | 變更前對目標表/庫執行 mysqldump 或 物理快照 (LVM/XtraBackup) | mysqldump, XtraBackup |
| 線上變更 (Online DDL) | MySQL 5.6+ 支援大多數 ALTER TABLE 原地演算法 (INPLACE),避免鎖表。大表**嚴禁**直接執行複製表演算法 (COPY) | ALTER TABLE ... ALGORITHM=INPLACE, LOCK=NONE; |
| 工具化執行 | 使用 gh-ost / pt-online-schema-change 進行無鎖、可暫停、可監控的大表變更 | gh-ost (GitHub), pt-osc (Percona Toolkit) |
| 驗證回滾 | 預備回滾腳本 (逆向 ALTER),驗證應用相容性後再釋放 | Git 管理 SQL 腳本 |
| 低峰期執行 | 避開業務高峰,監控 Threads_running, Innodb_row_lock_waits | Prometheus + Grafana |
CHARSET utf8mb4,導致存入 Emoji 報錯。建議表級/庫級預設 utf8mb4。NOT NULL 欄位無 DEFAULT,舊版 MySQL (5.6-) 嚴格模式下會報錯或塞入「零值」 (0, '', '0000-00-00')。INT 上限 21 億,高併發大表必用 BIGINT UNSIGNED (上限 1.8e19)。掌握這套指令體系與變更治理流程,資料庫 Schema 演進將從「高風險手術」變為「標準化交付」。