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

相关推荐
AskHarries11 分钟前
Java字节码增强库ByteBuddy
java·后端
佳佳_25 分钟前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
掘金-我是哪吒1 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
许野平2 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
zmgst2 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
令狐少侠20112 小时前
explain执行计划分析 ref_
mysql
随心............2 小时前
python操作MySQL以及SQL综合案例
数据库·mysql
xjjeffery2 小时前
MySQL 基础
数据库·mysql
恒辉信达2 小时前
hhdb数据库介绍(8-4)
服务器·数据库·mysql
58沈剑3 小时前
80后聊架构:架构设计中两个重要指标,延时与吞吐量(Latency vs Throughput) | 架构师之路...
架构