本文档风哥主要介绍MySQL 8.4版本中常见的问题和解决方案,包括升级问题、兼容性问题、性能问题、连接问题等,风哥教程参考MySQL官方文档FAQ章节,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 MySQL 8.4常见问题概述
MySQL 8.4作为长期支持版本(LTS),引入了许多新特性,同时也带来了一些常见问题:
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问题及解决方案:
# 问题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版本不同而有所差异,请根据实际情况进行调整。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
