toc
style: number
- 已审核
本本分分做人,踏踏实实做事!!!
前言
mysql configure default root password
- 最近遇到一个环境犹豫历史原因装的是
5.7
版本的数据库(Mysql). 因为程序已经升级到 8.0 的,而且我们对旧版本的数据库已经程序不兼容了。所以决定升级下 mysql . 本来觉得升级其实很简单,就是卸载重新安装。但是实际操作下来还是很麻烦的。 - 首先我们需要升级数据库,升级数据库设计卸载,而且版本跨度太大对于数据的存储方式也有所不同,所以数据我们也得清除掉,好在我们有初始化数据脚本,这个到不是难题。重点是初始化数据之后我们得将变化的数据恢复回来,因此我们特意将这些 sql 通过比对抽离出来。
- 接下来是我们程序的启动,以及 nacos 的数据恢复等等。接下来我就升级过程赘述下。
具体案例
卸载 Mysql
- 首先我们需要卸载服务器上安装的
Mysql
,因为我们就是 RPM 安装的。
shell
# remove
for i in $(rpm -qa|grep mysql);
do
echo "delete $i"
sudo rpm -e $i --nodeps;
done
- 如果你还通过其他方式还需要如下操作:
shell
for i in $(rpm -qa|grep mariadb);
do
echo "delete $i"
sudo rpm -e $i --nodeps;
done
- 软件卸载完成之后,数据我们也需要清除掉。
shell
sudo rm -rf /var/lib/mysql && rm -rf /etc/my.cnf
安装 Mysql
- 我这里选择的是
tar
包离线安装。感觉离线可控度更高点。
- 然后我们解压我们的压缩包。这里我选择
el7
shell
tar -xvf ${currentHome}/${mysql_file} -C ${HOME}/zxhtom/
- 解压出来的就是实际的 RPM 包,但是我们这里没必要全部安装,只需要安装核心的几个既可以。
shell
# echo y | sudo rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm
# echo y | sudo rpm -ivh mysql-community-client-plugins-8.0.26-1.el7.x86_64.rpm
# echo y | sudo rpm -ivh mysql-community-libs-8.0.26-1.el7.x86_64.rpm
# echo y | sudo rpm -ivh mysql-community-client-8.0.26-1.el7.x86_64.rpm
# echo y | sudo rpm -ivh mysql-community-server-8.0.16-2.el7.x86_64.rpm
-
接着就是修改配置文件,需要注意添加
lower_case_table_names=1
忽略大小写问题。 -
紧接着我们就可以
sudo systemctl restart mysqld
,这样就完成升级了。虽然说的简单,但是这里一定要注意我们在启动之前就准备好/etc/my.cnf
这个文件,一旦启动后Mysql
就会初始化内部的数据,此时想修改忽略大小写那是肯定会报错的,这也是我踩坑的地方。
修改 ROOT 密码
Mysql
默认的 ROOT 密码是随机生成的,我们可以在/var/log/mysqld.log
中查看。
shell
default_root_password=`sudo cat ${mysql_runtime_log_path} | grep -E 'A temporary password is generated for root@localhost' | sed -n '$p' | awk -F 'root@localhost:' '{print $NF}'`
default_root_password=$(echo $default_root_password)
echo "@@"${default_root_password}
-
因为我喜欢脚本自动化,所以本文我都是截取的部分脚本,这里需要注意的是通过
awk
截取 root 密码会出现前空格,这个也是我踩坑很久的地方,明明获取到密码了死活就是mysqladmin
连接不成功。这里通过$()
方法规避了一下。 -
不知道为什么
mysql
命令不允许使用默认密码连接 root 用户,不知道是我操作问题还是本身限制问题,这里我也没有深究,恰巧发现mysqladmin
可以通过脚本式修改密码
shell
mysqladmin -uroot -p''"${default_root_password}"'' password ''"${MYSQL_ROOT_PASSWORD}"''
- 接着我们就可以使用自定义密码登陆 ROOT 账号了。为了安全我们一般不对外提供 ROOT 账号,所以我们还需要提供一个普通账号。但是这个账号还得开放对应的权限才能使用。为了能够创建不是太复杂的密码,我们还需要将密码级别调低点。
shell
mysql -hlocalhost -uroot -p${MYSQL_ROOT_PASSWORD} -e "set global validate_password.policy=LOW;"
mysql -hlocalhost -uroot -p${MYSQL_ROOT_PASSWORD} -e "create user 'zxhtom'@'%' identified by '${MYSQL_PASSWORD}';grant all on *.* to 'zxhtom'@'%';flush privileges;"
跳过权限
-
其实上面我们也没必要修改 ROOT 账号的密码,毕竟默认生成的密码复杂度还是挺高的,我们主要是创建一个普通账号使用,那么我们完全可以先设置 ROOT 跳过权限,已空密码登陆进 Mysql 服务中然后执行我们上述的创建用户的流程,也是可以的。在
/etc/my.cnf
中mysqld
下新增skip-grant-tables
配置。 -
他的作用允许绕过 ROOT 密码权限校验。
-
甚至我们直接空密码登陆后修改 ROOT 密码权限校验。
shell
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';FLUSH PRIVILEGES;
- 然后我们再去配置文件中去除我们刚才添加的
skip-grant-tables
属性。为什么我没有使用这种方式,因为他需要登陆到Mysql
服务中操作,这在脚本中好像不是太好实现,具体我也没有试过能不能通过 shell 提前录制。但是如果你喜欢文档+手动的方式,这中修改密码的方式也可以了解下。
初始化数据库
- 我们分布式项目涉及到很多数据库,由于我们自身的问题项目本身并没有引入
LiuQuiBase
等数据库迭代管理工具。所以这里还需要我们自己创建数据库。
shell
dbs=("nacos" "db1" "db2" "db3" "db4" "db5" "wechat" "workflow" "db6" "db7" "hvac" "db9" "db8")
for DBNAME in "${dbs[@]}"
do
mysql -h ${HOSTNAME} -u root -p${MYSQL_ROOT_PASSWORD} -e "DROP DATABASE IF EXISTS ${DBNAME}; CREATE DATABASE ${DBNAME} CHARACTER SET 'utf8mb4';grant all privileges
on ${DBNAME}.* to ${MYSQL_USER}@'%';flush privileges;" --connect-expired-password
done
- 创建完数据库后,我们就得导入我们的初始化 sql 文件了,这里我们将以数据库名称命名文件名,这样脚本方便读取。具体的脚本就不展示了。主要是通过如下命令。
shell
mysql -h${HOSTNAME} -P${PORT} -u${MYSQL_USER} -p${MYSQL_PASSWORD} -e"${create_table_data}"
- 其实后续还有,因为涉及到我们具体业务就不放遍展示,我就一个宗旨 : 能脚本的坚决不动手。
总结
- 其实整个过程坐下来很简单,就是升级数据库顺便将数据初始化好。我这里想说的是有些事情看起来容易但是做起来坑多。面对这种变数,我们尽量脚本化,毕竟脚本是不会骗人的,如果出现的场景很多,我们的脚本还能够帮助我们提高工作效率呢。
放松一刻
A friend in power is a friend lost. --- Henry Adams