LOAD DATA INFILE '/home/xx/xxx.csv'
當我使用 上面的 SQL 語句将 csv 檔案 導入 mysql 時候,出錯:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
檢視官方文檔,secure_file_priv參數用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()傳到哪個指定目錄。
- secure_file_priv 為 NULL 時,表示限制mysqld不允許導入或導出。
- secure_file_priv 為 /tmp 時,表示限制mysqld隻能在/tmp目錄中執行導入導出,其他目錄不能執行。
- secure_file_priv 沒有值時,表示不限制mysqld在任意目錄的導入導出。
檢視secure-file-priv參數的值:
mysql> show global variables like '%secure_file_priv%';
輸出的 secure_file_priv /var/lib/mysql-files/
說明檔案隻能在該位置導入/導出。可以将檔案放在該位置,也可以指定自己的 secure_file_priv 位置。
假設修改為 /home/xx
sudo vim /etc/mysql/my.cnf 添加為:
[mysqld]
secure_file_priv='/home/xx'
再次檢視:
mysql> show global variables like '%secure_file_priv%';
輸出的 secure_file_priv' /home/xx'
重新開機mysql
service mysql restart
報錯:
ERROR 29 (HY000) at line 16: File '/home/xx/xxx.csv' not found (OS errno 13 - Permission denied)
sudo vim /etc/apparmor.d/usr.sbin.mysqld } 前面 加入 /home/xx/** rw,
sudo /etc/init.d/apparmor reload
sudo mysql -u root -p < xx.sql # 成功
在下面的語句中 `order` `height(cm)` 列名稱使用的是反引号,避免沖突,這裡 order 是關鍵字 而() 也會有問題,是以加 反問号。 反問号在 數字鍵 左邊。
CREATE TABLE president_heights (
`order` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL,
`height(cm)` INT NOT NULL,
PRIMARY KEY (`order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
關閉mysql: service mysql stop
參考:将CSV檔案導入MySQL表 -MySQL教程™