You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用secure_file_priv指定目录仍触发MySQL 1290错误的求助

MySQL INTO OUTFILE 触发secure_file_priv错误的原因及解决办法

问题描述

尝试执行以下动态SQL语句,通过拼接@@global.secure_file_priv与文件名导出my_table数据为CSV文件:

SET @tt = CONCAT(
    "SELECT * FROM my_table INTO OUTFILE '", 
    CONCAT(@@global.secure_file_priv, 'my_table.csv'), 
    "' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n'"
);

PREPARE stmt FROM @tt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

触发错误:
Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

疑问:明明使用了secure_file_priv指定的文件夹,为何报错?

问题原因

核心问题出在路径拼接的不严谨:

  • @@global.secure_file_priv返回的路径末尾可能带有目录分隔符(Linux/macOS为/,Windows为\),也可能不带。如果变量本身已有分隔符,直接拼接文件名会生成//my_table.csv或\\my_table.csv这类无效路径,MySQL会判定该路径不在允许的目录范围内。
  • 若secure_file_priv的路径包含特殊字符(如空格),直接拼接会导致SQL字符串解析异常,间接触发权限校验失败。

解决办法

先统一处理路径格式,确保末尾带有正确的目录分隔符,再拼接文件名:

-- 预处理路径,保证末尾存在目录分隔符
SET @file_path = CONCAT(
    -- 判断路径末尾是否已有分隔符,没有则补充
    IF(RIGHT(@@global.secure_file_priv, 1) IN ('/', '\\'), 
       @@global.secure_file_priv, 
       CONCAT(@@global.secure_file_priv, '/')),
    'my_table.csv'
);

-- 拼接最终SQL语句
SET @tt = CONCAT(
    "SELECT * FROM my_table INTO OUTFILE '", 
    @file_path, 
    "' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n'"
);

PREPARE stmt FROM @tt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

额外验证步骤

  1. 执行SELECT @@global.secure_file_priv;,确认返回的路径格式,检查末尾是否有目录分隔符。
  2. 确保MySQL进程对secure_file_priv指定的目录拥有写入权限,避免因文件系统权限不足引发同类报错。

内容的提问来源于stack exchange,提问作者John John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:23:19