0

我创建了一个存储过程,它从表中创建一个 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

4

2 回答 2

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,您可以将其关闭并避免我在上面列出的所有内容。我喜欢额外的安全层,所以我使用它。

于 2013-07-03T02:56:58.153 回答
0

如此处所述,您有权限或与空间相关的问题。

于 2013-06-15T12:29:32.017 回答