在使用 mysqlimport 導入數據時,經常會遇到 Error 13: Can't get stat of 錯誤,提示權限被拒。這篇文章詳細記錄了問題排查過程與解決方案,幫助你快速定位並修復此錯誤。
執行以下命令導入備份文件時拋出錯誤:
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
乍看之下像是權限問題,使用 perror 13 確認是 OS error code 13: Permission denied。但檢查目錄權限發現 backup/ 目錄屬於 mysql:mysql,權限為 drwxr-xr-x,理應可讀寫。
LOAD DATA INFILE為了驗證是否真為權限問題,嘗試直接在 MySQL 客戶端執行 LOAD DATA INFILE:
LOAD DATA INFILE '/usr/local/mysql/backup/chen.sql' INTO TABLE chen;
Query OK, 6 rows affected (0.07 sec)
結果成功導入,說明文件本身可讀、權限無誤,問題出在 mysqlimport 的運行機制上。
--local 參數缺失查閱 man mysqlimport 發現關鍵說明:
--local:指定從客戶端主機讀取數據文件;若省略,則預設從服務端主機讀取(即去
datadir下尋找)。
原命令未加 --local,導致服務端嘗試讀取 /usr/local/mysql/data/backup/chen.sql(實際不存在),故報錯。
在命令末尾加上 --local 即可:
mysqlimport -uroot -p123 -h127.0.0.1 -P3306 test backup/chen.sql --local
test.chen: Records: 6 Deleted: 0 Skipped: 0 Warnings: 0
導入成功,問題徹底解決。
mysqlimport 預設在服務端尋找文件,需加 --local 才從客戶端讀取。Error 13 先別急著改權限,先確認文件路徑與 --local 參數是否匹配。LOAD DATA INFILE 默認即從客戶端讀取(除非加 LOCAL 關鍵字),行為與 mysqlimport 相反,易混淆。掌握這一點,以後遇到類似「找不到文件」或「權限被拒」報錯,優先檢查 --local 參數,能省去大量排查時間。