gpt4 book ai didi

mysql - 无法在 MySQL 中创建/写入文件

转载 作者:行者123 更新时间:2023-11-29 13:48:01 25 4
gpt4 key购买 nike

我创建了一个存储过程,它从表创建 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 调用此存储过程时,出现此错误:

Can't create/write to file'/home/aimad/GestionStock/20130615_BonInterne.csv' (Errcode: 13)

编辑:

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

最佳答案

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

关于mysql - 无法在 MySQL 中创建/写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17123630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com