mysqldump --where / -w 允許按 WHERE 條件導出表的部分數據,極適合「歷史數據歸檔、測試環境抽樣、異構遷移驗證」等場景。但 單雙引號嵌套 是最大坑,本文通過實測演示正確姿勢。
mysqldump [連接參數] -w "WHERE 條件" db_name tbl_name > dump.sql
# 等價
mysqldump [連接參數] --where="WHERE 條件" db_name tbl_name > dump.sql
官方提示:Quotes are mandatory —— 條件字串必須加引號。
mysqldump --single-transaction -w 'id < 10000' mydb mytable > dump.sql
生成的 SQL 含 WHERE id < 10000,無歧義。
# ❌ 錯誤:單引號包裹整體,內部單引號未轉義
mysqldump --single-transaction -w 'id < 10000 AND logintime < unix_timestamp('2014-06-01')' mydb mytable > dump.sql
# 實際解析為:
WHERE id < 10000 AND logintime < unix_timestamp(2014-06-01)
# unix_timestamp(2014-06-01) → unix_timestamp(2007) 完全錯誤!
mysqldump --single-transaction -w "id < 10000 AND logintime < unix_timestamp('2014-06-01')" mydb mytable > dump.sql
Shell 先處理外層雙引號,內部單引號原樣傳給 MySQL,最終 WHERE 條件完整保留:
WHERE id < 10000 AND logintime < unix_timestamp('2014-06-01')
| 場景 | 命令寫法 | MySQL 實際收到 |
|---|---|---|
| 純數值/無引號條件 | -w 'id > 100' | id > 100 |
| 含單引號字符串 | -w "name = 'abc'" | name = 'abc' |
| 含雙引號字符串 | -w 'name = "abc"' | name = "abc" |
| 混合單雙引號 | -w "col = 'a\"b'" | col = 'a"b' |
mysqldump -w "id<100" db t1 t2 > dump.sql(同一條件應用於所有表)。--single-transaction:InnoDB 熱備份不加鎖,導出數據一致性視圖。mysql db < dump.sql 或 source dump.sql,注意目標表結構需兼容。mysqldump -w "$(cat where.txt)" 避免轉義地獄。SELECT COUNT(*) ... WHERE ... 核對行數,防止條件寫錯導出空文件。