2013-06-15 2 views
0

Я создал хранимую процедуру, которая создает CSV-файл из таблицы.Невозможно создать/записать файл в MySQL

это хранимая процедура:

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' (Errcode: 13)

EDIT:

OS, которую я использую, - это Linux Xubuntu 13.04

+0

Вопрос об обновлении с использованием ОС –

+0

@DavidJashi это сделано :) –

ответ

0

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

+0

Да, я видел эту статью, когда я искал проблему, но я не мог знать, что я должен делать, в статье, которую я должен сделать добавьте эту 'line [mysqld] tmpdir = C:/temp' в мой файл параметров, который я не знаю, где его найти –

+0

Приходите еще? Что конкретно вы не можете найти? –

+0

этот файл, где я хочу добавить строку '[mysqld] tmpdir =' –

0

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

Убедитесь, что команда 'semanage' установлена ​​так, что вы можете установить контекст. Чтобы увидеть, как выглядит контекст файла SELinux для mysql, введите в командной строке следующую команду:

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

Смежные вопросы