【问题标题】:Can't create/write to a file in MySQL无法在 MySQL 中创建/写入文件
【发布时间】:2026-02-05 23:40:01
【问题描述】:

我创建了一个存储过程,它从表中创建一个 CSV 文件。

这是存储过程:

CREATE DEFINER =  `root`@`localhost` PROCEDURE  `DO_BACKUP` ( IN  `table_name` TEXT )
 NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER 
BEGIN 
SET @sql = CONCAT(  'SELECT * FROM ', table_name,  ' INTO OUTFILE \'/home/aimad/GestionStock/', DATE_FORMAT( CURDATE( ) ,  '%Y%m%d' ) ,  '_', table_name, '.csv\'' ) ;
    
    PREPARE stmt FROM @sql ;
    
    EXECUTE stmt;
    
    DEALLOCATE PREPARE stmt;

END

但是当我通过它的参数中的 table_name 调用这个存储过程时,我得到了这个错误:

无法创建/写入文件 '/home/aimad/GestionStock/20130615_BonInterne.csv'(错误代码:13)

编辑:

我使用的操作系统是 Linux Xubuntu 13.04

【问题讨论】:

  • 用你正在使用的操作系统更新问题
  • @DavidJashi 完成了 :)

标签: mysql into-outfile


【解决方案1】:

如果您启用了 SELinux,mysql 将不会写入目录,除非它具有正确的上下文。首先在命令提示符下键入getenforce。如果它返回“Enforcing”,则 SELinux 已启用,您必须将特定的 SELinux 上下文应用到您尝试读取/写入的目录。这是对拥有正确权限的补充。导航到目录并输入ls -Z,您将看到 SELinux 上下文。查看 object_r 上下文。如果不是 mysqld_db_t,那么无论权限如何,您的进程都将无法读取/写入目录。

确保已安装“semanage”命令,以便您可以设置上下文。要查看 mysql 的 SELinux 文件上下文是什么样的,请以 root 身份在命令提示符处键入以下内容:

semanage fcontext -l | grep mysql

你会看到很多行,但特别是 /var/lib/mysql,mysql 可以写入。该目录的 fcontext 是 mysqld_db_t。这是您需要应用到您希望进程从中读取和写入的目录的内容。你可以这样做:

semanage fcontext -a -t mysqld_db_t '/somedir(/.*)?'

不要忘记目录周围的单引号。接下来,您要确保 fcontext 以递归方式应用于此目录。输入以下内容:

restorecon -RFvv /somedir

这可确保所有现有文件和子目录都具有正确的 fcontext。假设权限正确,Mysql 可以读写。第一次这样做时,我绊倒了,因为我的目录设置允许任何人读取,但不能写入。所以我能够使用 mysql 'infile' 命令,但不能使用 'outfile'。确保用户 mysql 可以写入目录。

如果您不关心 SELinux,您可以将其关闭并避免我在上面列出的所有内容。我喜欢额外的安全层,所以我使用它。

【讨论】:

    【解决方案2】:

    here 所述,您有权限或空间相关问题。

    【讨论】:

    • 是的,当我在谷歌上搜索该问题时,我看到了这篇文章,但我不知道我必须做什么,在文章中我必须将这个 line [mysqld] tmpdir=C:/temp 添加到我的选项文件中我不知道在哪里可以找到它
    • 再来一次?什么特别是你找不到?
    • 我要在其中添加行[mysqld] tmpdir=的那个文件
    • 那肯定是权限问题。不理会tmpdir - 这是与 Windows 相关的问题。只需检查一下,您的 mysql 服务器正在使用哪个用户,然后检查该用户是否对 /home/aimad/GestionStock/ 具有写权限。我想,它不是,因为它看起来像你的主目录。
    • 嗯,你检查mysql用户的权限了吗?