mysql升级自动化 | 一次升级差点让我下不了班

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.cnfmysqld 下新增 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

相关推荐
tan180°1 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
DuelCode2 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社22 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
why技术2 小时前
Stack Overflow,轰然倒下!
前端·人工智能·后端
幽络源小助理2 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
ai小鬼头3 小时前
AIStarter如何助力用户与创作者?Stable Diffusion一键管理教程!
后端·架构·github
简佐义的博客3 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
爬山算法3 小时前
MySQL(116)如何监控负载均衡状态?
数据库·mysql·负载均衡
Code blocks4 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins