將查詢結果導出為表格文件是數據分析、報表分發、數據遷移的高頻需求。本文對比命令行導出、SELECT ... INTO OUTFILE、客戶端工具三大方案,並詳細講解 macOS/Linux/Windows 下的權限陷阱與解決方案。
# 基本語法 mysql -h-u -p -D -e " " > /path/to/output.xls # 實例:導出全表為 Tab 分隔文本 (Excel 可直接打開) mysql -h127.0.0.1 -uroot -p123 -Dtest -e "SELECT * FROM edu_iclass_areas" > /Users/zhengcanrui/WORK/test/test.xls # 參數說明 # -h: 主機 # -u: 用戶 # -p: 密碼 (緊跟 -p 無空格,或交互式輸入) # -D: 數據庫 # -e: 直接執行 SQL # > : Shell 重定向輸出
優點:無需 MySQL 服務器文件寫入權限,客戶端本地即可生成文件。
缺點:大數據量輸出慢,無法直接生成標準 CSV (需後處理)。
-- 登入 MySQL 後執行 SELECT * FROM edu_iclass_areas INTO OUTFILE '/tmp/export.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';
前置條件:
secure_file_priv 允許)。FILE 權限:GRANT FILE ON *.* TO 'user'@'host';查看 secure_file_priv 限制:
SHOW VARIABLES LIKE 'secure_file_priv'; -- NULL: 禁用導出 -- /var/lib/mysql-files/: 僅允許此目錄 -- 空值: 無限制 (不安全,生產慎用)
export PATH=$PATH:/usr/local/mysql/binmysql -uroot -p| 報錯 | 原因 | 解決 |
|---|---|---|
| Access denied for user 'x'@'host' (using password: YES) | 用戶無此主機連接權限 | GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'pass' WITH GRANT OPTION; FLUSH PRIVILEGES; |
| The MySQL server is running with the --secure-file-priv option so it cannot execute this statement | secure_file_priv 限制導出目錄 | 1. 將文件寫入指定目錄 2. 修改 my.cnf secure_file_priv="" 重啟 (需權限) 3. 改用方案一命令行導出 |
| Permission denied (Errcode: 13) | 操作系統層面目錄無寫入權限 | chown mysql:mysql /target/dir; chmod 750 /target/dir |
| Can't create/write to file (Errcode: 2) | 目錄不存在 | mkdir -p /target/dir |
SELECT ... LIMIT 100000 OFFSET 0 INTO OUTFILE ... 循環導出,避免單文件過大。mysql ... | gzip > dump.sql.gz 或導出後 gzip export.csv。mysqldump -h -P3306 -u... -p... db table | gzip > local_dump.sql.gz SELECT COUNT(*),抽樣對比關鍵欄位。命令行重定向 (方案一) 是通用性最強、權限要求最低的方案,建議作為首選;INTO OUTFILE 適合服務端有權限且追求極致性能的場景。