一、前言
最近在做个初始化大集群应用的项目,一些项目启动前要把MySQL服务搭建完毕并且把初始化脚本执行到位。我找了一些文章都是介绍用UI工具的,少数说的是source脚本的方法,还有mysql import
命令方式。我的场景需求是通过shell脚本执行mysql
命令,这个机器上是没有装mysql服务的,要通过这台跳板机去执行远程mysql服务进行导入数据。
如果要完成这个目标首先必须要把MySQL的client端安装到这台机器上,你才有mysql
命令使用,余下的再研究怎么用mysql命令去执行source
。
二、安装MySQL Client
本人使用的是5.7.35版本,请到官网去下载安装包:https://downloads.mysql.com/archives/community/
必须下载这三个安装包,是有依赖关系的
mysql-community-client-5.7.35-1.el7.x86_64.rpm
mysql-community-libs-5.7.35-1.el7.x86_64.rpm
mysql-community-common-5.7.35-1.el7.x86_64.rpm
再执行全部安装命令
> rpm -ivh mysql-community-*
如果出现***-libs
的异常则把mariadb-libs
这个卸载掉,应该操作系统默认已经安装了这个包,和mysql的有冲突。
> yum -y remove mariadb-libs-*
## 再安装
> rpm -ivh mysql-community-*
安装完毕后输入mysql --version
验证是否安装成功
> mysql --version
## 显示下面的字样就代表成功
mysql Ver 14.14 Distrib 5.7.35, for Linux (x86_64) using EditLine wrapper
三、远程连接MySQL Server
我们执行mysql --help
命令得出使用帮助,太多了,列举几个熟悉的吧:
> mysql --help
Usage: mysql [OPTIONS] [database]
-?, --help Display this help and exit.
-I, --help Synonym for -?
-e, --execute=name Execute command and quit. (Disables --force and history
file.)
-h, --host=name Connect to host.
-p, --password[=name]
Password to use when connecting to server. If password is
not given it's asked from the tty.
-P, --port=# Port number to use for connection or 0 for default to, in
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/services, built-in default (3306).
-u, --user=name User for login if not current user.
-V, --version Output version information and exit.
从帮助文档中看,用-h(MySQL服务端IP)、-u(用户名)、-P(端口)、-p(密码)
就能连接到服务端了,如下示例
> mysql -h localhost -P 3306 -u root -p
## 注意:-h、-u、-P、-p这些可以不带空格的,比如密码如果带了空格则代表要额外手动输入一次密码,后面如果空格再填跟上密码是无效的,被认为是数据库名处理。
> mysql -h localhost -P 3306 -u root -p 123456
Enter password:
ERROR 1049 (42000): Unknown database '123456'
## 所以如果不想额外输入密码则跟着-p123456就可以进入了。
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 8.0.28 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| xxxxx |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.02 sec)
mysql>
四、shell脚本>source命令
因为如第三点是进入控制台去输入命令使用的,我们期望的效果是不进入客户端控制台执行命令。
我观察了一下help命令有一个 -e, --execute
的参数,这个参数可以执行一下sql命令。试一把发现成功了!
> mysql -h localhost -P 3306 -u root -p123456 -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| xxxxx |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
在试一试source命令是否能执行,在source命令之前要先写一个sql文件,sql文件很简单,就建表、写数据的脚本大家自行去复制一个就好了,跟你dump一个表数据+表结构一样。再写脚本试试:
> mysql -h localhost -P 3306 -u root -p123456 -e "source /home/test.sql"
mysql: [Warning] Using a password on the command line interface can be insecure.
没有异常,在去UI看看表建成功了,数据也写进去了,可喜可贺。
五、密码明文安全
再看:[Warning] Using a password on the command line interface can be insecure.
执行命令会出现这一句警告,是因为不建议在控制台直接明文写密码,它建议密码等回车后再单独输入,这样才符合安全标准。但是我们要一次性执行命令,不能用这种第二次输入的方式来做,该怎么办呢?我去网上找了一些方案,我觉得这样做比较合适:
- 1:单独用一个文件去存储用户名密码
- 2:每次要执行的时候把用户名密码填进去
- 3:执行脚本引用这个文件当中秘钥文件
- 4:执行完毕后把用户名密码删掉
- 5:该文件不允许其他用户查看
我在帮助文档里面有一个外部文件的参数支持,这个参数就是可以让我们把用户名密码文件写到里面去的,不详细介绍了。
## vim命令把用户名密码写进去,格式有要求请看:
> vim my.password
[client]
user=root
password=123456
## 再来执行一下发现报错了,我找了资料说 --defaults-extra-file 参数必须在第一位,否则会报错。
> mysql -h localhost -P 3306 --defaults-extra-file="/home/my.password" -e "show databases;"
mysql: [ERROR] unknown variable 'defaults-extra-file=/home/my.password'.
## 我移动一下,成功了!
> mysql --defaults-extra-file="/home/my.password" -e "show databases;" -h localhost -P 3306
+--------------------+
| Database |
+--------------------+
| xxxxx |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
这样就不在提示密码输入安全告警了,总的shell脚本就不贴了基本就那个步骤。
六、日志输出重定向
另外如果执行source命令里面有一些打印日志,可以重定向到一个输出文件中,避免在shell脚本中一堆的打印,然后重定向的这个日志文件你可以用于轮询文本用,比如如果出现了执行finish
就认为执行成功、执行完毕,这样就能做异步的检测功能了。
比如我在test.sql的脚本里面写了一句show databases;
命令,查询没有重定向输出文件前是控制台直接打印出来的,加上重定向后就没有了,都在日志文件中。
> mysql --defaults-extra-file="/home/my.password" -e "source /home/test.sql" -h localhost -P 3306
+--------------------+
| Database |
+--------------------+
| hippo4j_manager |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
## 加重定向的写法
> mysql --defaults-extra-file="/home/my.password" -e "source /home/test.sql" -h localhost -P 3306 >/home/out.log
## 看一下这个文件内容
> ls -l
total 12
-rw-r--r-- 1 root root 35 Mar 2 08:16 my.password
-rw-r--r-- 1 root root 73 Mar 2 08:39 out.log
-rw-r--r-- 1 root root 543 Mar 2 08:39 test.sql
> more out.log
Database
hippo4j_manager
information_schema
mysql
performance_schema
sys
完毕!