Лучший способ, чтобы выполнить несколько команд MySQL с помощью скрипта

Я хотел бы написать *.sh скрипт для выполнения нескольких команд MySQL.

В настоящее время я могу сделать что-то вроде следующего

mysql -h$host -u$user -p$password -e "drop database $dbname;"
mysql -h$host -u$user -p$password -e "create database $dbname;"
mysql -h$host -u$user -p$password -e "another MySQL command"
...

есть ли способ избежать ввода "mysql-h$host-u$user-p$password-e" каждый раз, когда я хочу выполнить команду MySQL?

4 ответов


Я думаю, что вы можете выполнять операторы MySQL из текстового файла, например

вот cmds.txt-файл, содержащий команды MySQL:

select colA from TableA;
select colB from TableB;
select colC from TableC;

чтобы выполнить их с помощью сценария оболочки, введите

mysql -h$host -u$user -p$password db_dbname < cmds.txt

таким образом, вы отделяете свои команды MySQL от своего сценария оболочки.

вы можете захотеть, чтобы ваш скрипт отображал вам информацию о ходе работы. Для этого вы можете вызвать mysql с опцией" --verbose".

для получения дополнительной информации см. https://dev.mysql.com/doc/refman/5.6/en/mysql-batch-commands.html


обратите внимание, что вы также можете использовать здесь doc для запросов в том же скрипте:

mysql -h$host -u$user -p$password db_dbname <<'EOF'
select colA from TableA;
select colB from TableB;
select colC from TableC;
EOF

обратите внимание, что я использовал 'EOF', а не EOF в первой строке, чтобы предотвратить содержимое скрипта для отключения подстановки параметров (особенно ` может быть проблематично)

Также обратите внимание, что там стоит не будет никаких пробелов до финала EOF (за исключением, если вы используете <<-, а не << -- в этом случае ведущим символы табуляции удаляются):

mysql -h$host -u$user -p$password db_dbname <<- 'EOF'
↠select colA from TableA;
↠select colB from TableB;
↠select colC from TableC;
↠EOF

(заменить символ табуляции).

для получения дополнительной информации о синтаксисе here doc см. документация bash.


Вы можете использовать один multiquery:

mysql -h$host -u$user -p$password -e "drop database $dbname;create database $dbname;another MySQL command;"

просто напишите все ваши запросы разделяется ;. Они будут бегать один за другим.


есть несколько способов, в Linux у вас есть:

из MySQL cli:

mysql> source mycmds.sql

С Использованием Труб:

echo "SELECT ..; INSERT ..;" | mysql ...

выполнение команд из файла с помощью труб или переадресации:

cat file.sql | mysql ... OR mysql .. < file.sql