必须显式指定configpath参数,否则checkforserverupgrade()跳过my.cnf检查;需重点校验sql_mode、default_authentication_plugin、character-set-server等配置项兼容性,避免启动失败或隐式转换异常。

util.checkForServerUpgrade() 必须带 configPath 参数
不指定配置路径,检查器默认只扫数据库对象,完全跳过 my.cnf 里的参数兼容性。你改了 20 处表结构,却漏掉一个 query_cache_type,启动时 mysqld 就会静默失败,日志里只写 unknown variable,连报错行都找不到。
正确用法是显式传入配置路径:
./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade({'configPath': '/etc/my.cnf'})"
它会识别出这些已废弃项并标为 ERROR:
-
explicit_defaults_for_timestamp(8.0 已移除语义,设了就启动失败) -
innodb_file_format(仅在 5.7 支持,8.0 不识别) -
log_warnings(已被log_error_verbosity替代)
my.cnf 中残留的 sql_mode 值会直接导致启动失败
MySQL 8.0 启动时对 sql_mode 做强校验,如果配置里还留着 NO_AUTO_CREATE_USER,进程根本起不来,报错是 Unknown system variable 'NO_AUTO_CREATE_USER',不是警告,是致命错误。
必须清理或重写整个 sql_mode 行:
- 删掉所有 8.0 已移除的 mode:如
NO_AUTO_CREATE_USER、PIPES_AS_CONCAT(除非你明确需要) - 不要直接复制 5.7 的完整值;建议从空开始,按需加:
STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION - 如果业务依赖宽松模式,宁可先设空
sql_mode=,上线后再逐步收紧
default_authentication_plugin 缺失或拼错会卡死客户端连接
8.0 默认启用 caching_sha2_password,但老 PHP、Java、Navicat 等客户端不支持该插件。如果你没在 [mysqld] 段里显式写 default_authentication_plugin=mysql_native_password,新实例一启动,所有旧连接就立刻报错:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
Client does not support authentication protocol requested by server
这不是权限问题,是协议不匹配。更麻烦的是:这个参数不写,检查器会标 WARNING,但不会拦停升级——你得自己盯住这条。
注意两个易错点:
- 必须写在
[mysqld]段下,写在[client]或[mysql]下无效 - 拼写必须全小写且一字不差:
mysql_native_password,写成mysql_native_password(多空格)或MYSQL_NATIVE_PASSWORD都会导致启动失败
字符集相关配置必须同步更新
5.7 的 character-set-server=utf8 在 8.0 里不会报错,但会触发隐式转换异常,比如插入 emoji 时被截断,或排序结果错乱。检查器会把 utf8mb3(即 utf8 别名)标为 ERROR,但不会管你写的是 utf8 还是 utf8mb4 —— 它只认字符集名本身。
所以你得手动确认并替换:
character-set-server=utf8mb4-
collation-server=utf8mb4_0900_ai_ci(8.0 默认 collation,别用utf8mb4_unicode_ci) - 如果用了
init_connect='SET NAMES utf8',也得改成utf8mb4
漏掉任意一项,应用层可能跑几天才暴露乱码,而不是启动时报错。










