Дано: требуется синхронизация данных между системами, входная информация раз в час поступает в виде файла в формате CSV через запрос к веб сервису, должна быть загружена в таблицу MySQL. Сервер MySQL не локальный. ОС Oracle Linux 7, MySQL 8
Что не работает
Неработающий скрипт:
#!/bin/bash ## переменные DIR="/opt/syncdata" SCRIPTNAME="statictable_import" LOGFILE="$DIR/LOG/$SCRIPTNAME.log" SCRIPTNAME="statictable_import" DB="TEMPDB03" DBTABLE="STATICTABLE" CSVFILE="$DIR/CSV/STATICTABLE.CSV" MYSQL="/usr/bin/mysql" WGET="/usr/bin/wget" ## загрузка файла из веб-сервиса и сохранение его в каталог CSV $WGET -O $CSVFILE https://USR0045:PASSWORD@restservice.local/pls/src_data/grafana/statictable ## подключение к MySQL и очищение таблицы $MYSQL --database=$DB<<EOFMYSQL TRUNCATE TABLE $DBTABLE; EOFMYSQL ## загрузка данных из файла $MYSQL --database=$DB<<EOFMYSQL load data local infile '$CSVFILE' replace INTO TABLE $DBTABLE FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES (ID, TABLENAME, NAME, TIME, VALUE01, VALUE02, VALUE03, VALUE04, VALUE05, VALUE06, VALUE07, VALUE08 ); EOFMYSQL
Первая ошибка:
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.`
Запрещено. Это решается переменной сервера, проверяем её:
SHOW GLOBAL VARIABLES LIKE 'local_infile'; 'local_infile','OFF'
Запрещаем запрещать и снова проверяем
SET GLOBAL local_infile = 'ON'; SHOW GLOBAL VARIABLES LIKE 'local_infile' 'local_infile','ON'
Выполняем скрипт, опять получаем ошибку:
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.`
Устанавливаем переменную в *.ini сервера и перезапускаем сервер
local_infile=ON
И опять не работает.
ERROR 2068 (HY000) at line 1: LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
Решение
Не уверен баг это или особенность, но помимо глобальной переменной сервера требуется опция в команде mysql: –local-infile=1
Работающий скрипт:
#!/bin/bash ## переменные DIR="/opt/syncdata" SCRIPTNAME="statictable_import" LOGFILE="$DIR/LOG/$SCRIPTNAME.log" SCRIPTNAME="statictable_import" DB="TEMPDB03" DBTABLE="STATICTABLE" CSVFILE="$DIR/CSV/STATICTABLE.CSV" MYSQL="/usr/bin/mysql" WGET="/usr/bin/wget" ## загрузка файла и сохранение его в каталог CSV $WGET -O $CSVFILE https://USR0045:PASSWORD@restservice.local/pls/f_data/grafana/statictable ## подключение к MySQL и очищение таблицы $MYSQL --database=$DB<<EOFMYSQL TRUNCATE TABLE $DBTABLE; EOFMYSQL ## загрузка данных из файла $MYSQL --local-infile=1 --database=$DB<<EOFMYSQL load data local infile '$CSVFILE' replace INTO TABLE $DBTABLE FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES (ID, TABLENAME, NAME, TIME, VALUE01, VALUE02, VALUE03, VALUE04, VALUE05, VALUE06, VALUE07, VALUE08 ); EOFMYSQL
Хинт. Сервер удалённый, а в скрипте не используется логин, пароль и имя сервера MySQL. В ОС создан пользователь от имени которого выполняется синхронизация, в пространстве пользователя настроен CRONTAB со всеми задачами синхронизации, в файле ~/.my.cnf пользователя хранятся настройки подключения к MySQL.
cat ~/.my.cnf [client] user=USER_TEMPDB03 password="PASSWORD" host=mysql02-master.local