我有一个 bash 脚本,用于下载 CSV 文件并将其导入本地 MySQL。数据库是 Ubuntu 14.04 上的 MySQL 5.6,我使用以下语句 (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' 也是由mysql导入命令。
我期望 crontab 任务将按以下方式运行'用户'允许访问所有文件夹和文件,就像交互式 shell 一样但这似乎不是真的。计划作业给了我这个错误消息
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
我发现很多问题与安全文件隐私问题,但答案与这种情况不太吻合,我怀疑我的脚本(mysqlimport)中的命令正在由不同的用户运行,但我无法诊断它。
任何帮助都将不胜感激。谢谢。
答案1
我没有找到解释,但找到了我自己的问题的(部分)解决方案。我希望其他人可以做出贡献来增强这一点。从命令行运行时,脚本运行正常,从 crontab 激活时,它会应用在安全文件隐私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文件中的‘-’字符被转换为‘_’(下划线)。