天天看點

Mysql 儲存csv檔案遇到的問題

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教程™