当使用 SELECT ... INTO OUTFILELOAD DATA INFILE 语句时,如果遇到错误 1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement,这是因为 MySQL 服务器启用了 --secure-file-priv 选项。这个选项限制了数据导入和导出操作只能在指定的目录中进行,以增强安全性。

解决方法

方法一:使用指定目录
  1. 查找指定目录
    首先,你需要找到 --secure-file-priv 指定的目录。可以通过以下查询获取该目录:
SHOW VARIABLES LIKE 'secure_file_priv';

输出可能类似于:

+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
  1. 将文件放置在指定目录
    将你要导入或导出的文件放置在上述查询返回的目录中。
  2. 修改 SQL 语句
    修改你的 SQL 语句,使其指向正确的目录。
    导出数据示例
SELECT order_id, customer_name, order_date, total_amount
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM orders;

导入数据示例

LOAD DATA INFILE '/var/lib/mysql-files/orders.csv'
INTO TABLE orders
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
方法二:禁用 --secure-file-priv 选项

如果你确实需要在其他目录中进行数据导入和导出操作,可以禁用 --secure-file-priv 选项。但请注意,这样做会降低安全性。

  1. 编辑 MySQL 配置文件
    打开 MySQL 的配置文件 my.cnfmy.ini,通常位于 /etc/my.cnf/etc/mysql/my.cnf
  2. 注释或删除 secure-file-priv 选项
    找到 secure-file-priv 选项并注释掉或删除它。
# [mysqld]
# secure-file-priv = /var/lib/mysql-files/
  1. 重启 MySQL 服务
    保存配置文件并重启 MySQL 服务以使更改生效。
sudo systemctl restart mysql

示例

假设你已经找到了 --secure-file-priv 指定的目录 /var/lib/mysql-files/,以下是具体的示例:

导出数据
  1. 将文件路径修改为指定目录
SELECT order_id, customer_name, order_date, total_amount
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM orders;
  1. 确保文件权限
    确保 MySQL 服务器有权限写入该目录。你可以使用以下命令更改目录权限:
sudo chown mysql:mysql /var/lib/mysql-files/
sudo chmod 755 /var/lib/mysql-files/
导入数据
  1. 将文件放置在指定目录
    orders.csv 文件复制到 /var/lib/mysql-files/ 目录中:
sudo cp /path/to/orders.csv /var/lib/mysql-files/
  1. 确保文件权限
    确保 MySQL 服务器有权限读取该文件。你可以使用以下命令更改文件权限:
sudo chown mysql:mysql /var/lib/mysql-files/orders.csv
sudo chmod 644 /var/lib/mysql-files/orders.csv
  1. 执行导入操作
LOAD DATA INFILE '/var/lib/mysql-files/orders.csv'
INTO TABLE orders
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;