SELECT INTO OUTFILE
не работает для смонтированного каталога CIFS (/mnt/backup/test
), но работает для обычного каталога (/tmp/tests
).
mysql> select * from mytable into outfile '/tmp/tests/mytable.txt';
Query OK, 3723 rows affected (0.05 sec)
mysql> select * from mytable into outfile '/mnt/backup/test/mytable.txt';
ERROR 1 (HY000): Can't create/write to file '/mnt/backup/test/mytable.txt' (Errcode: 2)
В mysql
у пользователя нет проблем с записью /mnt/backup/test/mytable.txt
:
root:~# su - -s /bin/bash mysql
mysql:~$ touch /mnt/backup/test/mytable.txt
mysql:~$ ls -l /mnt/backup/test/mytable.txt
-rw-r--r-- 1 root root 0 2009-11-16 10:48 /mnt/backup/test/mytable.txt
Каталог CIFS /mnt/backup
монтируется с: rw,noperm,user=****,password=****
Поскольку -T
вариант mysqldump
использует это, какие варианты (MySQL / CIFS) нужны для SELECT INTO OUTFILE
работать с участием мой CIFSсмонтированный каталог?
Обновить:
Интересно, что strace
из mysqld
процесс действительно выявил сбой контроля доступа, как предположил Майкл. Но я все еще не знаю Зачем. Простой сценарий Perl, запущенный как mysql
вызывает тот же системный вызов без проблем.
Экстракт mysqld strace
open("/mnt/backup/tests/bugs.1.txt", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0666)
= -1 EACCES (Permission denied)
Экстракт Perl Strace
open("/mnt/backup/tests/bugs.32064.txt", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 3
Обратите внимание, что каталог /mnt/backup/tests
опорожнялся перед каждым запуском.
На самом деле проблема была AppArmor.
Добавление /mnt/backup/** w
к /etc/apparmor.d/usr.sbin.mysqld
и перезапустив его (/etc/init.d/apparmor restart
) решил проблему.
Эта ошибка может означать одно из двух: файл может уже существовать или это на самом деле проблема с разрешениями (несмотря на то, что ваш пример показывает, что это не проблема с разрешением, я считаю, что это действительно так).
Кроме того, когда вы запускаете su с опцией «-» для имитации их среды, вам необходимо указать это в качестве последней опции su.