一、前言

最近在做个初始化大集群应用的项目,一些项目启动前要把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. 1:单独用一个文件去存储用户名密码
  2. 2:每次要执行的时候把用户名密码填进去
  3. 3:执行脚本引用这个文件当中秘钥文件
  4. 4:执行完毕后把用户名密码删掉
  5. 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

完毕!

上一篇 下一篇