Как я могу обойти MySQL Errcode 13 с помощью SELECT INTO OUTFILE?

StackOverflow https://stackoverflow.com/questions/2783313

  •  03-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь выгрузить содержимое таблицы в 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.

Это было полезно?

Решение

Какая конкретная версия Ubuntu является это и ли это Ubuntu Server Edition?

Недавние Ebuntu Server Editions (например, 10.04) Корабль с AppAmmor и профилем MySQL могут быть в одном режиме по умолчанию. Вы можете проверить это, выполнив sudo aa-status вот так:

# sudo aa-status
5 profiles are loaded.
5 profiles are in enforce mode.
   /usr/lib/connman/scripts/dhclient-script
   /sbin/dhclient3
   /usr/sbin/tcpdump
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/sbin/mysqld
0 profiles are in complain mode.
1 processes have profiles defined.
1 processes are in enforce mode :
   /usr/sbin/mysqld (1089)
0 processes are in complain mode.

Если MySQLD включен в режим исполнения, то он, вероятно, отрицает запись. Записи будут также написаны в /var/log/messages Когда Apparmor блокирует пишет / доступ. Что вы можете сделать, это редактировать /etc/apparmor.d/usr.sbin.mysqld и добавить /data/ а также /data/* возле дна вроде так:

...  
/usr/sbin/mysqld  {  
    ...  
    /var/log/mysql/ r,  
    /var/log/mysql/* rw,  
    /var/run/mysqld/mysqld.pid w,  
    /var/run/mysqld/mysqld.sock w,  
    **/data/ r,  
    /data/* rw,**  
}

А затем сделать Apparmor перезагрузить профили.

# sudo /etc/init.d/apparmor reload

Предупреждение: изменение выше позволит MySQL читать и записывать в каталог / data. Мы надеемся, что вы уже рассмотрели никакие последствия безопасности этого.

Другие советы

Ubuntu использует AppAmmor, и это то, что предотвращает доступ к вам / данным /. Fedora использует SELINUX, и это предотвратит это на машине RHEL / FEDORA / CONTOS.

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

tmp $ pwd
/Users/username/tmp
tmp $ mkdir bkptest
tmp $ mysqldump -u root -T bkptest bkptest
mysqldump: Got error: 1: Can't create/write to file '/Users/username/tmp/bkptest/people.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE'
tmp $ chmod a+rwx bkptest/
tmp $ mysqldump -u root -T bkptest bkptest
tmp $ ls bkptest/
people.sql  people.txt
tmp $ 

MySQL здесь становится глупым.Он пытается создать файлы в /tmp/data/ ....Итак, что вы можете сделать, так это следующее:

mkdir /tmp/data
mount --bind /data /tmp/data

Затем попробуйте выполнить свой запрос.Это сработало у меня после нескольких часов отладки проблемы.

Эта проблема надоела меня в течение длительного времени. Я заметил, что эта дискуссия не указывает на решение на RHEL / FECORA. Я использую RHEL, и я не нахожу файлы конфигурации, соответствующие AppArmer на Ubuntu, но я решил мою проблему, сделав каждый каталог в каталоге пути кчитаваемого и доступен на MySQL. Например, если вы создаете каталог / TMP, следующие два команда делают выбирать в Outfile, способный выводить файл .sql и .sql

chown mysql:mysql /tmp
chmod a+rx /tmp

Если вы создаете каталог в домашнем каталоге / Home / Tom, вы должны сделать это для / Home, так и / Home / Tom.

Ты можешь это сделать :

mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT `FIELD`, `FIELD` FROM `TABLE` LIMIT 0, 10000 ' -X > file.xml

Некоторые вещи, чтобы попробовать:

  • это secure_file_priv Набор системных переменных? Если это так, все файлы должны быть записаны в этот каталог.
  • Убедитесь, что файл не существует - MySQL создаст только новые файлы, а не перезаписать существующие.

У меня такая же проблема, и я исправил эту проблему, выполнив следующие действия:

  • Операционная система :ubuntu 12.04
  • установленная лампа
  • предположим, что ваш каталог для сохранения выходного файла является :/var/www/csv/

Выполните следующую команду в терминале и отредактируйте этот файл с помощью редактора gedit, чтобы добавить свой каталог в выходной файл.

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

  • теперь файл будет открыт в редакторе, пожалуйста, добавьте туда свой каталог

    /var/www/csv/* rw,

  • аналогично я добавил в свой файл, как показано на следующем приведенном изображении :

enter image description here

Выполните следующую команду для перезапуска служб :

перезапуск sudo /etc/init.d/apparmor

Например, я выполняю следующий запрос в phpmyadmin query builder для вывода данных в CSV-файл

SELECT colName1, colName2,colName3
INTO OUTFILE '/var/www/csv/OUTFILE.csv'
FIELDS TERMINATED BY ','
FROM tableName;

Это успешно сделано, и запишите все строки с выбранными столбцами в ВЫХОДНОЙ csv-файл...

В моем случае решение было сделание каждого каталога в каталоге пути к читаемому и доступному mysql (chmod a+rx). Каталог по-прежнему был указан своим относительным путем в командной строке.

chmod a+rx /tmp
chmod a+rx /tmp/migration
etc.

Я только что побежал в эту же проблему. Моя проблема была справочником, который я пытался бросить, не имел разрешения на запись на процесс MySQLD. Начальный дамп SQL будет выписан, но запись файла CSV / TXT будет не удалена. Похоже, что дампа SQL работает как текущий пользователь, а преобразование в CSV / TXT запускается как пользователь, который работает MySQLD. Таким образом, каталог нуждается в разрешениях записи для обоих пользователей.

Вам нужно предоставить абсолютный путь, а не относительный путь.

Укажите полный путь к каталогу / данные / данные, на которые вы пытаетесь написать.

Ubuntu использует SELINUX? Убедитесь, что включено, включено и включено. /var/log/audit/audit.log может быть помогал (если именно здесь ubuntu придерживается - это местоположение RHEL / FEDORA).

У меня была та же проблема на CentOS 6.7 в моем случае все разрешения были установлены и все еще произошла ошибка. Проблема заключалась в том, что SE Linux был в режиме «Обеспечение».

Я переключил его на «допустимое», используя команду sudo setenforce 0

Тогда все разработало для меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top