Не удается создать / записать файл в 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, вы можете отключить его и избегать всего, что я изложил выше. Мне нравится дополнительный уровень безопасности, поэтому я работаю с ним.
Как указано здесь, у вас есть разрешение или проблема, связанная с пространством.