给客户的数据库版本从5.6.x升级到5.7.42后,客户反馈系统登陆不上了,后来发现是数据库链接有问题,报了1146 - Table 'performance_schema.session_variables' doesn't exist的错

使用YUM源快速升级MySQL

先看一下我升级的步骤吧

下载安装官方yum源

如果之前已经下载安装过了的 可以跳过这一步
wget https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
rpm -ivh mysql57-community-release-el7-11.noarch.rpm

修改MySQL激活版本

vim /etc/yum.repos.d/mysql-community.repo

将56版本的enabled设置成0,57版本的enabled设置成1即可:

# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

# Note: MySQL 5.7 is currently in development. For use at your own risk.
# Please read with sub pages: https://dev.mysql.com/doc/relnotes/mysql/5.7/en/
[mysql57-community-dmr]
name=MySQL 5.7 Community Server Development Milestone Release
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql                                        

验证配置生效

# 运行后查看57版本的状态是不是启用即可
yum repolist all | grep mysql

升级MySQL

升级前,请务必对数据库数据进行备份!!!
#yum会升级到选择的对应版本mysql-server,并且自动会升级相关包
yum update mysql-server

升级时密钥验证失败

在升级时可能会遇到源 "MySQL 5.7 Community Server" 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确的问题,我们只需要安装对应的密钥就ok
# 密钥安装完成再执行升级命令即可
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

升级后的问题处理

数据库连接失败

首先就会遇到一个数据库链接失败的问题,可视化工具或者JDBC都会出现这个问题

这是因为只升级了MySQL数据库的版本,没有更新系统表的版本而产生的数据库版本不匹配(系统表的正确性和一致性)的问题

所以,我们在更新完数据库版本后,还需要手动更新系统表,来确保系统表的正确性和系统表与系统的一致性:

mysql_upgrade -u root -p --force

然后还需要修改my.cnf配置项文件:

# 在[mysqld]下方添加
# 用于指定服务器在执行旧版本(5.6及更早版本)的语句时的行为。当 show_compatibility_56 设置为 ON 时,服务器会模拟 MySQL 5.6 的行为,包括特定的查询优化规则、函数行为、语句解析等。这可以用于确保应用程序在升级到新版本的 MySQL 时仍然正常工作。
show_compatibility_56 = ON
performance_schema

最后重启数据库即可

systemctl restart mysql

SQL语句兼容

解决完数据库连接失败的问题后,发现一些SQL语句也报了异常

### Cause: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Expression #17 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'szlabpro.u.nickName' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Expression #17 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'szlabpro.u.nickName' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslato

根据报错可以得知这是因为mysql 5.7版本默认的sql配置是sql_mode=only_full_group_by导致的,所以我们只需要更改sql_mode即可

同样,在my.cnf配置文件中添加对应配置即可:

# 在[mysqld]下方添加
#设置sql模式
sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

然后重启数据库即可

最后修改:2023 年 05 月 31 日
千圣皆过影,良知乃吾师