открытое соединение до mysql для нескольких вставок - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть файл, который постоянно растет, потому что какой-то процесс пишет в него. Моя цель - запустить другой процесс, который будет отслеживать изменения в этом файле, выполнить некоторую предварительную обработку sed / awk / bash и затем вставить результат в базу данных. Это может быть достигнуто с помощью следующей команды:

#!/bin/bash

tail -f -n +1 growing_file | while read a; do
  query=$(echo "$a" | awk '{print "use log; INSERT INTO log (message) VALUES(\"" $4 "\");"}';)
  echo "$query"
  mysql -u root -pSecretPassword -h dbs-host -e "$query"
done

Но у него есть недостаток, заключающийся в том, что для каждой вставки мне нужно установить отдельное соединение, выполнить аутентификацию, выбрать базу данных и, наконец, выполнить вставку. Это также возвращает ошибки после нескольких секунд выполнения:

ОШИБКА 2003 (HY000): Невозможно подключиться к MySQL серверу на «dbs-host» (111 «Соединение отказано»)

Чего хотелось бы добиться, это открыть соединение с базой данных, а затем повторно использовать это открытое соединение для вставок. Я пробовал команду coproc, но не смог достичь своей цели.

PS: также приветствуются решения на других языках, кроме bash (python, node.js, ...)

Ответы [ 3 ]

1 голос
/ 10 февраля 2020

Вот более простой способ написания вашего кода:

tail -f -n +1 growing_file | 
awk '{ print "INSERT INTO log SET message = '"'"'\"${4}\"'"'"';" }' |
mysql -u root -pSecretPassword -h dbs-host log

PS Я рекомендую вам ввести свое имя пользователя, пароль и, возможно, хост в файл опций вместо того, чтобы помещать их в командную строку.

tail -f -n +1 growing_file | 
awk '{ print "INSERT INTO log SET message = '"'"'\"${4}\"'"'"';" }' |
mysql --defaults-file=log.cnf log
0 голосов
/ 10 февраля 2020

Вот хороший сценарий для Bash до Как сохранить соединение MySQL открытым в Bash, но вы точно так же часто получаете размер файла. В вашем сценарии нет сна.

Вы также можете написать пользовательскую функцию MySQL / MariaDb в C. это намного лучше и быстрее, и вы можете запустить его из планировщика MySQL.

0 голосов
/ 10 февраля 2020

Вы запрашиваете механизм пула соединений . В пуле соединений вы открываете соединение один раз, а затем используете его столько раз, сколько вам нужно, вместо создания новых соединений с базой данных, и оно работает намного быстрее.

Я не уверен, для каких библиотек пулов соединений доступны bash. В Java я использую HikariCP , но есть и другие варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...