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

相关推荐
骆晨学长3 分钟前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
AskHarries8 分钟前
利用反射实现动态代理
java·后端·reflect
楠枬19 分钟前
MySQL数据的增删改查(一)
数据库·mysql
Flying_Fish_roe32 分钟前
Spring Boot-Session管理问题
java·spring boot·后端
MinIO官方账号36 分钟前
从 HDFS 迁移到 MinIO 企业对象存储
人工智能·分布式·postgresql·架构·开源
hai405871 小时前
Spring Boot中的响应与分层解耦架构
spring boot·后端·架构
阿华的代码王国2 小时前
MySQL ------- 索引(B树B+树)
数据库·mysql
liupenglove2 小时前
golang操作mysql利器-gorm
mysql·golang
Adolf_19933 小时前
Flask-JWT-Extended登录验证, 不用自定义
后端·python·flask
叫我:松哥3 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap