首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

mysqldump -w 參數實戰:按條件導出子集數據的引號陷阱與最佳實踐

     編輯:MySQL 綜合教學

前言

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 —— 條件字串必須加引號。

實戰演示

1. 單一數值條件

mysqldump --single-transaction -w 'id < 10000' mydb mytable > dump.sql

生成的 SQL 含 WHERE id < 10000,無歧義。

2. 含字符串/函數的複合條件 —— 引號陷阱現場

# ❌ 錯誤:單引號包裹整體,內部單引號未轉義
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)  完全錯誤!

3. 正確姿勢:外層雙引號,內層單引號

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')

Shell 引號傳遞速查表

場景命令寫法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,注意目標表結構需兼容。

避坑總結

  1. 永遠記住 外層雙引號、內層單引號 的 Shell 傳遞慣例。
  2. 複雜條件先寫腳本文件,再 mysqldump -w "$(cat where.txt)" 避免轉義地獄。
  3. 導出前先用 SELECT COUNT(*) ... WHERE ... 核對行數,防止條件寫錯導出空文件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved