1. 首页 > MySQL教程 > 正文

MySQL教程FG264-MySQL 8.4常见问题

本文档风哥主要介绍MySQL 8.4版本中常见的问题和解决方案,包括升级问题、兼容性问题、性能问题、连接问题等,风哥教程参考MySQL官方文档FAQ章节,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 MySQL 8.4常见问题概述

MySQL 8.4作为长期支持版本(LTS),引入了许多新特性,同时也带来了一些常见问题:

# MySQL 8.4常见问题概述

1. 问题分类

安装和升级问题:
– 版本升级兼容性
– 数据迁移问题
– 配置文件变更

连接和认证问题:
– 认证插件变更
– SSL/TLS配置
– 连接超时

SQL和语法问题:
– 保留字变更
– 语法变更
– 函数变更

性能问题:
– 查询性能下降
– 内存使用增加
– 锁等待问题

复制问题:
– GTID复制问题
– 复制延迟
– 数据一致性

2. MySQL 8.4版本特性

查看版本信息:
mysql> SELECT VERSION();

输出示例:
+———–+
| VERSION() |
+———–+
| 8.4.0 |
+———–+

查看版本注释:
mysql> SHOW VARIABLES LIKE ‘version_comment’;

输出示例:
+—————–+——————————+
| Variable_name | Value |
+—————–+——————————+
| version_comment | MySQL Community Server – GPL |
+—————–+——————————+

3. 新特性概览

MySQL 8.4主要新特性:
– 改进的InnoDB存储引擎
– 增强的JSON支持
– 优化的查询执行器
– 改进的复制功能
– 增强的安全特性
– 性能模式改进

查看支持的特性:
mysql> SHOW VARIABLES LIKE ‘%innodb%’;

输出示例:
+——————————————+—————-+
| Variable_name | Value |
+——————————————+—————-+
| innodb_version | 8.4.0 |
| innodb_buffer_pool_size | 134217728 |
| innodb_log_file_size | 50331648 |
+——————————————+—————-+

4. 问题排查流程

标准排查流程:
1. 确认问题现象
2. 收集错误日志
3. 检查系统状态
4. 分析配置参数
5. 查看性能指标
6. 定位问题原因
7. 制定解决方案

查看错误日志:
mysql> SHOW VARIABLES LIKE ‘log_error’;

输出示例:
+—————+————————–+
| Variable_name | Value |
+—————+————————–+
| log_error | /var/log/mysql/error.log |
+—————+————————–+

查看错误日志内容:
tail -100 /var/log/mysql/error.log

输出示例:
2026-04-01T12:00:00.123456Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.4.0) starting as process 1234
2026-04-01T12:00:01.234567Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2026-04-01T12:00:02.345678Z 0 [System] [MY-013576] [InnoDB] InnoDB initialization has started.

1.2 版本变更说明

MySQL 8.4相比之前版本有一些重要变更:

# 版本变更说明

1. 认证插件变更

MySQL 8.4默认认证插件:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_TYPE
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE ‘%auth%’;

输出示例:
+———————–+—————+———————–+
| PLUGIN_NAME | PLUGIN_STATUS | PLUGIN_TYPE |
+———————–+—————+———————–+
| caching_sha2_password | ACTIVE | AUTHENTICATION |
| mysql_native_password | ACTIVE | AUTHENTICATION |
+———————–+—————+———————–+

默认认证方式:
mysql> SHOW VARIABLES LIKE ‘default_authentication_plugin’;

输出示例:
+——————————-+———————–+
| Variable_name | Value |
+——————————-+———————–+
| default_authentication_plugin | caching_sha2_password |
+——————————-+———————–+

修改默认认证方式:
# 在my.cnf中配置
[mysqld]
default_authentication_plugin=mysql_native_password

# 或运行时修改
mysql> SET GLOBAL default_authentication_plugin=’mysql_native_password’;

输出示例:
Query OK, 0 rows affected, 1 warning (0.00 sec)

2. 字符集变更

默认字符集:
mysql> SHOW VARIABLES LIKE ‘character_set_server’;

输出示例:
+———————-+———+
| Variable_name | Value |
+———————-+———+
| character_set_server | utf8mb4 |
+———————-+———+

默认排序规则:
mysql> SHOW VARIABLES LIKE ‘collation_server’;

输出示例:
+——————+——————–+
| Variable_name | Value |
+——————+——————–+
| collation_server | utf8mb4_0900_ai_ci |
+——————+——————–+

3. SQL模式变更

查看SQL模式:
mysql> SELECT @@sql_mode;

输出示例:
+———————————————————————————————————————–+
| @@sql_mode |
+———————————————————————————————————————–+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+———————————————————————————————————————–+

修改SQL模式:
mysql> SET GLOBAL sql_mode=’STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION’;

输出示例:
Query OK, 0 rows affected (0.00 sec)

4. 废弃参数变更

查看废弃参数警告:
mysql> SHOW WARNINGS;

输出示例:
+———+——+——————————————————————+
| Level | Code | Message |
+———+——+——————————————————————+
| Warning | 1287 | ‘default_authentication_plugin’ is deprecated |
+———+——+——————————————————————+

查看所有废弃参数:
mysql> SELECT VARIABLE_NAME, VARIABLE_SOURCE
FROM PERFORMANCE_SCHEMA.VARIABLES_INFO
WHERE VARIABLE_SOURCE = ‘DEPRECATED’;

输出示例:
+——————————-+——————+
| VARIABLE_NAME | VARIABLE_SOURCE |
+——————————-+——————+
| query_cache_size | DEPRECATED |
| query_cache_type | DEPRECATED |
+——————————-+——————+

1.3 废弃功能列表

MySQL 8.4废弃了一些旧功能,需要了解这些变更:

# 废弃功能列表

1. 查询缓存

查询缓存已完全移除:
mysql> SHOW VARIABLES LIKE ‘query_cache%’;

输出示例:
Empty set (0.00 sec)

替代方案:
– 使用应用层缓存
– 使用外部缓存系统(Redis、Memcached)
– 优化查询和索引

2. 旧版认证插件

mysql_old_password插件已移除:
mysql> SELECT PLUGIN_NAME FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME = ‘mysql_old_password’;

输出示例:
Empty set (0.00 sec)

解决方案:
– 使用caching_sha2_password
– 使用mysql_native_password

3. 废弃的SQL语法

废弃的语法:
– PROCEDURE ANALYSE()
– JSON_MERGE()(使用JSON_MERGE_PRESERVE())
– SQL_CACHE/SQL_NO_CACHE

示例:
mysql> SELECT * FROM users PROCEDURE ANALYSE();

输出示例:
ERROR 1305 (42000): PROCEDURE ANALYSE does not exist

4. 废弃的系统变量

废弃变量列表:
+——————————-+——————+
| 变量名称 | 替代方案 |
+——————————-+——————+
| query_cache_size | 应用层缓存 |
| query_cache_type | 应用层缓存 |
| innodb_locks_unsafe_for_binlog| 使用READ COMMITTED|
| innodb_stats_sample_pages | innodb_stats_persistent_sample_pages|
+——————————-+——————+

查看废弃警告:
grep -i deprecated /var/log/mysql/error.log

输出示例:
2026-04-01T12:00:00.000000Z 0 [Warning] [MY-013360] [Server] Plugin ‘query_cache’ is deprecated.

Part02-生产环境规划与建议

2.1 升级常见问题

从旧版本升级到MySQL 8.4时常见的问题:

# 升级常见问题

1. 升级前检查

运行升级检查工具:
mysqlsh user@localhost -e “util.checkForServerUpgrade()”

输出示例:
{
“serverAddress”: “localhost:3306”,
“serverVersion”: “5.7.40”,
“targetVersion”: “8.4.0”,
“checks”: [
{
“id”: “checkAuthMethods”,
“title”: “Authentication Methods”,
“status”: “OK”,
“description”: “No issues found”
},
{
“id”: “checkSchemaChanges”,
“title”: “Schema Changes”,
“status”: “Warning”,
“description”: “Some tables need to be rebuilt”
}
]
}

2. 数据字典升级

升级数据字典:
# 使用mysqld –upgrade启动
mysqld –upgrade

输出示例:
2026-04-01T12:00:00.000000Z 0 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2026-04-01T12:00:01.000000Z 0 [System] [MY-013587] [Server] Data dictionary upgrade started.
2026-04-01T12:00:05.000000Z 0 [System] [MY-013588] [Server] Data dictionary upgrade completed.

3. 表结构升级

检查需要重建的表:
mysql> SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE = ‘MyISAM’;

输出示例:
+————–+————+——–+
| TABLE_SCHEMA | TABLE_NAME | ENGINE |
+————–+————+——–+
| old_db | old_table | MyISAM |
+————–+————+——–+

转换存储引擎:
mysql> ALTER TABLE old_db.old_table ENGINE=InnoDB;

输出示例:
Query OK, 1000 rows affected (2.34 sec)

4. 用户权限升级

检查用户认证方式:
mysql> SELECT USER, HOST, PLUGIN
FROM mysql.user;

输出示例:
+——————+———–+———————–+
| USER | HOST | PLUGIN |
+——————+———–+———————–+
| root | localhost | caching_sha2_password |
| app_user | % | mysql_native_password |
+——————+———–+———————–+

更新用户认证方式:
mysql> ALTER USER ‘app_user’@’%’ IDENTIFIED WITH caching_sha2_password BY ‘new_password’;

输出示例:
Query OK, 0 rows affected (0.01 sec)

5. 升级后验证

检查升级状态:
mysql> SHOW VARIABLES LIKE ‘version%’;

输出示例:
+————————-+——————————+
| Variable_name | Value |
+————————-+——————————+
| version | 8.4.0 |
| version_comment | MySQL Community Server – GPL |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
+————————-+——————————+

检查所有表:
mysqlcheck –all-databases –check

输出示例:
mysql.columns_priv OK
mysql.db OK
mysql.event OK

production_db.orders OK
production_db.users OK

2.2 兼容性问题

MySQL 8.4与旧版本的兼容性问题:

# 兼容性问题

1. 认证兼容性问题

问题:客户端不支持caching_sha2_password

错误示例:
ERROR 2059 (HY000): Authentication plugin ‘caching_sha2_password’ cannot be loaded

解决方案1:修改用户认证方式
mysql> ALTER USER ‘app_user’@’%’ IDENTIFIED WITH mysql_native_password BY ‘password’;

输出示例:
Query OK, 0 rows affected (0.01 sec)

解决方案2:更新客户端驱动
# 更新MySQL Connector/J
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.4.0.tar.gz

解决方案3:配置默认认证插件
[mysqld]
default_authentication_plugin=mysql_native_password

2. 字符集兼容性问题

问题:utf8mb4字符集问题

检查字符集:
mysql> SHOW CREATE TABLE users\G

输出示例:
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

修改字符集:
mysql> ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

输出示例:
Query OK, 1000 rows affected (0.50 sec)

3. SQL语法兼容性问题

问题:GROUP BY语法变更

错误示例:
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause

问题SQL:
SELECT name, COUNT(*) FROM users GROUP BY name;

解决方案1:修改SQL
SELECT name, COUNT(*) FROM users GROUP BY name;

解决方案2:修改SQL模式
mysql> SET SESSION sql_mode=’STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION’;

输出示例:
Query OK, 0 rows affected (0.00 sec)

4. 保留字兼容性问题

问题:使用新保留字作为标识符

MySQL 8.4新增保留字:
– GROUPS
– LAG
– LEAD
– RANK
– DENSE_RANK

错误示例:
mysql> CREATE TABLE groups (id INT, name VARCHAR(100));

输出示例:
ERROR 1064 (42000): You have an error in your SQL syntax

解决方案:使用反引号
mysql> CREATE TABLE `groups` (id INT, name VARCHAR(100));

输出示例:
Query OK, 0 rows affected (0.02 sec)

5. 函数兼容性问题

问题:废弃函数替换

废弃函数及替代:
+————————+————————+
| 废弃函数 | 替代函数 |
+————————+————————+
| JSON_MERGE() | JSON_MERGE_PRESERVE() |
| JSON_ARRAY_APPEND() | JSON_ARRAY_APPEND() |
+————————+————————+

示例:
mysql> SELECT JSON_MERGE(‘{“a”:1}’, ‘{“b”:2}’);

输出示例:
ERROR 1305 (42000): FUNCTION JSON_MERGE does not exist

正确用法:
mysql> SELECT JSON_MERGE_PRESERVE(‘{“a”:1}’, ‘{“b”:2}’);

输出示例:
+——————————————–+
| JSON_MERGE_PRESERVE(‘{“a”:1}’, ‘{“b”:2}’) |
+——————————————–+
| {“a”: 1, “b”: 2} |
+——————————————–+

2.3 性能问题

MySQL 8.4中常见的性能问题:

# 性能问题

1. 查询性能下降

问题:升级后查询变慢

分析执行计划:
mysql> EXPLAIN SELECT * FROM orders WHERE status = ‘pending’\G

输出示例:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: orders
partitions: NULL
type: ALL
possible_keys: idx_status
key: NULL
key_len: NULL
ref: NULL
rows: 1000000
filtered: 10.00
Extra: Using where

解决方案:更新统计信息
mysql> ANALYZE TABLE orders;

输出示例:
+——————-+———+———-+———-+
| Table | Op | Msg_type | Msg_text |
+——————-+———+———-+———-+
| production_db.orders | analyze | status | OK |
+——————-+———+———-+———-+

2. 内存使用增加

问题:内存使用量增加

查看内存使用:
mysql> SELECT EVENT_NAME, CURRENT_NUMBER_OF_BYTES_USED/1024/1024 AS MB
FROM performance_schema.memory_summary_global_by_event_name
ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC
LIMIT 10;

输出示例:
+——————————————-+———-+
| EVENT_NAME | MB |
+——————————————-+———-+
| memory/innodb/buf_buf_pool | 128.00 |
| memory/performance_schema/events_statements| 30.00 |
+——————————————-+———-+

调整缓冲池:
mysql> SET GLOBAL innodb_buffer_pool_size = 1073741824;

输出示例:
Query OK, 0 rows affected (0.00 sec)

3. 锁等待问题

问题:锁等待超时

查看锁等待:
mysql> SELECT * FROM sys.innodb_lock_waits\G

输出示例:
*************************** 1. row ***************************
wait_started: 2026-04-01 12:00:00
wait_age: 00:00:05
wait_age_secs: 5
locked_table: `production_db`.`orders`
locked_index: PRIMARY
locked_type: RECORD
waiting_trx_id: 12345
waiting_trx_started: 2026-04-01 11:59:55
waiting_trx_age: 00:00:10
waiting_trx_rows_locked: 1
waiting_trx_rows_modified: 0
waiting_pid: 10
waiting_query: UPDATE orders SET status = ‘processing’ WHERE id = 1
waiting_lock_mode: X
blocking_trx_id: 12344
blocking_pid: 5
blocking_query: UPDATE orders SET status = ‘pending’ WHERE id = 1
blocking_lock_mode: X

解决方案:终止阻塞事务
mysql> KILL QUERY 5;

输出示例:
Query OK, 0 rows affected (0.00 sec)

4. 连接池问题

问题:连接数过多

查看连接状态:
mysql> SHOW STATUS LIKE ‘Threads%’;

输出示例:
+——————-+——-+
| Variable_name | Value |
+——————-+——-+
| Threads_cached | 10 |
| Threads_connected | 50 |
| Threads_created | 100 |
| Threads_running | 10 |
+——————-+——-+

调整连接参数:
mysql> SET GLOBAL max_connections = 500;
mysql> SET GLOBAL thread_cache_size = 50;

输出示例:
Query OK, 0 rows affected (0.00 sec)

Part03-生产环境项目实施方案

3.1 连接问题解决

MySQL 8.4中常见的连接问题及解决方案:

# 连接问题解决

# 问题1:连接被拒绝

# 错误信息:
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (111)

# 排查步骤:
# 1. 检查MySQL服务状态
systemctl status mysqld

# 输出示例:
# Active: active (running) since 2026-04-01 12:00:00 CST

# 2. 检查端口监听
netstat -tlnp | grep 3306

# 输出示例:
# tcp6 0 0 :::3306 :::* LISTEN 1234/mysqld

# 3. 检查防火墙
firewall-cmd –list-ports

# 输出示例:
# 3306/tcp

# 4. 检查绑定地址
mysql> SHOW VARIABLES LIKE ‘bind_address’;

# 输出示例:
# +—————+——-+
# | Variable_name | Value |
# +—————+——-+
# | bind_address | * |
# +—————+——-+

# 问题2:认证失败

# 错误信息:
ERROR 1045 (28000): Access denied for user ‘app_user’@’localhost’ (using password: YES)

# 排查步骤:
# 1. 检查用户是否存在
mysql> SELECT USER, HOST FROM mysql.user WHERE USER=’app_user’;

# 输出示例:
# +———-+——+
# | USER | HOST |
# +———-+——+
# | app_user | % |
# +———-+——+

# 2. 重置密码
mysql> ALTER USER ‘app_user’@’%’ IDENTIFIED BY ‘new_password’;

# 输出示例:
# Query OK, 0 rows affected (0.01 sec)

# 3. 刷新权限
mysql> FLUSH PRIVILEGES;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 问题3:连接超时

# 错误信息:
ERROR 2006 (HY000): MySQL server has gone away

# 排查步骤:
# 1. 检查超时设置
mysql> SHOW VARIABLES LIKE ‘%timeout%’;

# 输出示例:
# +—————————–+———-+
# | Variable_name | Value |
# +—————————–+———-+
# | connect_timeout | 10 |
# | wait_timeout | 28800 |
# | interactive_timeout | 28800 |
# +—————————–+———-+

# 2. 调整超时参数
mysql> SET GLOBAL wait_timeout = 86400;
mysql> SET GLOBAL interactive_timeout = 86400;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 问题4:SSL连接问题

# 错误信息:
ERROR 2026 (HY000): SSL connection error: SSL is required but the server doesn’t support it

# 解决方案:
# 1. 检查SSL配置
mysql> SHOW VARIABLES LIKE ‘%ssl%’;

# 输出示例:
# +—————+—————–+
# | Variable_name | Value |
# +—————+—————–+
# | have_ssl | YES |
# | ssl_ca | /path/to/ca.pem |
# | ssl_cert | /path/to/cert.pem|
# | ssl_key | /path/to/key.pem|
# +—————+—————–+

# 2. 禁用SSL连接
mysql -u user -p –ssl-mode=DISABLED

# 输出示例:
# Welcome to the MySQL monitor.

3.2 SQL问题解决

MySQL 8.4中常见的SQL问题及解决方案:

# SQL问题解决

# 问题1:GROUP BY错误

# 错误信息:
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause

# 问题SQL:
SELECT id, name, COUNT(*) FROM orders GROUP BY id;

# 解决方案1:修改SQL
SELECT id, name, COUNT(*) FROM orders GROUP BY id, name;

# 输出示例:
# +—-+——+———-+
# | id | name | COUNT(*) |
# +—-+——+———-+
# | 1 | A | 10 |
# | 2 | B | 20 |
# +—-+——+———-+

# 解决方案2:使用ANY_VALUE()
SELECT id, ANY_VALUE(name), COUNT(*) FROM orders GROUP BY id;

# 输出示例:
# +—-+————–+———-+
# | id | ANY_VALUE(name)| COUNT(*)|
# +—-+————–+———-+
# | 1 | A | 10 |
# +—-+————–+———-+

# 问题2:ONLY_FULL_GROUP_BY模式

# 检查SQL模式:
mysql> SELECT @@sql_mode;

# 输出示例:
# ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,…

# 临时禁用:
mysql> SET SESSION sql_mode=’STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION’;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 问题3:日期函数问题

# 错误信息:
ERROR 1292 (22007): Incorrect datetime value: ‘0000-00-00′

# 解决方案:
# 1. 检查SQL模式
mysql> SELECT @@sql_mode;

# 输出示例:
# NO_ZERO_IN_DATE,NO_ZERO_DATE,…

# 2. 允许零日期
mysql> SET SESSION sql_mode=’STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION’;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 问题4:JSON函数问题

# 错误信息:
ERROR 3141 (22032): Invalid JSON text in argument 1 to function json_extract

# 检查JSON格式:
mysql> SELECT JSON_VALID(‘{“name”:”test”}’);

# 输出示例:
# +——————————+
# | JSON_VALID(‘{“name”:”test”}’)|
# +——————————+
# | 1 |
# +——————————+

# 正确使用JSON函数:
mysql> SELECT JSON_EXTRACT(‘{“name”:”test”}’, ‘$.name’);

# 输出示例:
# +——————————————+
# | JSON_EXTRACT(‘{“name”:”test”}’, ‘$.name’)|
# +——————————————+
# | “test” |
# +——————————————+

3.3 复制问题解决

MySQL 8.4中常见的复制问题及解决方案:

# 复制问题解决

# 问题1:复制中断

# 检查复制状态:
mysql> SHOW REPLICA STATUS\G

# 输出示例:
# *************************** 1. row ***************************
# Replica_IO_State: Waiting for source to send event
# Source_Host: 192.168.1.100
# Source_User: repl
# Source_Port: 3306
# Connect_Retry: 60
# Replica_IO_Running: Yes
# Replica_SQL_Running: No
# Last_SQL_Error: Error ‘Duplicate entry ‘1’ for key ‘PRIMARY” on query

# 解决方案:跳过错误
mysql> STOP REPLICA;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START REPLICA;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 问题2:复制延迟

# 检查延迟:
mysql> SHOW REPLICA STATUS\G

# 输出示例:
# Seconds_Behind_Source: 300

# 解决方案:
# 1. 检查网络延迟
ping source-server

# 输出示例:
# 64 bytes from source-server: time=0.123 ms

# 2. 检查从库性能
mysql> SHOW PROCESSLIST;

# 输出示例:
# +—-+————-+———–+——+———+——+———————————-+
# | Id | User | Host | db | Command | Time | State |
# +—-+————-+———–+——+———+——+———————————-+
# | 5 | system user | | NULL | Connect | 300 | Waiting for dependent transaction|
# +—-+————-+———–+——+———+——+———————————-+

# 3. 启用多线程复制
mysql> STOP REPLICA;
mysql> SET GLOBAL replica_parallel_workers = 4;
mysql> START REPLICA;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 问题3:GTID复制问题

# 错误信息:
ERROR 1777 (HY000): CHANGE MASTER TO cannot be used when the server has GTID_MODE = ON

# 解决方案:
# 1. 检查GTID模式
mysql> SHOW VARIABLES LIKE ‘gtid_mode’;

# 输出示例:
# +—————+——-+
# | Variable_name | Value |
# +—————+——-+
# | gtid_mode | ON |
# +—————+——-+

# 2. 正确配置GTID复制
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST=’192.168.1.100′,
SOURCE_USER=’repl’,
SOURCE_PASSWORD=’password’,
SOURCE_AUTO_POSITION=1;

# 输出示例:
# Query OK, 0 rows affected (0.01 sec)

# 问题4:复制用户权限问题

# 错误信息:
ERROR 1227 (42000): Access denied; you need (at least one of) the REPLICATION SLAVE privilege(s)

# 解决方案:
# 在主库创建复制用户
mysql> CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘password’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
mysql> FLUSH PRIVILEGES;

# 输出示例:
# Query OK, 0 rows affected (0.01 sec)

Part04-生产案例与实战讲解

4.1 认证问题案例

以下是MySQL 8.4认证问题的实战案例:

# 认证问题案例

# 案例1:caching_sha2_password认证失败

# 问题描述:
# 应用程序无法连接MySQL 8.4,报认证插件错误

# 错误信息:
ERROR 2059 (HY000): Authentication plugin ‘caching_sha2_password’ cannot be loaded

# 排查步骤:
# 1. 检查用户认证方式
mysql> SELECT USER, HOST, PLUGIN FROM mysql.user WHERE USER=’app_user’;

# 输出示例:
# +———-+——+———————–+
# | USER | HOST | PLUGIN |
# +———-+——+———————–+
# | app_user | % | caching_sha2_password |
# +———-+——+———————–+

# 2. 检查客户端驱动版本
# MySQL Connector/J 5.1.x 不支持 caching_sha2_password
# 需要升级到 8.0.x 版本

# 解决方案1:修改用户认证方式
mysql> ALTER USER ‘app_user’@’%’
IDENTIFIED WITH mysql_native_password
BY ‘password’;

# 输出示例:
# Query OK, 0 rows affected (0.01 sec)

# 解决方案2:升级客户端驱动
# 下载最新驱动
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.4.0.tar.gz

# 解压并替换
tar -xzf mysql-connector-j-8.4.0.tar.gz
cp mysql-connector-j-8.4.0/mysql-connector-j-8.4.0.jar /path/to/app/lib/

# 案例2:密码过期问题

# 问题描述:
# 用户登录时提示密码过期

# 错误信息:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement

# 排查步骤:
# 1. 检查密码策略
mysql> SHOW VARIABLES LIKE ‘default_password_lifetime’;

# 输出示例:
# +—————————+——-+
# | Variable_name | Value |
# +—————————+——-+
# | default_password_lifetime | 360 |
# +—————————+——-+

# 2. 检查用户密码状态
mysql> SELECT USER, HOST, PASSWORD_EXPIRED, PASSWORD_LAST_CHANGED
FROM mysql.user WHERE USER=’app_user’;

# 输出示例:
# +———-+——+——————+———————–+
# | USER | HOST | PASSWORD_EXPIRED | PASSWORD_LAST_CHANGED |
# +———-+——+——————+———————–+
# | app_user | % | Y | 2025-04-01 12:00:00 |
# +———-+——+——————+———————–+

# 解决方案:重置密码
mysql> ALTER USER ‘app_user’@’%’ IDENTIFIED BY ‘new_password’;

# 输出示例:
# Query OK, 0 rows affected (0.01 sec)

# 案例3:SSL连接问题

# 问题描述:
# 客户端无法使用SSL连接

# 错误信息:
ERROR 2026 (HY000): SSL connection error: SSL certificate validation failure

# 排查步骤:
# 1. 检查服务器SSL配置
mysql> SHOW VARIABLES LIKE ‘%ssl%’;

# 输出示例:
# +—————+——————————–+
# | Variable_name | Value |
# +—————+——————————–+
# | have_ssl | YES |
# | ssl_ca | /var/lib/mysql/ca.pem |
# | ssl_cert | /var/lib/mysql/server-cert.pem |
# | ssl_key | /var/lib/mysql/server-key.pem |
# +—————+——————————–+

# 2. 验证证书
openssl verify -CAfile /var/lib/mysql/ca.pem /var/lib/mysql/server-cert.pem

# 输出示例:
# /var/lib/mysql/server-cert.pem: OK

# 解决方案:使用正确的证书连接
mysql -u app_user -p \
–ssl-ca=/var/lib/mysql/ca.pem \
–ssl-cert=/var/lib/mysql/client-cert.pem \
–ssl-key=/var/lib/mysql/client-key.pem

# 输出示例:
# Welcome to the MySQL monitor.

4.2 字符集问题案例

以下是MySQL 8.4字符集问题的实战案例:

# 字符集问题案例

# 案例1:乱码问题

# 问题描述:
# 插入中文数据后显示乱码

# 排查步骤:
# 1. 检查数据库字符集
mysql> SHOW CREATE DATABASE production_db;

# 输出示例:
# +—————+——————————————————————–+
# | Database | Create Database |
# +—————+——————————————————————–+
# | production_db | CREATE DATABASE `production_db` /*!40100 DEFAULT CHARACTER SET latin1 */|
# +—————+——————————————————————–+

# 2. 检查表字符集
mysql> SHOW CREATE TABLE users;

# 输出示例:
# CREATE TABLE `users` (
# `id` int NOT NULL,
# `name` varchar(100) DEFAULT NULL
# ) ENGINE=InnoDB DEFAULT CHARSET=latin1

# 解决方案:修改字符集
mysql> ALTER DATABASE production_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 输出示例:
# Query OK, 1 row affected (0.00 sec)

mysql> ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 输出示例:
# Query OK, 1000 rows affected (0.50 sec)

# 案例2:排序规则冲突

# 问题描述:
# 关联查询时报排序规则冲突错误

# 错误信息:
ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation ‘=’

# 排查步骤:
# 1. 检查表字符集
mysql> SELECT TABLE_NAME, TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ‘production_db’;

# 输出示例:
# +————+——————–+
# | TABLE_NAME | TABLE_COLLATION |
# +————+——————–+
# | users | utf8mb4_0900_ai_ci |
# | orders | utf8mb4_unicode_ci |
# +————+——————–+

# 解决方案:统一排序规则
mysql> ALTER TABLE orders CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

# 输出示例:
# Query OK, 5000 rows affected (1.23 sec)

# 案例3:Emoji存储问题

# 问题描述:
# 无法存储Emoji表情符号

# 错误信息:
ERROR 1366 (HY000): Incorrect string value: ‘\xF0\x9F\x98\x80’ for column ‘content’

# 排查步骤:
# 1. 检查字符集
mysql> SHOW CREATE TABLE messages;

# 输出示例:
# CREATE TABLE `messages` (
# `id` int NOT NULL,
# `content` varchar(255) DEFAULT NULL
# ) ENGINE=InnoDB DEFAULT CHARSET=utf8

# 解决方案:使用utf8mb4
mysql> ALTER TABLE messages MODIFY content VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 输出示例:
# Query OK, 0 rows affected (0.02 sec)

# 验证:
mysql> INSERT INTO messages VALUES (1, ‘Hello 😊’);

# 输出示例:
# Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM messages;

# 输出示例:
# +—-+————+
# | id | content |
# +—-+————+
# | 1 | Hello 😊 |
# +—-+————+

4.3 存储问题案例

以下是MySQL 8.4存储问题的实战案例:

# 存储问题案例

# 案例1:表空间不足

# 问题描述:
# 插入数据时报表空间不足错误

# 错误信息:
ERROR 1114 (HY000): The table ‘orders’ is full

# 排查步骤:
# 1. 检查磁盘空间
df -h /var/lib/mysql

# 输出示例:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 100G 95G 5.0G 95% /var/lib/mysql

# 2. 检查表大小
mysql> SELECT TABLE_NAME,
ROUND(DATA_LENGTH/1024/1024, 2) AS DATA_MB,
ROUND(INDEX_LENGTH/1024/1024, 2) AS INDEX_MB
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ‘production_db’
ORDER BY DATA_LENGTH DESC;

# 输出示例:
# +————+———-+———-+
# | TABLE_NAME | DATA_MB | INDEX_MB |
# +————+———-+———-+
# | orders | 50000.00 | 10000.00 |
# | users | 5000.00 | 500.00 |
# +————+———-+———-+

# 解决方案:
# 1. 清理旧数据
mysql> DELETE FROM orders WHERE created_at < '2025-01-01'; # 输出示例: # Query OK, 1000000 rows affected (30.12 sec) # 2. 优化表 mysql> OPTIMIZE TABLE orders;

# 输出示例:
# +——————-+———-+———-+———-+
# | Table | Op | Msg_type | Msg_text |
# +——————-+———-+———-+———-+
# | production_db.orders | optimize | status | OK |
# +——————-+———-+———-+———-+

# 案例2:InnoDB缓冲池问题

# 问题描述:
# 查询性能下降,缓冲池命中率低

# 排查步骤:
# 1. 检查缓冲池状态
mysql> SHOW STATUS LIKE ‘Innodb_buffer_pool%’;

# 输出示例:
# +—————————————+————-+
# | Variable_name | Value |
# +—————————————+————-+
# | Innodb_buffer_pool_pages_total | 8192 |
# | Innodb_buffer_pool_pages_data | 8000 |
# | Innodb_buffer_pool_pages_free | 192 |
# | Innodb_buffer_pool_read_requests | 10000000 |
# | Innodb_buffer_pool_reads | 500000 |
# +—————————————+————-+

# 2. 计算命中率
# 命中率 = 1 – (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)
# 命中率 = 1 – (500000 / 10000000) = 95%

# 解决方案:增加缓冲池大小
mysql> SET GLOBAL innodb_buffer_pool_size = 17179869184;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 案例3:临时表空间问题

# 问题描述:
# 复杂查询时报临时表空间不足

# 错误信息:
ERROR 1114 (HY000): The table ‘/tmp/#sql_xxx’ is full

# 排查步骤:
# 1. 检查临时表空间
mysql> SHOW VARIABLES LIKE ‘tmp_table_size’;
mysql> SHOW VARIABLES LIKE ‘max_heap_table_size’;

# 输出示例:
# +———————+———-+
# | Variable_name | Value |
# +———————+———-+
# | tmp_table_size | 16777216 |
# | max_heap_table_size | 16777216 |
# +———————+———-+

# 解决方案:增加临时表大小
mysql> SET GLOBAL tmp_table_size = 268435456;
mysql> SET GLOBAL max_heap_table_size = 268435456;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

Part05-风哥经验总结与分享

5.1 问题预防措施

以下是MySQL 8.4常见问题的预防措施:

# 问题预防措施

1. 升级前准备

– 完整备份数据
– 运行升级检查工具
– 测试环境验证
– 准备回滚方案

备份命令:
mysqldump -u root -p –all-databases > /backup/all_databases.sql

输出示例:
Dump completed successfully.

2. 配置最佳实践

– 使用标准字符集utf8mb4
– 配置合理的缓冲池大小
– 设置适当的连接数限制
– 启用慢查询日志

推荐配置:
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
innodb_buffer_pool_size = 4G
max_connections = 500
slow_query_log = ON
long_query_time = 2

3. 监控和告警

– 监控关键指标
– 设置告警阈值
– 定期检查日志
– 建立巡检制度

监控脚本:
#!/bin/bash
mysql -u monitor -p -e ”
SHOW STATUS LIKE ‘Threads_connected’;
SHOW STATUS LIKE ‘Innodb_buffer_pool_read%’;

4. 定期维护

– 定期分析表
– 定期优化表
– 定期清理日志
– 定期更新统计信息

维护脚本:
mysqlcheck –all-databases –analyze
mysqlcheck –all-databases –optimize

5.2 问题诊断方法

以下是MySQL 8.4问题诊断的方法:

# 问题诊断方法

1. 日志分析

查看错误日志:
tail -100 /var/log/mysql/error.log

输出示例:
2026-04-01T12:00:00.000000Z 0 [ERROR] [MY-013183] [InnoDB] Assertion failure

查看慢查询日志:
mysqldumpslow -s t /var/log/mysql/slow.log | head -10

输出示例:
Count: 100 Time=5.00s (500s) Lock=0.00s (0s) Rows=1000.0 (100000)
SELECT * FROM orders WHERE status = ‘S’

2. 状态检查

查看进程列表:
mysql> SHOW PROCESSLIST;

输出示例:
+—-+——+———–+——+———+——+———-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+—-+——+———–+——+———+——+———-+——————+
| 5 | root | localhost | NULL | Query | 0 | starting | SHOW PROCESSLIST |
+—-+——+———–+——+———+——+———-+——————+

查看状态变量:
mysql> SHOW STATUS LIKE ‘%connect%’;

输出示例:
+————————–+——-+
| Variable_name | Value |
+————————–+——-+
| Aborted_connects | 0 |
| Connections | 100 |
| Max_used_connections | 50 |
| Threads_connected | 10 |
+————————–+——-+

3. 性能分析

使用EXPLAIN分析:
mysql> EXPLAIN SELECT * FROM orders WHERE status = ‘pending’\G

输出示例:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: orders
type: ref
possible_keys: idx_status
key: idx_status
key_len: 102
ref: const
rows: 1000
filtered: 100.00
Extra: NULL

使用Performance Schema:
mysql> SELECT * FROM sys.statement_analysis LIMIT 5;

4. 系统资源检查

检查CPU:
top -bn1 | head -5

输出示例:
top – 12:00:00 up 30 days, 2 users, load average: 0.50, 0.45, 0.40

检查内存:
free -h

输出示例:
total used free
Mem: 16Gi 8.0Gi 8.0Gi
Swap: 8.0Gi 0B 8.0Gi

检查磁盘:
df -h /var/lib/mysql

输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 50G 50G 50% /var/lib/mysql

5.3 常用资源链接

以下是MySQL 8.4相关的常用资源:

# 常用资源链接

1. 官方文档

MySQL 8.4参考手册:
https://dev.mysql.com/doc/refman/8.4/en/

MySQL 8.4发布说明:
https://dev.mysql.com/doc/relnotes/mysql/8.4/en/

MySQL错误代码参考:
https://dev.mysql.com/doc/mysql-errors/8.4/en/

2. 社区资源

MySQL官方论坛:
https://forums.mysql.com/

MySQL Bug报告:
https://bugs.mysql.com/

Stack Overflow MySQL标签:
https://stackoverflow.com/questions/tagged/mysql

3. 工具资源

MySQL Shell下载:
https://dev.mysql.com/downloads/shell/

MySQL Workbench下载:
https://dev.mysql.com/downloads/workbench/

MySQL连接器下载:
https://dev.mysql.com/downloads/connector/

4. 培训资源

MySQL官方培训:
https://dev.mysql.com/training/

MySQL认证:
https://dev.mysql.com/certification/

风哥视频教程:
www.fgedu.net.cn

风哥提示:MySQL 8.4作为长期支持版本(LTS),相比之前的版本有很多改进和变化。在升级和使用过程中,需要特别注意认证方式变更、字符集变更、SQL模式变更等问题。建议在升级前充分测试,并准备好回滚方案。遇到问题时,优先查看错误日志,结合Performance Schema和Sys Schema进行诊断。更多视频教程请访问www.fgedu.net.cn

注意:本文档内容基于MySQL 8.4官方文档编写,适合DBA人员在学习和测试中使用。在生产环境中应用时,请务必进行充分的测试和验证。MySQL版本可能随时更新,请风哥教程参考官方文档获取最新信息。文档中的命令和配置可能因MySQL版本不同而有所差异,请根据实际情况进行调整。

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息