У меня есть скрипт bash, который загружает и импортирует CSV-файл в локальный MySQL. База данных — MySQL 5.6 на Ubuntu 14.04, я загружаю данные с помощью следующего оператора (bash):
mysqlimport --ignore-lines=1 --lines-terminated-by='\n' --fields-terminated-by=',' --verbose --local --user=xx --password=xxxxxxxx mydb /var/www/mysite/data/daily_info.csv
проблема в том, что когда я запускаю скрипт из командной строки, с тем же пользователем, он работает нормально от загрузки до фазы импорта. Я добавил запись в crontab для запуска скрипта с помощью команды
crontab -u theuser -e
Пользователь'Пользователь'то же самое, что и для корректного запуска скрипта из командной строки. 'daily_info' также является именем таблицы, в которую данные добавляютсяmysqlimportкоманда.
Я ожидаю, что задача crontab будет запущена как'Пользователь'разрешение доступа ко всем папкам и файлам,так же, как это делает интерактивная оболочка, но это кажется неправдой. Запланированное задание выдает мне это сообщение об ошибке
mysqlimport: Error: 1290, The MySQL server is running with the --secure-file-priv option so it cannot execute this statement, when using table: daily_info
Я нашел много вопросов, связанных сбезопасный-файл-privпроблема, но ответы не очень подходят к данному случаю, я подозреваю, что команда в моем скрипте (mysqlimport) выполняется от имени другого пользователя, но я не могу это диагностировать.
Любая помощь будет оценена по достоинству. Спасибо.
решение1
Я не нашел объяснения, но пришел к (частичному) решению моего собственного вопроса. Надеюсь, другие могут внести свой вклад в улучшение этого. При запуске из командной строки скрипт работает нормально, когда он активируется из crontab, он применяет то, что установлено взащищенный_файл_privпеременная mysql. Поэтому я изменилмой.cnfфайл, добавив строку под[mysqld]группа, как показано здесь:
[mysqld]
...other settings here...
secure-file-priv=/mypath/datafolder/
После этого необходимо перезапустить MySQL и проверить, вступили ли изменения в силу, с помощью этого запроса:
mysql> show variables like 'secure-file-priv';
+------------------+------------------------+
| Variable_name | Value |
+------------------+------------------------+
| secure_file_priv | /mypath/datafolder/ |
+------------------+------------------------+
1 row in set (0.01 sec)
Обратите внимание, что когда база данных загружает.cnfфайле символ «-» преобразуется в «_» (подчеркивание).