升级MySQL 8+后踩过的那些坑:从崩溃到优雅迁移

坑位1:连接重置,一秒回到解放前

症状:应用启动时抛出 Communications link failure 异常,日志显示“last packet sent … was 0 ms ago”。

原因:MySQL 8默认启用更严格的连接检测机制,若网络波动或长时间空闲,会自动断开连接。

解决方案:

# 在application.properties中添加超时配置
spring.datasource.hikari.connection-timeout=30000  # 连接超时(毫秒)
spring.datasource.hikari.idle-timeout=600000   # 空闲连接超时
spring.datasource.hikari.max-lifetime=1800000  # 连接最大存活时间

坑位2:公钥检索被拒,密码加密惹的祸

症状Public Key Retrieval is not allowed 异常,应用无法连接数据库。

原因:MySQL 8默认使用 caching_sha2_password 认证插件,该插件需通过RSA加密传输密码。但JDBC驱动出于安全考虑,默认禁止主动获取公钥。

解决方案

# 方法1:临时解决方案(开发环境)
spring.datasource.url=jdbc:mysql://localhost:3306/dbname?allowPublicKeyRetrieval=true

# 方法2:永久解决方案(生产环境)
# 1. 登录MySQL
ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
# 2. 重启MySQL服务

坑位3:默认认证插件变了,密码失效?

症状:原密码突然失效,报 Access denied

原因:MySQL 8将默认认证插件从 mysql_native_password 改为 caching_sha2_password,旧密码格式不再兼容。

解决方案

-- 为用户设置新密码(使用新插件)
ALTER USER 'username'@'localhost' IDENTIFIED BY 'NEW_PASSWORD';
-- 或回滚到旧插件
ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'OLD_PASSWORD';

坑位4:时区陷阱,日期计算全乱套

症状:日期字段显示异常,如 2023-01-01 08:00:00 变成 2023-01-01 00:00:00

原因:MySQL 8默认时区设置为 SYSTEM,与应用服务器时区不一致。

解决方案

# 显式设置时区
spring.datasource.url=jdbc:mysql://localhost:3306/dbname?serverTimezone=Asia/Shanghai

坑位5:JSON函数缺失,NoSQL体验泡汤

症状:调用 JSON_OBJECT() 等函数时报错 Unknown function

原因:MySQL 8默认禁用JSON函数(出于性能考虑)。

解决方案

-- 开启JSON支持
SET GLOBAL log_bin_trust_function_creators = 1;
INSTALL PLUGIN soname 'lib_mysqludf_json.so';

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值