Как выполнить команду MySQL из сценария оболочки? - PullRequest
111 голосов
/ 08 ноября 2011

Как выполнить команду SQL с помощью сценария оболочки, чтобы сделать ее автоматизированной?

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

Я использую эту команду:

mysql -h "server-name" -u root "password" "database-name" < "filename.sql"

Это код сценария оболочки, который создает файл ds_fbids.sql и передает егоmysql.

perl fb_apps_frm_fb.pl
perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql
mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql

Как правильно это сделать?

Ответы [ 14 ]

0 голосов
/ 13 марта 2019

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

#!/bin/bash
    PROPERTY_FILE=filename.properties

    function getProperty {
       PROP_KEY=$1
       PROP_VALUE=`cat $PROPERTY_FILE | grep "$PROP_KEY" | cut -d'=' -f2`
       echo $PROP_VALUE
    }

    echo "# Reading property from $PROPERTY_FILE"
    DB_USER=$(getProperty "db.username")
    DB_PASS=$(getProperty "db.password")
    ROOT_LOC=$(getProperty "root.location")
    echo $DB_USER
    echo $DB_PASS
    echo $ROOT_LOC
    echo "Writing on DB ... "
    mysql -u$DB_USER -p$DB_PASS dbname<<EOFMYSQL

    update tablename set tablename.value_ = "$ROOT_LOC" where tablename.name_="Root directory location";
    EOFMYSQL
    echo "Writing root location($ROOT_LOC) is done ... "
    counter=`mysql -u${DB_USER} -p${DB_PASS} dbname -e "select count(*) from tablename where tablename.name_='Root directory location' and tablename.value_ = '$ROOT_LOC';" | grep -v "count"`;

    if [ "$counter" = "1" ]
    then
    echo "ROOT location updated"
    fi
0 голосов
/ 19 января 2019

Чтобы "автоматизировать" процесс импорта сгенерированного файла .sql, избегая при этом всех ловушек, которые могут быть скрыты при попытке пропустить файлы через stdin и stdout, просто скажите MySQL выполнить сгенерированный .sql файл с помощью команды SOURCE в MySQL.

Синтаксис в коротком, но превосходном, ответе от Кшитый Суд , дает лучшую отправную точку. Короче говоря, измените команду OP согласно синтаксису Kshitij Sood и замените команды в ней командой SOURCE:

#!/bin/bash
mysql -u$user -p$password $dbname -Bse "SOURCE ds_fbids.sql
SOURCE ds_fbidx.sql"

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

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

Как решать проблемы безопасности, связанные с паролем в командной строке, или в файле my.cnf, и т. Д., Было подробно рассмотрено в других ответах с некоторыми отличными предложениями. Мой любимый ответ , от Дэнни , охватывает это, в том числе, как решить проблему при работе с cron заданиями или чем-то еще.


Чтобы ответить на комментарий (вопрос?) К короткому ответу, который я упомянул: нет, его нельзя использовать с синтаксисом HEREDOC, поскольку дается эта команда оболочки. HEREDOC может использоваться в синтаксисе версии redirection (без опции -Bse), так как перенаправление ввода / вывода - это то, на чем построен HEREDOC. Если вам нужна функциональность HEREDOC, было бы лучше использовать ее при создании файла .sql, даже если это временный файл, и использовать этот файл в качестве «команды» для выполнения с пакетной строкой MySQL.

#!/bin/bash
cat >temp.sql <<SQL_STATEMENTS
...
SELECT \`column_name\` FROM \`table_name\` WHERE \`column_name\`='$shell_variable';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql

Помните, что из-за расширения оболочки вы можете использовать переменные оболочки и среды в HEREDOC. Обратной стороной является то, что вы должны избегать каждого обратного удара. MySQL использует их в качестве разделителей для идентификаторов, но оболочка, которая получает строку первой, использует их в качестве разделителей исполняемых команд. Пропустите выход из-за одного обратного удара команд MySQL, и все это взорвется с ошибками. Всю проблему можно решить с помощью цитируемой строки LimitString для HEREDOC:

#!/bin/bash
cat >temp.sql <<'SQL_STATEMENTS'
...
SELECT `column_name` FROM `table_name` WHERE `column_name`='constant_value';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql

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

Другой вариант - использовать многострочные строки в кавычках, разрешенные в Bash, с версией синтаксиса пакета (с -Bse). Я не знаю других оболочек, поэтому не могу сказать, работают ли они там тоже. Вам все равно придется использовать это для выполнения более одного .sql файла с командой SOURCE, так как это , а не завершается ;, как и другие команды MySQL, и разрешена только одна за строку Многострочная строка может быть в одинарных или двойных кавычках, что обычно влияет на расширение оболочки. Он также имеет те же предостережения, что и синтаксис HEREDOC для обратных галочек и т. Д.

Потенциально лучшим решением было бы использование языка сценариев Perl, Python и т. Д. Для создания файла .sql, как это делал OP, и SOURCE этого файла с использованием простого командного синтаксиса вверху. Языки сценариев намного лучше работают со строками, чем оболочка, и большинство из них имеют встроенные процедуры для обработки цитирования и экранирования, необходимые при работе с MySQL.

0 голосов
/ 05 ноября 2015
#!/bin/sh
#Procedures = update
#Scheduled at : Every 00.05 

v_path=/etc/database_jobs
v_cnt=0

MAILTO="indd@abc.in joanson@abc.in sturt@abc.in"
touch "$v_path/db_db_log.log"

#test
mysql -uusername -ppassword -h111.111.111.111 db_name -e "CALL functionName()" > $v_path/db_db_log.log 2>&1
if [ "$?" -eq 0 ]
  then
   v_cnt=`expr $v_cnt + 1`
  mail -s "db Attendance Update has been run successfully" $MAILTO < $v_path/db_db_log.log
 else
   mail -s "Alert : db Attendance Update has been failed" $MAILTO < $v_path/db_db_log.log
   exit
fi
0 голосов
/ 19 февраля 2015
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

Как мне выполнить командную строку с безопасным паролем ?? используйте редактор настроек !!!

Начиная с mysql 5.6.6, вы можете сохранить пароль в конфигурационном файле, а затем выполнить команды cli, подобные этой ...

mysql --login-path=storedPasswordKey ....

- логин-путь заменяет переменные ... хост, пользователь И пароль. отлично верно!

...