Как я могу обойти MySQL Errcode 13 с ВЫБОРОМ В OUTFILE?

Я пытаюсь вывести содержание таблицы к файлу 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 является ошибкой полномочий, но я получаю его, даже если я изменяю владение / данных к mysql:mysql и даю ему 777 полномочий. MySQL работает как пользователь "mysql".

Странно я могу создать файл в/tmp, просто не в любом другом каталоге, который я попробовал, даже с набором полномочий, таким образом, что пользователь mysql должен смочь записать в каталог.

Это - MySQL 5.0.75, работающий на Ubuntu.

114
задан OMG Ponies 8 May 2011 в 20:26
поделиться

6 ответов

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

Последние версии Ubuntu Server Editions (например, 10.04) поставляются с AppArmor, и профиль 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. Мы надеемся, что вы уже подумали о последствиях этого для безопасности.

187
ответ дан 24 November 2019 в 02:32
поделиться

Я знаю, что вы сказали, что уже пытались установить разрешения на 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 $ 
14
ответ дан 24 November 2019 в 02:32
поделиться

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

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

1
ответ дан 24 November 2019 в 02:32
поделиться

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

  • установлен ли системная переменная secure_file_priv ? Если это так, все файлы должны быть записаны в этот каталог.
  • убедитесь, что файл не существует - MySQL будет создавать только новые файлы, а не перезаписывать существующие.
4
ответ дан 24 November 2019 в 02:32
поделиться

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

17
ответ дан 24 November 2019 в 02:32
поделиться

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

1
ответ дан 24 November 2019 в 02:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: