使用 mysqlimport 導入數據時遇到 Error 13: Can't get stat of '/usr/local/mysql/data/backup/chen.sql' (Errcode: 2),明明文件存在且權限正常。根因在於 mysqlimport 預設在服務端尋找文件,需加 --local 指定從客戶端讀取。
root@zhou:/usr/local/mysql# mysqlimport -uroot -p123 -h127.0.0.1 -P3306 test backup/chen.sql
mysqlimport: Error: 13, Can't get stat of '/usr/local/mysql/data/backup/chen.sql' (Errcode: 2), when using table: chen
檢查權限無誤:
root@zhou:/usr/local/mysql# perror 13
OS error code 13: Permission denied
root@zhou:/usr/local/mysql# ll backup/
drwxr-xr-x 2 mysql mysql 4096 Jan 10 17:30 backup/
同機器用 LOAD DATA INFILE 卻成功:
mysql> LOAD DATA INFILE '/usr/local/mysql/backup/chen.sql' INTO TABLE chen;
Query OK, 6 rows affected
| 命令 | 默認讀取端 | 路徑解析位置 | 需權限 |
|---|---|---|---|
| mysqlimport (無 --local) | 服務端 | 服務端數據目錄下 | MySQL 進程讀權限 |
| mysqlimport --local | 客戶端 | 客戶端本地路徑 | 客戶端用戶讀權限 |
| LOAD DATA INFILE | 服務端 | 服務端數據目錄下 | MySQL 進程讀權限 + secure_file_priv |
| LOAD DATA LOCAL INFILE | 客戶端 | 客戶端本地路徑 | 客戶端用戶讀權限 + local_infile=1 |
root@zhou:/usr/local/mysql# mysqlimport -uroot -p123 -h127.0.0.1 -P3306 test backup/chen.sql --local
test.chen: Records: 6 Deleted: 0 Skipped: 0 Warnings: 0
即時成功,導入 6 條記錄。
secure_file_priv:限制 LOAD DATA INFILE / SELECT ... INTO OUTFILE 的服務端讀寫目錄。SHOW VARIABLES LIKE 'secure_file_priv'; 若為 NULL 則禁用,若為 /var/lib/mysql-files/ 則限定該目錄。local_infile:控制是否允許 LOAD DATA LOCAL INFILE / mysqlimport --local。SET GLOBAL local_infile=1; 或啟動參數 --local-infile=1。mysql --local-infile=1。--local——文件在客戶端,不在服務端。LOAD DATA LOCAL INFILE——支援並行、緩衝、錯誤處理更靈活。local_infile——評估安全風險,用畢即關。mysqlimport 返回碼——非 0 即失敗,便於自動化巡檢。一個 --local 參數,揭示了客戶端/服務端架構下文件操作的本質差異。