我希望能够在脚本任务中在远程服务器上运行单个查询。
例如,直觉上,我会想象它是这样的:
mysql -uroot -p -hslavedb.mydomain.com mydb_production "select * from users;"
echo "select * from users;" | mysql -uroot -p -hslavedb.mydomain.com mydb_production
mysql -u <user> -p -e 'select * from schema.table'
(注意使用单引号而不是双引号,以避免shell将*扩展为文件名)
mysql -uroot -p -hslavedb.mydomain.com mydb_production -e "select * from users;"
从用法打印输出:
< p > -e, --execute=name < br > 执行命令退出。(禁用--force和历史文件)
-e
--execute=name
--force
下面是你如何用一个很酷的贝壳技巧来做到这一点:
mysql -uroot -p -hslavedb.mydomain.com mydb_production <<< 'select * from users'
'<<<'指示shell将后面的内容作为stdin,类似于echo中的管道。
使用-t标志来启用表格式输出
如果是经常运行的查询,可以将其存储在文件中。然后,任何时候你想运行它:
mysql < thefile
(当然包括所有的登录和数据库标志)
从mysql手册页:
mysql
You can execute SQL statements in a script file (batch file) like this: shell> mysql db_name < script.sql > output.tab
将查询放在script.sql中并运行它。
script.sql
在这个问题出现的时候,容器化还不是那么流行,下面是如何使用Ansible将单个查询传递到dockerized数据库集群的方法,使用@RC。的回答:
ansible <host | group > -m shell -a "docker exec -it <container_name | container_id> mysql -u<your_user> -p<your_pass> <your_database> -e 'SELECT COUNT(*) FROM my_table;'"
如果不使用Ansible,只需登录到服务器并使用docker exec -it ...部分。
docker exec -it ...
MySQL将发出一个警告,以纯文本传递凭据可能是不安全的,所以要意识到您的风险。