MySQL 5.7 到 8.0 差异详解
MySQL 5.7 到 8.0 差异详解
本文系统梳理 MySQL 5.7 与 8.0 之间的架构、功能、配置与兼容性差异,供迁移评估、升级实施与日常开发参考。
官方权威来源:Changes in MySQL 8.0
建议阅读顺序:先看 一、总览 与 十一、升级流程,再按需查阅各专题章节。
一、总览
1.1 为什么要从 5.7 升到 8.0
| 维度 | 5.7 现状 | 8.0 收益 |
|---|---|---|
| 生命周期 | 2023-10 已 EOL,无安全补丁 | LTS 长期支持 |
| 架构 | 元数据分散在 .frm、非事务系统表 |
统一事务型数据字典,DDL 原子化 |
| SQL 能力 | 无 CTE、无窗口函数 | CTE、窗口函数、CHECK 约束、函数索引等 |
| 性能 | 查询缓存(已过时) | 无查询缓存,优化器/索引能力更强 |
| 安全 | mysql_native_password 为主 |
caching_sha2_password、角色、密码策略 |
| 字符集 | 默认 latin1 |
默认 utf8mb4,原生支持 emoji 等 |
MySQL 8.0 包含 300+ 项新特性(官方完整列表)。下文按「架构 → 功能 → 配置 → 兼容性 → 升级」组织。
1.2 差异分类速查
┌─────────────────────────────────────────────────────────────┐
│ 5.7 → 8.0 差异全景 │
├──────────────┬──────────────┬──────────────┬────────────────┤
│ 架构级变更 │ 功能增强 │ 默认值变更 │ 不兼容/移除 │
├──────────────┼──────────────┼──────────────┼────────────────┤
│ 事务数据字典 │ CTE/窗口函数 │ utf8mb4 默认 │ 查询缓存移除 │
│ 原子 DDL │ 角色/密码策略 │ binlog 默认开 │ GRANT 建用户移除│
│ undo 表空间 │ 不可见索引 │ autoinc 模式 │ 分区+非InnoDB │
│ 无 mysql_upgrade│ JSON_TABLE │ 复制元数据TABLE│ 多种 SQL 模式 │
└──────────────┴──────────────┴──────────────┴────────────────┘
二、架构级变更
2.1 事务型数据字典(Transactional Data Dictionary)
5.7:表结构元数据存储在:
- 每个表对应的
.frm文件 mysql库中的 MyISAM 系统表- InnoDB 自有数据字典(与 Server 层可能不一致)
8.0:所有字典数据统一存入 InnoDB 事务表,位于 mysql.ibd 等表空间:
- 消除 Server 层与 InnoDB 层「双字典」不一致问题
- DDL 与字典更新在同一事务中完成 → 原子 DDL
.frm、.TRG、.TRN、.par等文件不再使用mysql系统库中的 grant 表也改为 InnoDB
对迁移的影响:
- 升级前必须跑 Upgrade Checker(见 十一节)
- 不支持从 8.0 官方降级回 5.7(需逻辑备份恢复)
INFORMATION_SCHEMA底层改为基于数据字典的视图;部分INNODB_SYS_*视图重命名(见 7.1 节)
2.2 原子 DDL(Atomic DDL)
8.0 将 DDL 涉及的数据字典更新、存储引擎操作、binlog 写入合并为单个事务:
-- 8.0:CREATE TABLE ... SELECT 在崩溃后不会留下「半拉子」表
CREATE TABLE new_orders AS SELECT * FROM orders WHERE status = 'pending';
5.7 中部分 DDL 在崩溃时可能导致字典与文件不一致,8.0 显著改善。
2.3 升级机制变化:不再需要 mysql_upgrade
| 5.7 | 8.0 |
|---|---|
升级后手动执行 mysql_upgrade |
服务器首次启动时自动升级系统表与字典 |
存在 mysql_upgrade_info 文件 |
该机制已废弃 |
mysql_upgrade 客户端在 8.0 中已废弃,能力内嵌到 mysqld 启动流程。
2.4 初始化方式变化
| 5.7 | 8.0 |
|---|---|
mysql_install_db |
已移除 |
| — | mysqld --initialize 或 --initialize-insecure |
三、认证与安全
3.1 默认认证插件:caching_sha2_password
5.7 默认:mysql_native_password
8.0 默认:caching_sha2_password(SHA-256 哈希 + 缓存,安全性更高)
# 8.0 新安装 / 升级后新建用户的默认行为
[mysqld]
default_authentication_plugin=caching_sha2_password # 8.0 默认
重要:从 5.7 就地升级时,已有账户的认证插件不变;只有新创建的账户才用新插件。
兼容性问题
旧客户端/驱动连接 8.0 时常见报错:
Authentication plugin 'caching_sha2_password' is not supported
解决方案(按优先级):
- 推荐:升级客户端/Connector 到支持
caching_sha2_password的版本 - 临时:在
my.cnf中改回旧插件(不推荐长期使用)
[mysqld]
default_authentication_plugin=mysql_native_password
- 单用户切换:
ALTER USER 'app_user'@'%'
IDENTIFIED WITH mysql_native_password BY 'your_password';
各 Connector 最低版本参考
| 组件 | 支持 caching_sha2_password 的最低版本 |
|---|---|
| libmysqlclient | 8.0.4+ 或 5.7.23+ |
| Connector/J | 8.0.9+ |
| Connector/NET | 8.0.10+ |
| Connector/C++ | 1.1.11+ 或 8.0.7+ |
| PHP ext/mysqli / PDO_MySQL | 需 mysqlnd 支持;老版本 PHP 可能需改回 native |
caching_sha2_password 在非安全连接上可能需要 RSA 密钥交换或 TLS;8.0 客户端默认倾向使用 SSL。
3.2 角色(Roles)
8.0 新增角色机制,用于批量管理权限:
CREATE ROLE 'app_read', 'app_write';
GRANT SELECT ON mydb.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON mydb.* TO 'app_write';
CREATE USER 'dev1'@'%' IDENTIFIED BY 'secret';
GRANT 'app_read' TO 'dev1'@'%';
SET DEFAULT ROLE ALL TO 'dev1'@'%';
5.7 无原生角色,权限只能逐用户 GRANT。
3.3 密码策略增强
validate_password插件重构为基于组件架构(插件形式仍可用但已废弃)- 密码历史:可限制不能重复使用旧密码
- 账户锁定:连续登录失败可临时锁定账户
- 默认
validate_password_check_user_name=ON(密码不能等于用户名)
3.4 已移除的账户管理写法
| 5.7 可用 | 8.0 状态 | 替代写法 |
|---|---|---|
GRANT ... ON *.* TO user IDENTIFIED BY 'pwd' |
移除 | CREATE USER + GRANT |
GRANT 修改 SSL/资源限制等非权限属性 |
移除 | CREATE USER / ALTER USER |
IDENTIFIED BY PASSWORD 'hash' |
移除 | IDENTIFIED WITH auth_plugin AS 'hash' |
PASSWORD() 函数 |
移除 | — |
old_passwords 变量 |
移除 | — |
NO_AUTO_CREATE_USER SQL 模式 |
移除 | 从 sql_mode 和 dump 中删除 |
升级阻塞项:若 my.cnf 的 sql_mode 含 NO_AUTO_CREATE_USER,8.0 将无法启动。
-- 检查并清理
SELECT @@GLOBAL.sql_mode;
-- 从配置文件中移除 NO_AUTO_CREATE_USER
3.5 其他安全变更
MYSQL_PWD环境变量传密码 → 废弃secure_auth及--secure-auth→ 移除(8.0 始终使用安全认证)--ssl/--ssl-verify-server-cert客户端选项 → 移除,改用--ssl-mode
# 5.7
mysql --ssl=1 --ssl-verify-server-cert
# 8.0
mysql --ssl-mode=VERIFY_IDENTITY
# 或 REQUIRED / DISABLED
四、字符集与排序规则
4.1 默认值变更
| 变量 | 5.7 默认 | 8.0 默认 |
|---|---|---|
character_set_server |
latin1 |
utf8mb4 |
collation_server |
latin1_swedish_ci |
utf8mb4_0900_ai_ci |
注意:
- 升级不会自动修改已有库/表/列的字符集
- 新建 schema 在未显式指定时,8.0 默认用
utf8mb4 - 主从复制场景:建议升级前先把 8.0 侧默认字符集设回 5.7 使用的值,升级完成后再切到
utf8mb4
# 若需保持 5.7 行为(临时)
[mysqld]
character_set_server=latin1
collation_server=latin1_swedish_ci
# 推荐最终目标
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_0900_ai_ci
4.2 utf8 与 utf8mb4
- MySQL 中
utf8实际是utf8mb3(最多 3 字节),不支持 emoji - 8.0 中
utf8mb3已废弃,应统一使用utf8mb4 - 8.0 新增大量 Unicode 9.0 排序规则(如
utf8mb4_0900_ai_ci)
4.3 字符集校验更严格
8.0 对字符集允许的字符检查比 5.7 更严。升级前需检查表/列/索引注释中是否含有当前字符集未定义的字符,否则升级可能失败。
五、SQL 与查询能力
5.1 公共表表达式(CTE)
8.0 支持 WITH 子句,含递归 CTE:
-- 非递归 CTE
WITH regional_sales AS (
SELECT region, SUM(amount) AS total
FROM orders
GROUP BY region
)
SELECT * FROM regional_sales WHERE total > 10000;
-- 递归 CTE:组织树
WITH RECURSIVE emp_hierarchy AS (
SELECT id, name, manager_id, 1 AS depth
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, h.depth + 1
FROM employees e
JOIN emp_hierarchy h ON e.manager_id = h.id
)
SELECT * FROM emp_hierarchy;
5.7 只能用临时表或嵌套子查询模拟,无法原生递归。
5.2 窗口函数(Window Functions)
8.0 支持 OVER() 窗口分析,无需 GROUP BY 折叠行:
SELECT
employee_id,
department,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn,
AVG(salary) OVER (PARTITION BY department) AS dept_avg,
salary - AVG(salary) OVER (PARTITION BY department) AS diff_from_avg,
LAG(salary, 1) OVER (PARTITION BY department ORDER BY hire_date) AS prev_salary
FROM employees;
专用窗口函数:RANK, DENSE_RANK, PERCENT_RANK, CUME_DIST, NTILE, ROW_NUMBER, FIRST_VALUE, LAST_VALUE, NTH_VALUE, LEAD, LAG
聚合函数也可作窗口函数:SUM, AVG, COUNT, MIN, MAX 等 + OVER()
5.3 其他重要 SQL 增强
| 特性 | 5.7 | 8.0 |
|---|---|---|
| CHECK 约束 | 解析但不强制(InnoDB 忽略) | 强制生效 |
| 表达式作 DEFAULT | 不支持 | 支持(含 BLOB/TEXT/JSON) |
| LATERAL 派生表 | 不支持 | 支持(8.0.14+) |
GROUP BY + ORDER BY/DISTINCT + ROLLUP |
有限 | 增强 |
| 降序索引 | 不支持 | CREATE INDEX ... (col DESC) |
| 函数索引 | 不支持 | 支持(基于表达式) |
| 不可见索引 | 不支持 | CREATE INDEX ... INVISIBLE |
| Index Skip Scan | 不支持 | 优化器支持 |
FOR UPDATE / FOR SHARE + NOWAIT / SKIP LOCKED |
不支持 | 支持 |
VALUES 行构造器 |
不支持 | VALUES ROW(...), ROW(...) |
| 正则函数 | REGEXP 运算符 |
+ REGEXP_LIKE/INSTR/REPLACE/SUBSTR |
| INTERSECT / EXCEPT | 不支持 | 8.0.31+ 支持 |
CHECK 约束示例
CREATE TABLE products (
id INT PRIMARY KEY,
price DECIMAL(10,2) CHECK (price > 0),
status ENUM('active','archived') DEFAULT 'active',
CONSTRAINT chk_status CHECK (status IN ('active', 'archived'))
);
不可见索引(测试删索引影响)
ALTER TABLE orders ALTER INDEX idx_customer INVISIBLE;
-- 观察查询性能后再决定 DROP
ALTER TABLE orders ALTER INDEX idx_customer VISIBLE;
5.4 SQL 行为变更(易踩坑)
| 变更 | 说明 | 应对 |
|---|---|---|
GROUP BY 不再隐式排序 |
8.0.13+ 移除 GROUP BY ... ASC/DESC |
显式写 ORDER BY |
N 不再是 NULL 别名 |
仅 LOAD/EXPORT 中 N 表 NULL |
检查依赖 N 的 SQL |
| 新保留字 | 部分词在 8.0 成为保留字 | 用反引号引用标识符 |
| 外键命名 | 8.0.0–8.0.15 行为变化,8.0.16 恢复生成名 | 勿依赖中间版本行为 |
CONVERT() 行为 |
8.0.28 修复 BINARY→字符集非法转换 | 升级前检查生成列索引 |
5.5 默认 SQL 模式
8.0 默认 sql_mode:
ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,
NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION
与 5.7 相比更严格(如除零报错、GROUP BY 非聚合列限制)。应用若依赖宽松模式,需在连接层或配置中显式设置,但不建议长期关闭 ONLY_FULL_GROUP_BY。
六、JSON 增强
| 能力 | 5.7 | 8.0 |
|---|---|---|
JSON_TABLE |
无 | 将 JSON 数组展开为关系行 |
JSON_MERGE_PATCH |
无 | 标准 JSON Merge Patch |
JSON_ARRAYAGG / JSON_OBJECTAGG |
无 | 聚合 + 窗口 |
JSON_VALUE / JSON_OVERLAPS |
无 | 新增 |
MEMBER OF 运算符 |
无 | 判断数组成员 |
| JSON 部分更新 | 全量重写 | 原地更新(InnoDB) |
| JSON Schema 校验 | 无 | CHECK (JSON_SCHEMA_VALID(...)) |
-- JSON_TABLE 示例
SELECT j.name, j.qty
FROM orders o,
JSON_TABLE(o.items, '$[*]' COLUMNS (
name VARCHAR(50) PATH '$.name',
qty INT PATH '$.qty'
)) AS j;
七、InnoDB 存储引擎
7.1 INFORMATION_SCHEMA 视图重命名
| 5.7 名称 | 8.0 名称 |
|---|---|
INNODB_SYS_COLUMNS |
INNODB_COLUMNS |
INNODB_SYS_INDEXES |
INNODB_INDEXES |
INNODB_SYS_TABLES |
INNODB_TABLES |
INNODB_SYS_TABLESPACES |
INNODB_TABLESPACES |
| … | (其余 INNODB_SYS_* 类似) |
监控脚本若引用旧视图名,升级后需修改。
7.2 Undo 表空间
| 5.7 | 8.0 |
|---|---|
| Undo log 可在系统表空间 | 必须在独立 undo 表空间 |
innodb_undo_tablespaces=0 |
默认 2,最小值 2 |
| — | 默认 innodb_undo_log_truncate=ON |
升级要求:5.7 → 8.0 前必须 slow shutdown(innodb_fast_shutdown=0),确保 undo 为空,升级时会移除旧 undo 表空间并创建新的。
7.3 其他 InnoDB 变更
- 临时表:统一放在共享临时表空间
ibtmp1 - 系统表空间:
mysql库与数据字典合并为mysql.ibd - AUTO_INCREMENT 持久化:重启后 counter 不丢失(写 redo + 系统表)
innodb_autoinc_lock_mode:默认1(连续) →2(交错);与语句复制不兼容,若仍用 statement-based replication 需改回1innodb_flush_neighbors:默认1→0(SSD 场景);机械硬盘可改回1innodb_dedicated_server:可自动按内存配置 buffer pool 等- Instant DDL:
ADD COLUMN、RENAME COLUMN等可 instant 算法(减少锁表) - Clone Plugin:物理热克隆实例(8.0.17+)
- Redo Log:8.0.30+ 用
innodb_redo_log_capacity管理,默认 32 个文件于#innodb_redo目录 - 索引长度:5.7.35 前冗余/compact 行格式索引上限 767 字节问题,升级 8.0 前需处理
7.4 压缩表与 zlib 升级
8.0 bundled zlib 1.2.11,compressBound() 估算略大。接近最大行长的 ROW_FORMAT=COMPRESSED 表,在 8.0 上 CREATE/INSERT/UPDATE 可能失败,需提前在测试环境验证。
八、复制与高可用
8.1 复制默认值变更
| 参数 | 5.7 默认 | 8.0 默认 |
|---|---|---|
log_bin |
OFF | ON |
server_id |
0 | 1 |
log_slave_updates |
OFF | ON |
expire_logs_days |
0 | 30 |
master_info_repository |
FILE | TABLE |
relay_log_info_repository |
FILE | TABLE |
transaction_write_set_extraction |
OFF | XXHASH64 |
slave_rows_search_algorithms |
INDEX_SCAN,TABLE_SCAN | INDEX_SCAN,HASH_SCAN |
复制元数据存 InnoDB 表 → 崩溃安全复制,不再依赖 relay-log.info / master.info 文件(相关选项已废弃)。
8.2 Group Replication
8.0 对 Group Replication 有一系列默认值优化(如 group_replication_autorejoin_tries=3)。若使用 GR,8.0 是推荐基线版本。
8.3 复制兼容性注意
- 5.7 → 8.0 主从:注意 binlog 中是否含已移除语法(
GRANT建用户、NO_AUTO_CREATE_USER等) caching_sha2_password复制账户需 SSL 或 RSA 密钥- 8.0.13+ 对运行时切换
binlog_format有更严限制(有临时表时不可切)
8.4 术语变更(8.0.22+)
文档与部分语法中 Master/Slave 逐步改为 Source/Replica(如 CHANGE REPLICATION SOURCE TO),旧语法仍兼容一段时间。
九、已移除功能(必须处理)
9.1 查询缓存(Query Cache)— 影响最大之一
8.0 完全移除查询缓存及相关变量:
移除:query_cache_type, query_cache_size, query_cache_limit, query_cache_min_res_unit
移除:FLUSH QUERY CACHE, RESET QUERY CACHE
移除:Qcache_* 状态变量
若 5.7 配置中 query_cache_type=1,升级前删除相关配置。性能优化应依赖 InnoDB Buffer Pool + 合理索引,而非查询缓存。
9.2 分区 + 非 InnoDB/NDB 引擎
8.0 不再提供通用分区处理器,仅 InnoDB 和 NDB 支持原生分区。
-- 升级前检查
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, CREATE_OPTIONS
FROM information_schema.TABLES
WHERE CREATE_OPTIONS LIKE '%partitioned%'
AND ENGINE NOT IN ('InnoDB', 'NDB');
需先 转为 InnoDB 或 移除分区,否则升级后表不可用。
9.3 其他移除项摘要
| 类别 | 移除内容 |
|---|---|
| 变量重命名 | tx_isolation → transaction_isolation;tx_read_only → transaction_read_only |
| 文件相关 | sync_frm(.frm 已废弃) |
| 日志 | log_warnings → 用 log_error_verbosity |
| 工具 | mysql_install_db、mysql_plugin、resolveip |
| SQL 模式 | DB2, MAXDB, MSSQL, ORACLE, POSTGRESQL, MYSQL323, MYSQL40 等 |
| 空间函数 | 无 ST_/MBR 前缀的旧函数名 |
| 复制 | innodb_locks_unsafe_for_binlog |
| GIS | 部分旧空间函数命名空间变更 |
9.4 sql_log_bin 作用域
@@GLOBAL.sql_log_bin 移除,仅保留 SESSION 作用域。依赖全局关闭 binlog 的应用需调整。
十、废弃功能(仍可用,勿新用)
| 项目 | 说明 |
|---|---|
utf8mb3 / utf8 |
改用 utf8mb4 |
sha256_password |
由 caching_sha2_password 取代 |
validate_password 插件形式 |
改用组件 |
FLOAT/DOUBLE 的 AUTO_INCREMENT |
改用整型 |
FLOAT(M,D) / DOUBLE(M,D) 非标准语法 |
废弃 |
&& || ! 作为 AND/OR/NOT |
改用标准 SQL 运算符 |
mysql_upgrade |
能力已内嵌 |
PAD_CHAR_TO_FULL_LENGTH SQL 模式 |
废弃 |
AUTO_INCREMENT on FLOAT/DOUBLE |
废弃 |
十一、升级流程与检查清单
11.1 支持的路径
MySQL 5.7 GA ──就地升级──▶ MySQL 8.0 GA
│
└──逻辑迁移(mysqldump / mydumper / 复制切换)──▶ 8.0 新实例
- 仅支持 GA → GA 升级,不支持从 5.7 非 GA 直接升
- 不支持官方就地降级 8.0 → 5.7
11.2 Upgrade Checker(必做)
使用 MySQL Shell 在升级前扫描不兼容项:
mysqlsh root@localhost:3306 -- util checkForServerUpgrade \
--target-version=8.0.40 \
--config-path=/etc/my.cnf
输出分 Error(必须修复)和 Warning(建议修复)。常见 Error:
- 非 InnoDB/NDB 的分区表
sql_mode含已移除模式- 使用了已移除的空间函数
- 字符集注释非法字符
11.3 推荐升级步骤
1. 全量备份(物理 + 逻辑)
2. 在 staging 复现生产配置,跑 Upgrade Checker
3. 修复所有 Error;评估 Warning
4. 5.7 上执行 slow shutdown:
SET GLOBAL innodb_fast_shutdown = 0;
-- 停库
5. 替换二进制 / 包,保留数据目录
6. 首次启动 8.0(自动升级字典,可能较慢)
7. 跑 mysqlcheck --all-databases
8. 验证应用连接、核心 SQL、复制链路
9. 性能基准对比(关键慢查询)
11.4 升级前检查清单
十二、服务器默认值对照表
12.1 服务器级
| 参数 | 5.7 默认 | 8.0 默认 | 备注 |
|---|---|---|---|
character_set_server |
latin1 | utf8mb4 | 仅影响新建 schema |
collation_server |
latin1_swedish_ci | utf8mb4_0900_ai_ci | |
explicit_defaults_for_timestamp |
OFF | ON | TIMESTAMP 行为更贴近标准 |
max_allowed_packet |
4MB | 64MB | |
event_scheduler |
OFF | ON | |
local_infile |
ON | OFF | 安全加固 |
table_open_cache |
2000 | 4000 | |
log_error_verbosity |
3 | 2 | 错误日志默认更少 Notes |
back_log |
50+max_conn/5 | max_connections |
12.2 InnoDB
| 参数 | 5.7 默认 | 8.0 默认 | 备注 |
|---|---|---|---|
innodb_undo_tablespaces |
0 | 2 | 不可回退 |
innodb_undo_log_truncate |
OFF | ON | |
innodb_autoinc_lock_mode |
1 | 2 | 语句复制需改回 1 |
innodb_flush_neighbors |
1 | 0 | HDD 可改回 1 |
innodb_max_dirty_pages_pct |
75 | 90 | |
innodb_max_dirty_pages_pct_lwm |
0 | 10 |
12.3 复制
见 8.1 节。
十三、应用与驱动适配
13.1 JDBC(Connector/J)
<!-- pom.xml:使用 8.0.x 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4
# 若仍用 mysql_native_password:
# spring.datasource.url=...&defaultAuthenticationPlugin=com.mysql.cj.protocol.a.authentication.MysqlNativePasswordPlugin
13.2 连接池
- HikariCP / Druid 等需使用 8.0 兼容的 MySQL 驱动
- 注意
serverTimezone(8.0 驱动默认更严格)
13.3 ORM 框架
- Hibernate / MyBatis:一般无大改,注意方言与
sql_mode - Flyway / Liquibase:迁移脚本中避免已移除语法
十四、性能与运维
14.1 预期性能变化
- 查询缓存移除:读多且重复查询场景可能需应用层缓存(Redis 等)
- 优化器增强:histograms、index skip scan、更好的 cost model
EXPLAIN ANALYZE(8.0.18+):实际执行统计- Resource Groups:将线程绑定到 CPU 资源组
14.2 持久化配置
-- 8.0:重启后仍生效,无需改 my.cnf
SET PERSIST max_connections = 500;
SET PERSIST_ONLY slow_query_log = ON; -- 仅写入 mysqld-auto.cnf,不立即生效
14.3 备份锁
-- 8.0:在线备份期间允许 DML,阻止 DDL
LOCK INSTANCE FOR BACKUP;
-- ... 备份 ...
UNLOCK INSTANCE;
需 BACKUP_ADMIN 权限。
14.4 表加密
default_table_encryption 可全局默认加密新表;table_encryption_privilege_check 强制检查。
十五、常见问题 FAQ
Q1:升级后应用连不上数据库?
优先查认证插件与驱动版本。临时方案:default_authentication_plugin=mysql_native_password 或对应用用户 ALTER USER ... mysql_native_password。
Q2:升级后中文乱码?
升级不改变已有表字符集。检查连接串 characterEncoding、表实际 charset,以及是否误用 utf8(utf8mb3)。
Q3:GROUP BY 报错 ONLY_FULL_GROUP_BY?
8.0 默认开启。修正 SQL(SELECT 列都在 GROUP BY 或聚合中),或会话级调整(不推荐生产长期关闭)。
Q4:能否 8.0 降回 5.7?
官方不支持就地降级。只能用 5.7 时代逻辑备份恢复,或从 5.7 replica 重新切换。
Q5:Docker 镜像怎么选?
mysql:5.7 # EOL,仅遗留系统
mysql:8.0 # 推荐 LTS 目标
mysql:8.4 # 新 LTS 线
Q6:分区表用的 MyISAM 怎么办?
ALTER TABLE t ENGINE=InnoDB; -- 或移除分区
浙公网安备 33010602011771号