У меня есть сценарий, который пытается загрузить некоторые данные в MySQL с помощью LOAD DATA INFILE
. По какой-то причине он работает, если файл находится в каталоге /tmp
, но не работает, если файл находится в другом каталоге с такими же разрешениями. Я не могу найти способ заставить MySQL импортировать данные из-за пределов каталога /tmp
или каталога базы данных, но я не могу найти в руководстве ничего, объясняющего, почему это так.
Ситуация:
$ ls -l /
...
drwxrwxrwt 21 root root 4096 2010-10-19 20:02 tmp
drwxrwxrwt 2 root root 4096 2010-10-19 20:14 tmp2
$ ls -l /tmp/data.csv
-rwxr-xr-x 1 timm timm 415431 2010-10-19 20:02 /tmp/data.csv
$ ls -l /tmp2/data.csv
-rwxr-xr-x 1 timm timm 415431 2010-10-19 20:14 /tmp2/data.csv
AFAICT они идентичны в важных отношениях. Однако, если в командной строке MySQL я делаю:
> LOAD DATA INFILE '/tmp2/data.csv' IGNORE INTO TABLE ports
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY ' ';
ERROR 29 (HY000): File '/tmp2/data.csv' not found (Errcode: 13)
> LOAD DATA INFILE '/tmp/data.csv' IGNORE INTO TABLE ports
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY ' ';
Query OK, 1 row affected, 1 warning (0.04 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
Из сообщений на форуме я понял, что ошибка 13 указывает на проблему с разрешением. Кажется, что /tmp
лечится MySQL специально, но почему? Самое близкое, что я могу найти, - это строчка в руководстве, в которой говорится:
По соображениям безопасности при чтении текстовых файлов, расположенных на сервере, файлы должны либо находиться в каталоге базы данных, либо быть доступны для чтения всем.
/tmp
нет в каталоге базы данных, но, возможно, он будет обработан так, как будто он есть. Итак, как мне настроить все, чтобы он мог читать файлы за пределами /tmp
?
export TMPDIR=/tmp2
перед запускомmysql
? - person Frédéric Hamidi   schedule 19.10.2010tmpdir
в my.cnf, это не повлияет на поведение (tmp2 по-прежнему не работает, хотя теперь это временный каталог) - person Tim Martin   schedule 20.10.2010