Не удается создать / записать файл в MySQL

Я создал хранимую процедуру, которая создает файл 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

но когда я вызываю эту хранимую процедуру, используя имя_таблицы в ее параметре, я получаю эту ошибку:

Не удается создать / записать в файл '/home/aimad/GestionStock/20130615_BonInterne.csv' (код ошибки: 13)

РЕДАКТИРОВАТЬ:

Я использую ОС Linux Xubuntu 13.04

2 ответа

Если у вас включен SELinux, mysql не будет писать в каталог, если у него нет соответствующего контекста. Сначала введите "getenforce" из командной строки. Если он возвращает "Enforcing", то SELinux включается, и вам нужно применить определенный контекст SELinux к каталогу, в который вы пытаетесь читать / записывать. Это дополнение к наличию правильных разрешений. Перейдите в каталог и введите "ls -Z", и вы увидите conetext SELinux. Посмотрите на контекст object_r. Если это не mysqld_db_t, то ваш процесс не сможет читать / записывать в каталог независимо от разрешений.

Убедитесь, что команда 'semanage' установлена, чтобы вы могли установить контекст. Чтобы увидеть, как выглядит контекст файла SELinux для mysql, введите в командной строке следующую команду как 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, вы можете отключить его и избегать всего, что я изложил выше. Мне нравится дополнительный уровень безопасности, поэтому я работаю с ним.

Как указано здесь, у вас есть разрешение или проблема, связанная с пространством.

Другие вопросы по тегам