刪除操作不可逆,風險最高。本文系統對比三大刪除命令機制、效能、觸發器行為、Binlog 記錄差異,提供大表安全清空、分區歸檔、誤刪恢複標準流程。
| 特性 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 類型 | DML (數據操作) | DDL (定義操作) | DDL |
| 可回滾 (事務) | 是 | 否 (隱式提交) | 否 |
| WHERE 條件 | 支援 | 不支援 (全表) | 不適用 |
| 觸發器 | 觸發 BEFORE/AFTER DELETE | 不觸發 | 不觸發 |
| 自增值 | 保留 (不重置) | 重置為 1 | 表結構消失 |
| Binlog 記錄 | 行級 (ROW) / 語句級 (STATEMENT) | 語句級 (DDL) | 語句級 (DDL) |
| 鎖機制 | 行鎖 (InnoDB) | 表級元數據鎖 (MDL) + 排他鎖 | MDL 排他鎖 |
| 執行速度 | 慢 (逐行標記刪除、寫 Undo/Redo) | 極快 (釋放數據頁、重建表) | 極快 |
| 空間回收 | 不立即回收 (需 OPTIMIZE/重建) | 立即釋放磁盤空間 | 立即釋放 |
| 外鍵約束 | 檢查 (RESTRICT/CASCADE) | 若有外鍵引用則報錯失敗 | 若有外鍵引用則報錯失敗 |
-- 1. 條件刪除 (必帶 WHERE)
DELETE FROM `emp` WHERE `emp_id` = '100001';
-- 2. 連表刪除 (多表 DELETE)
DELETE e FROM `emp` e
JOIN `dept` d ON e.`dept_id` = d.`id`
WHERE d.`name` = 'Obsolete';
-- 3. LIMIT 限制刪除行數 (防誤刪擴散、分批刪除)
DELETE FROM `emp` WHERE `emp_sal` < 300000 LIMIT 500;
-- 4. 快速清空大表但保留表結構/自增值 (技巧)
DELETE FROM `emp` WHERE 1; -- 逐行刪除,極慢,不推薦大表
-- 推薦:TRUNCATE (若無外鍵) 或 重建表
RANGE PARTITION,ALTER TABLE ... DROP PARTITION p_202301; 秒級完成,無鎖、無 Binlog 膨脹、空間立即釋放。
CREATE TABLE `emp_new` LIKE `emp`; -- 複製結構、索引
INSERT INTO `emp_new` SELECT * FROM `emp` WHERE `created_at` > '2024-01-01'; -- 保留近期數據
RENAME TABLE `emp` TO `emp_old`, `emp_new` TO `emp`; -- 原子切換 (MDL 鎖極短)
DROP TABLE `emp_old`; -- 異步釋放空間
pt-archiver --source h=localhost,D=db,t=emp --purge \
--where "created_at < '2024-01-01'" \
--limit 1000 --commit-each --statistics \
--dest h=localhost,D=archive_db,t=emp_archive
# 邊刪邊歸檔到歸檔庫,可控速度、可恢複
ROLLBACK; -- 立即回滾,最簡單
ROW (含前後映像)。mysqlbinlog --start-datetime="2024-01-15 10:00:00" --stop-datetime="2024-01-15 10:05:00" /var/lib/mysql/mysql-bin.000001 | grep -A 20 "DELETE FROM"。mysqlbinlog --flashback --start-datetime=... --stop-datetime=... binlog_file > flashback.sql (MySQL 8.0+ 支援 --flashback)。flashback.sql (將 DELETE 轉為 INSERT,UPDATE 前後值互換) → 執行恢複。MASTER_DELAY=3600 (1 小時) 的 Slave,誤操作後停止同步,從 Slave 導出誤刪表數據導入 Master。.ibd 文件備份,DISCARD TABLESPACE → 複製 .ibd → IMPORT TABLESPACE (需 cfg 文件匹配)。CHANGE MASTER TO MASTER_DELAY=3600; 最後防線。alias mysql='mysql --safe-updates' (啟用 SQL_SAFE_UPDATES),alias rm='rm -i'。結語:DELETE 可控、TRUNCATE 快但不可逆、DROP 毀滅性。大表清空用分區/影子表/pt-archiver。誤刪恢複靠 Binlog 閃回 (DML) 或 PITR/延遲從庫 (DDL)。權限最小化、審核平台、延遲從庫、備份驗證 四位一體構建誤刪免疫體系。