Administrator
发布于 2025-09-15 / 12 阅读
0
0

记录一次失败的mysql升级

背景:二进制部署单节点mysql,5.6升级到5.7

正常的操作步骤如下

事先进行了mysqldump全量备份,为了保证安全,将mysql5.6的程序目录进行了备份,直接mv整个目录,以备回退使用    注意:我这里是因为mysql安装到了/data目录
mv /data/mysql /data/mysql_5.6_bak
cp -r /data/mysql_data /data/mysql_5.6_data_bak

1,停止原mysql服务
systemctl stop mysqld
#或者
/data/mysql/bin/mysqladmin -u root -p shutdown

#验证,确保mysql已停止
ps -ef | grep mysql

2,解压新版本mysql压缩包到数据库安装目录
tar -zxvf /tmp/mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz -C /data
mv /data/mysql-5.7.40-linux-glibc2.12-x86_64 /data/mysql

#赋权,保证mysql用户正常使用
chown -R mysql:mysql /data/mysql

3,#my.cnf需要调整,mysql5.7对比mysql5.6有很多配置不兼容,这里不做具体赘述
4,启动mysql
/data/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
#mysqld_safe是以守护程序启动,mysqld_safe --skip-grant-tables --skip-networking -u root &  则是以无密码方式启动
#验证,需要确保mysql启动
ps -ef | grep mysql

5,执行升级程序
/data/mysql/bin/mysql_upgrade -u root -p -c /data/mysql/my.cnf
或
/data/mysql/bin/mysql_upgrade --defaults-extra-file=/etc/my.cnf -u root -p
#执行完成后,日志出现:
Upgrade process completed successfully.
Checking if update is needed.
即是升级完成
#验证mysql版本
/data/mysql/bin/mysql -V 
或
进入mysql执行:SELECT VERSION()
#验证数据即可

下面是这次迁移最终的解决步骤

前提操作与上面1~3步操作是一样的

4,备份数据目录,直接mv,然后创建一个空数据目录
5,初始化数据库
#mysqld --initialize --user=mysql
6,把备份的数据目录直接替换到现在的data目录
#其实这一步用dump的数据是最好的,但是我中间试了一次,数据有问题,所以被迫选择了风险极大的用目录直接恢复数据
7,删除mysql程序目录如下的内容:
rm -f auto.cnf
rm -f mysql-bin.* ib_logfile*

8,启动mysql
systemctl restart mysqld

9,执行升级程序
mysql_upgrade -u root -p
#验证数据即可

期间的问题汇总

1,账号修改:
系统初始化之后,会输出默认密码,此时的root账号的登录地址只能是localhost,需要先修改localhost的root密码,然后才能进行其他操作
#查看初始化密码:cat /data/mysql/hostname.err | grep "A temporary password"
#修改操作:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;

2,程序文件替换之后,服务可以正常启动,数据库也可以正常进入,但是此时数据库是有问题的,因为元数据和系统表不一致,必须要mysql_upgrade
3,mysqldump如果有显示表不存在的情况,要么跳过这个表要么检查指责给表,不会自动跳过,会导致数据有问题
4,期间频繁出现账密\权限\表空间已存在的问题,没有排查出问题原因,最终只能初始化


评论