mysql 5.7 升级到 8.0 后,my.cnf 中必须显式配置的参数包括:default_authentication_plugin=mysql_native_password、sql_mode=no_engine_substitution、local_infile=on、character_set_server=utf8mb4、collation_server=utf8mb4_0900_ai_ci,并需移除已废弃的 innodb_file_format、innodb_large_prefix、query_cache_type 等参数,否则会导致启动失败或连接异常。

my.cnf里必须显式配置的几个参数
MySQL 5.7 升级到 8.0 后,很多参数默认值变了,不手动覆盖会导致应用连不上、查不出数据、甚至启动失败。这些不是“可选优化项”,而是上线前必须核对的硬性配置。
-
default_authentication_plugin=mysql_native_password:8.0 默认用caching_sha2_password,但老 PHP(mysqlnd )、旧 JDBC 驱动直接报 <code>Authentication plugin 'caching_sha2_password' cannot be loaded;加这一行后,新用户也走旧插件,避免逐个ALTER USER -
sql_mode要重设:8.0 默认启用STRICT_TRANS_TABLES,而 5.7 可能没开——原来能插入的空字符串、超长截断数据,升级后全变ERROR 1364;建议先设成sql_mode=NO_ENGINE_SUBSTITUTION过渡,再逐步清理业务 SQL -
local_infile=ON:5.7 默认开启,8.0 默认OFF,否则LOAD DATA LOCAL INFILE直接报ERROR 3948;注意还要配好secure_file_priv路径,否则即使开也无效 -
character_set_server=utf8mb4和collation_server=utf8mb4_0900_ai_ci:8.0 默认字符集已切到utf8mb4,但旧表不会自动转换;显式设这两项能确保新建库/表用新规则,避免中文乱码或排序异常
已废弃但残留会引发启动失败的参数
升级后如果 mysqld 启不来,别急着查日志开头,先 grep my.cnf 里有没有这些词——它们在 8.0 中已被移除,保留就会报错退出。
-
innodb_file_format和innodb_large_prefix:这两个在 8.0 中完全废弃,对应逻辑由innodb_file_per_table=ON和页大小隐式控制;若配置文件里还留着,启动时直接拒绝加载 -
query_cache_type和query_cache_size:8.0 彻底移除了查询缓存,这两个参数一出现就报Unknown system variable,服务起不来 -
log_bin_trust_function_creators:虽然不致命,但 8.0 对函数安全要求更严,建议配合log_error_verbosity=3一起开,方便定位存储过程报错原因
systemd 启动依赖必须补上的库
CentOS 7 系统上装完 8.0 二进制包,systemctl start mysqld 报 Failed to start mysqld.service: Unit not found 或 error while loading shared libraries: libatomic.so.1?不是配置问题,是缺底层依赖。
- 确认系统版本:
cat /etc/redhat-release必须是 CentOS 7+;CentOS 6 的glibc版本太低,会卡在/lib64/libc.so.6: version `GLIBC_2.18' not found - 装
libatomic:yum install libatomic(某些云厂商镜像默认没装);不装的话,mysqld 进程根本拉不起来,不是配置错,是链接失败 - 检查文件系统:
mount | grep "$(df . | tail -1 | awk '{print $1}')" | grep -o 'xfs\|ext4';ext3 或未开barrier=1的 xfs 会导致InnoDB: Assertion failure崩溃,不能只看 MySQL 日志
升级后第一件事:检查 sql_mode 和字符集是否生效
改完 my.cnf 重启,不代表参数就真生效了——8.0 会按优先级覆盖:配置文件
- 验证方式:
mysql -u root -p -e "SELECT @@sql_mode, @@character_set_server, @@collation_server;";输出必须和 my.cnf 里写的完全一致,不能有遗漏项 - 特别注意
NO_AUTO_CREATE_USER:它在 8.0 中已被移除,如果旧配置里还带着,mysqld 启动时会静默忽略整段sql_mode设置,导致实际生效的是默认严格模式 - 客户端连接也要配:JDBC URL 加
?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false,否则 caching_sha2_password 握手可能卡住;PHP 用mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10)避免超时误判
default_authentication_plugin 不配,连不上;连不上就跑不了 ALTER USER;不跑 ALTER USER,老应用就集体报错。顺序和依赖关系比单个参数更重要。











