Я пытаюсь сбросить содержимое таблицы в файл csv с помощью оператора MySQL SELECT INTO OUTFILE. Если я сделаю:
SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Outfile.csv будет создан на сервере в том же каталоге, в котором хранятся файлы базы данных.
Однако, когда я меняю свой запрос на:
SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Я получил:
ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)
Errcode 13 - это ошибка разрешений, но я получаю ее, даже если меняю владельца / data на mysql: mysql и даю ему 777 разрешений. MySQL работает от имени пользователя "mysql".
Как ни странно, я могу создать файл в / tmp, но не в каком-либо другом каталоге, который я пробовал, даже с такими разрешениями, чтобы пользователь mysql мог писать в каталог.
Это MySQL 5.0.75, работающий на Ubuntu.
mysql
sql
into-outfile
Райан Олсон
источник
источник
/tmp
.Ответы:
Какая именно версия Ubuntu и это Ubuntu Server Edition?
Последние версии Ubuntu Server Edition (например, 10.04) поставляются с AppArmor, а профиль MySQL по умолчанию может находиться в принудительном режиме. Вы можете проверить это, выполнив
sudo aa-status
так:Если mysqld включен в принудительный режим, то он, вероятно, запрещает запись. Записи также будут записаны,
/var/log/messages
когда AppArmor блокирует запись / доступ. Что вы можете сделать , это изменить/etc/apparmor.d/usr.sbin.mysqld
и добавить/data/
и/data/*
около дна , как так:А затем заставьте AppArmor перезагрузить профили.
ВНИМАНИЕ: вышеуказанное изменение позволит MySQL читать и записывать в каталог / data. Мы надеемся, что вы уже учли последствия этого для безопасности.
источник
/your/abs/folder/ r, /your/abs/folder/** rwk, }
не забудьте поставить запятую в конце!Ubuntu использует AppArmor, что мешает вам получить доступ к / data /. Fedora использует selinux, и это предотвратит это на машине RHEL / Fedora / CentOS.
Чтобы изменить AppArmor, чтобы MySQL мог получить доступ к / data /, выполните следующие действия:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
добавьте эту строку в любом месте списка каталогов:
/data/ rw,
затем выполните:
sudo /etc/init.d/apparmor restart
Другой вариант - полностью отключить AppArmor для mysql, это НЕ РЕКОМЕНДУЕТСЯ :
sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
Не забудьте перезапустить apparmor:
sudo /etc/init.d/apparmor restart
источник
Я знаю, что вы сказали, что уже пытались установить разрешения на 777, но поскольку у меня есть доказательства того, что для меня это была проблема с разрешением, я публикую то, что я точно выполняю, в надежде, что это может помочь. Вот мой опыт:
источник
MySQL здесь тупеет. Он пытается создать файлы в / tmp / data / .... Итак, вы можете сделать следующее:
Тогда попробуйте свой запрос. Это сработало для меня после нескольких часов отладки проблемы.
источник
Эта проблема меня давно беспокоит. Я заметил, что это обсуждение не указывает на решение на RHEL / Fecora. Я использую RHEL, и я не нахожу файлов конфигурации, соответствующих AppArmer в Ubuntu, но я решил свою проблему, сделав КАЖДЫЙ каталог в каталоге PATH читаемым и доступным для mysql. Например, если вы создаете каталог / tmp, следующие две команды позволяют SELECT INTO OUTFILE выводить файл .sql И .sql
Если вы создаете каталог в своем домашнем каталоге / home / tom, вы должны сделать это как для / home, так и для / home / tom.
источник
chown mysql:mysql
решило мою проблемуТы можешь сделать это :
источник
Некоторые вещи, которые стоит попробовать:
secure_file_priv
системная переменная? Если это так, все файлы должны быть записаны в этот каталог.источник
У меня такая же проблема, и я решил ее, выполнив следующие действия:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
теперь файл будет открыт в редакторе, пожалуйста, добавьте туда свой каталог
/ var / www / csv / * rw,
аналогично я добавил в свой файл, как следующее изображение:
sudo /etc/init.d/apparmor перезапуск
Это успешно сделано и записывает все строки с выбранными столбцами в файл OUTPUT.csv ...
источник
В моем случае решение заключалось в том, чтобы сделать каждый каталог в пути к каталогу читаемым и доступным с помощью
mysql
(chmod a+rx
). Каталог все еще был указан относительным путем в командной строке.источник
Я столкнулся с той же проблемой. Моя проблема заключалась в том, что каталог, в который я пытался выполнить сброс, не имел разрешения на запись для процесса mysqld. Первоначальный дамп sql будет записан, но запись файла csv / txt завершится ошибкой. Похоже, дамп sql запускается от имени текущего пользователя, а преобразование в csv / txt выполняется от имени пользователя, который запускает mysqld. Таким образом, каталог требует разрешения на запись для обоих пользователей.
источник
Вам необходимо указать абсолютный путь, а не относительный.
Укажите полный путь к каталогу / data, в который вы пытаетесь писать.
источник
touch /data/outfile.csv
su --shell=/bin/sh nameofaccount
Использует ли Ubuntu SELinux? Убедитесь, что он включен и принудительно. /var/log/audit/audit.log может быть полезным (если Ubuntu придерживает его - это расположение RHEL / Fedora).
источник
У меня была такая же проблема с CentOs 6.7. В моем случае все разрешения были установлены, но ошибка все равно произошла. Проблема заключалась в том, что SE Linux находился в режиме принудительного исполнения.
Я переключил его на «разрешающий» с помощью команды
sudo setenforce 0
Потом у меня все наладилось.
источник