目录
1. 故障现象 1:无法连接到数据库,提示 “Can't connect to local MySQL server through socket '/data/mysql/mysql.sock'”
2. 故障现象 2:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
4. 故障现象 4:Can't open file: 'xxx_forums.MYI'.(errno: 145)
6. 故障现象 6:客户端报 Too many connections
1. 故障现象 1:从库的 Slave_IO_Running 为 NO,提示主库和从库的 server-id 值一样
2. 故障现象 2:从库的 Slave_IO_Running 为 NO,状态码报错如 1007、1032、1062、1452 等
3. 故障现象 3:Error initializing relay log position: I/O error reading the header from the binary log
一、前置知识点:MySQL 逻辑架构解析
MySQL 的逻辑架构可划分为多个层次,各层次协同工作以实现数据库的功能。
(一)客户端和连接服务层(最上层)
- 功能:负责处理客户端的连接请求,包括本地 sock 通信和基于 TCP/IP 的客户端 / 服务器端通信。完成连接处理、授权认证及安全方案等,引入线程池为通过安全认证的客户端提供线程,还可实现基于 SSL 的安全链接,并验证客户端操作权限。
- 关键概念:线程池用于管理客户端连接线程,SSL 确保连接安全,权限验证保障数据访问安全。
(二)核心服务层(第二层)
- 功能:实现大多数核心服务,如 SQL 接口接收和处理 SQL 语句,缓存查询结果以提升性能,对 SQL 进行分析和优化(包括确定查询表顺序、是否利用索引等),执行部分内置函数,实现跨存储引擎的功能(如过程、函数)。服务器解析查询创建内部解析树,优化后生成执行操作,select 语句还会查询内部缓存,缓存可提升大量读操作性能。
- 关键组件:
- SQL 接口:接收和解析 SQL 语句。
- 查询缓存:存储查询结果,减少重复查询开销。
- 解析器和优化器:解析 SQL 并生成最优执行计划。
(三)存储引擎层
- 功能:负责数据的存储和提取,服务器通过 API 与存储引擎通信。不同存储引擎功能不同,可根据需求选择,如 MyISAM 适合读多写少场景,InnoDB 支持事务和外键。
- 常见存储引擎:
- MyISAM:不支持事务,表级锁,查询性能较高。
- InnoDB:支持事务、行级锁和外键,是 MySQL 默认存储引擎。
- Memory:数据存储在内存中,读写速度快,但数据易失。
(四)数据存储层
- 功能:将数据存储在运行于裸设备的文件系统之上,与存储引擎交互,管理数据文件和日志文件,支持多种文件系统(如 NTFS、ext2/3 等)。
- 文件类型:
- 数据文件:存储表数据。
- 索引文件:用于加速数据查询。
- 日志文件:包括重做日志、撤销日志、错误日志、查询日志和慢查询日志等,用于记录数据库操作和故障信息。
二、案例实验环境
(一)环境搭建
- 单实例环境:一台数据库服务器模拟单实例。
- 主从环境:两台数据库服务器模拟主从架构。
- MySQL 版本:8.0。
(二)所需资源
- 硬件资源:根据实际需求配置,至少具备一定的 CPU、内存和磁盘空间。
- 软件资源:安装 MySQL 8.0 数据库软件,配置相应的网络环境。
三、案例需求
(一)MySQL 常见故障解决
掌握单库和主从架构下的常见故障现象、分析方法和解决措施,能够快速定位和解决数据库故障,确保数据库的正常运行。
(二)MySQL 性能优化
从硬件、配置参数、SQL 语句等方面对 MySQL 进行优化,提升数据库的性能,满足高性能网站架构的需求。
四、案例实现思路
(一)单库常见故障分析
对单实例数据库中可能出现的故障进行分析,包括数据库启动问题、连接问题、表损坏问题、权限问题等,总结故障现象、原因和解决方法。
(二)主从常见故障分析
分析主从架构下的常见故障,如主从同步失败、数据不一致、从库连接问题等,了解故障产生的原因,掌握相应的排查和解决方法。
(三)MySQL 优化
从硬件选择、配置参数调整、SQL 语句优化等多个方面入手,对 MySQL 进行全面优化,提高数据库的性能和稳定性。
五、案例实施
(一)MySQL 单实例故障排查
1. 故障现象 1:无法连接到数据库,提示 “Can't connect to local MySQL server through socket '/data/mysql/mysql.sock'”
- 问题分析:可能是数据库未启动、mysql 配置文件未指定 socket 文件或数据库端口被防火墙拦截。
- 解决方法:
- 启动数据库:使用系统服务命令或手动启动脚本启动 MySQL 服务。
- 检查配置文件:确保 my.cnf 中指定了正确的 socket 文件路径。
- 开放防火墙端口:如果端口被防火墙拦截,使用防火墙命令开放 MySQL 监听端口(默认为 3306)。
2. 故障现象 2:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- 问题分析:密码不正确或没有权限访问。
- 解决方法:
- 修改 my.cnf 主配置文件,在 [mysqld] 下添加
skip-grant-tables=on
,重启数据库,跳过权限验证。 - 修改密码:
- MySQL 5.7 版本:
mysql> update mysql.user set authentication_string=password('新密码') where user='root' and Host='localhost'; mysql> flush privileges;
- MySQL 8.0 版本:
mysql> UPDATE mysql.user SET authentication_string='' WHERE user='root' AND Host='localhost'; mysql> FLUSH PRIVILEGES; mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
- 删除添加的
skip-grant-tables
参数,重启数据库,使用新密码登录。 - 重新授权(可选):
- MySQL 5.7 版本:
mysql> grant all on *.* to 'root'@'mysql-server' identified by '新密码';
- MySQL 8.0 版本:
mysql> CREATE USER 'root'@'mysql-server' IDENTIFIED BY '新密码'; mysql> GRANT all ON *.* TO 'root'@'mysql-server';
- 修改 my.cnf 主配置文件,在 [mysqld] 下添加
3. 故障现象 3:远程连接数据库偶尔很慢
- 问题分析:MySQL 主机查询 DNS 很慢或有很多客户端主机,开发机器无法连接外网导致 DNS 解析失败。
- 解决方法:修改 my.cnf 主配置文件,在 [mysqld] 下添加
skip-name-resolve
,禁止 DNS 解析,重启数据库。注意以后授权不能使用主机名授权,需使用 IP 地址授权。
4. 故障现象 4:Can't open file: 'xxx_forums.MYI'.(errno: 145)
- 问题分析:服务器非正常关机、数据库所在空间已满、表损坏或文件属组问题(如直接拷贝移动数据库文件导致属组不正确)。
- 解决方法:
- 修复数据表:
- 使用 myisamchk 工具(仅适合独立主机用户):
- 通过 phpMyAdmin 修复:进入表操作界面,点击 “修复表”。
myisamchk -r 数据文件目录/数据表名.MYI
- 使用 myisamchk 工具(仅适合独立主机用户):
- 注意事项:修复前务必备份数据库。
- 修改文件属组(仅适合 Linux 和 FreeBSD 用户):确保数据库文件的属组为 MySQL 运行账号可读写,使用
chown
和chmod
命令修改文件属组和权限。
- 修复数据表:
5. 故障现象 5:ERROR 1129 (HY000): Host 'xxx.xx.xxx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
- 问题分析:max_connect_errors 参数默认值为 10,同一 IP 短时间内连接请求超过该值导致阻塞。
- 解决方法:
- 使用 mysqladmin 命令清除缓存:
mysqladmin -uroot -p -h 服务器IP flush-hosts
- 修改 my.cnf 配置文件,增大 max_connect_errors 值,如设置为
max_connect_errors=100
,然后重启 MySQL。
6. 故障现象 6:客户端报 Too many connections
- 问题分析:连接数超出 MySQL 的最大连接数限制。
- 解决方法:
- 临时修改最大连接数(重启后不生效):
- 永久修改:在 my.cnf 配置文件中添加
max_connections=10000
,重启 MySQL 服务。
- 永久修改:在 my.cnf 配置文件中添加
set GLOBAL max_connections=10000;
- 临时修改最大连接数(重启后不生效):
7. 故障现象 7:Warning: World-writable config file '/etc/my.cnf' is ignored ERROR! MySQL is running but PID file could not be found
- 问题分析:MySQL 的配置文件 /etc/my.cnf 权限不对,可能被其他用户修改。
- 解决方法:修改配置文件权限为 644,使用命令
chmod 644 /etc/my.cnf
。
8. 故障现象 8:InnoDB: Error: page 14178 log sequence number 29455369832 InnoDB: is in the future! Current system log sequence number 29455369832
- 问题分析:InnoDB 数据文件损坏。
- 解决方法:
- 修改 my.cnf 配置文件,在 [mysqld] 下添加
innodb_force_recovery=4
,启动数据库后备份数据文件。 - 去掉该参数,利用备份文件恢复数据。
- 修改 my.cnf 配置文件,在 [mysqld] 下添加
(二)MySQL 主从故障排查
1. 故障现象 1:从库的 Slave_IO_Running 为 NO,提示主库和从库的 server-id 值一样
- 问题分析:主库和从库的 server-id 相同,导致主从复制失败。
- 解决方法:修改从库的 server-id 值,确保与主库不同,修改后重启从库,重新进行主从同步。
2. 故障现象 2:从库的 Slave_IO_Running 为 NO,状态码报错如 1007、1032、1062、1452 等
- 问题分析:可能是主键冲突、主库删除或更新数据导致从库找不到记录,数据被修改。
- 解决方法:
- 方法一:跳过当前错误的事务,继续同步:
mysql> stop slave; mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; mysql> start slave;
- 方法二:设置从库只读权限,防止从库数据被意外修改:
set global read_only=true;
3. 故障现象 3:Error initializing relay log position: I/O error reading the header from the binary log
- 问题分析:从库的中继日志 relay-bin 损坏。
- 解决方法:手工修复,重新找到同步的 binlog 和 pos 点,然后重新同步:
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.xxx', MASTER_LOG_POS=xxx;
(三)MySQL 优化
1. 硬件方面
- 关键因素:CPU、内存、磁盘是影响 MySQL 性能的主要硬件因素。
- 建议:
- 选择高性能的 CPU,尤其是在处理复杂查询和高并发场景时。
- 配置足够的内存,确保 MySQL 的缓冲池、查询缓存等能够有效运行。
- 使用高速磁盘(如 SSD),提高数据读写速度,减少 I/O 瓶颈。
2. 配置参数优化
- 核心配置参数:
- innodb_buffer_pool_size:InnoDB 缓冲池大小,用于缓存数据和索引,建议设置为物理内存的 60%-80%,如 32 核 CPU、64G 内存的服务器可设置为 40G。
- innodb_log_file_size:InnoDB 日志文件大小,影响事务提交速度和崩溃恢复时间,建议设置为 2G-4G。
- innodb_flush_log_at_trx_commit:控制事务日志刷新策略,取值 0、1、2,默认 1(完全持久化,安全性高),高并发写入场景可设为 2(折中,每秒刷盘,容忍最多 1 秒数据丢失)。
- max_connections:最大客户端连接数,避免连接耗尽,建议根据业务需求设置为 500-2000,如设置为 1000。
- thread_cache_size:线程缓存大小,用于缓存空闲线程,减少线程创建和销毁的开销,建议设置为 100。
- 查询优化参数:
- tmp_table_size:内存临时表大小上限,影响复杂查询(如 GROUP BY、JOIN),建议设置为 64M-256M,如 128M,需与 max_heap_table_size 值一致。
- sort_buffer_size:排序操作缓冲区大小,建议设置为 2M-8M,如 4M。
- join_buffer_size:JOIN 操作缓冲区大小,仅对无索引 JOIN 有效,建议设置为 4M-16M,如 8M。
- 日志与监控参数:
- slow_query_log:启用慢查询日志,记录执行时间长的 SQL,设置为 ON。
- long_query_time:定义慢查询阈值(秒),根据业务容忍度调整,如设置为 1 秒。
- log_error:错误日志路径,用于故障排查,如设置为 /var/log/mysql/error.log。
- binlog_format:二进制日志格式,推荐 ROW 格式,数据一致性高,主从复制依赖。
- expire_logs_days:自动清理旧的二进制日志天数,根据备份策略调整,如设置为 7-14 天。
- InnoDB 高级优化参数:
- innodb_io_capacity:InnoDB 后台任务的 I/O 能力(如刷新脏页),SSD 建议 2000-4000,HDD 建议 200-400。
- innodb_flush_method:控制数据文件与日志文件的刷新方式,默认 0_DIRECT,避免双缓冲。
- innodb_thread_concurrency:InnoDB 并发线程数限制,默认 0(自适应),高并发场景可设为 CPU 核数 * 2。
- innodb_autoinc_lock_mode:影响自增主键的插入性能,推荐设置为 2(连续模式,高并发插入性能好)。
3. SQL 方面
- SQL 优化的重要性:SQL 优化是提升数据库性能的关键,通过减少资源消耗(如 CPU、内存、磁盘 I/O)来提升查询响应速度,避免慢查询导致系统问题。
- 优化步骤:
- 创建测试表并插入数据:
- 创建测试库:
CREATE DATABASE test;
- 创建用户表:
USE test; CREATE TABLE users( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, age INT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP );
- 插入 10 万条测试数据(使用存储过程生成):
DELIMITER $$ CREATE PROCEDURE insert_users() BEGIN DECLARE i INT DEFAULT 0; WHILE i<100000 DO INSERT INTO users (name, email, age) VALUES (CONCAT('user', i), CONCAT('user', i, '@example.com'), FLOOR(RAND()*100)); SET i=i+1; END WHILE; END$$ DELIMITER ; CALL insert_users();
- 使用 EXPLAIN 进行 SQL 优化分析:
- EXPLAIN 工具用于分析 SQL 执行计划,输出关键信息(如访问类型 type、使用索引 key、预估扫描行数 rows、额外操作 Extra 等),帮助识别性能瓶颈。
- 示例:
mysql> EXPLAIN SELECT * FROM users WHERE name='user123';
- 结果分析:
- 优化前:type=ALL(全表扫描,效率低),possible_keys=NULL(未命中索引),rows=100000(扫描全部数据)。
- 优化措施:添加索引:
mysql> ALTER TABLE users ADD INDEX idx_name (name);
- 优化后:
mysql> EXPLAIN SELECT * FROM users WHERE name='user123';
- 结果分析:type=ref(索引查找,效率高),key=idx_name(命中新创建的索引),rows=1(仅扫描一行数据)。
- 创建测试表并插入数据:
- 优化手段:
- 索引调优:为经常查询的字段创建合适的索引,如单字段索引、复合索引、覆盖索引等,避免全表扫描。
- 查询改写:优化 SQL 语句结构,避免使用 SELECT *,减少不必要的数据查询;合理使用 JOIN 语句,避免低效的连接方式;避免在 WHERE 子句中对字段进行函数操作,防止索引失效。
- 执行计划分析:通过 EXPLAIN 工具分析 SQL 执行计划,根据分析结果调整索引和查询语句,确保查询使用最优的执行路径。
六、示例配置片段(my.cnf)
以下是一个针对 32 核 CPU、64G 内存、500G SSD 的生产环境示例配置,包含硬件适配、缓冲池优化、日志管理及 InnoDB 高级参数:
[mysqld]
# 核心配置 - 硬件适配
innodb_buffer_pool_size = 40G # 占用60%内存,缓存数据与索引
innodb_log_file_size = 2G # 日志文件大小,提升事务提交性能
innodb_flush_log_at_trx_commit = 2 # 高并发场景折中策略,每秒刷盘
max_connections = 1000 # 最大连接数,配合thread_cache_size=100
thread_cache_size = 100 # 缓存100个空闲线程,减少线程创建开销
# 查询优化 - 内存管理
tmp_table_size = 128M # 内存临时表上限,与max_heap_table_size一致
max_heap_table_size = 128M # 内存哈希表上限,避免磁盘临时表
sort_buffer_size = 4M # 单线程排序缓冲区(适用于中等数据集)
join_buffer_size = 8M # 无索引JOIN的缓冲区(根据表大小调整)
# 日志与监控 - 故障排查
slow_query_log = ON # 启用慢查询日志,记录执行超过阈值的SQL
long_query_time = 1 # 慢查询阈值设为1秒,敏感业务可降至0.5
log_error = /var/log/mysql/error.log # 错误日志路径,建议独立磁盘分区
binlog_format = ROW # 主从复制推荐ROW格式,数据一致性更高
expire_logs_days = 7 # 自动清理7天前的二进制日志,节省磁盘空间
# InnoDB高级优化 - SSD场景
innodb_io_capacity = 2000 # SSD磁盘IOPS预估,适配硬件性能
innodb_flush_method = O_DIRECT # 直接读写磁盘,绕过操作系统缓存
innodb_thread_concurrency = 0 # 自适应并发线程数,充分利用32核CPU
innodb_autoinc_lock_mode = 2 # 高并发插入模式,提升自增主键性能
七、MySQL 性能优化总结
(一)三层优化体系协同
硬件层(基础支撑)
- CPU:优先选择多核高频 CPU,尤其适合复杂查询(如 JOIN、分组聚合)场景,避免 CPU 成为瓶颈。
- 内存:扩大 InnoDB 缓冲池(
innodb_buffer_pool_size
)以缓存更多数据,建议占物理内存 60%-80%,减少磁盘 I/O。 - 磁盘:使用 SSD 替换 HDD,搭配
innodb_io_capacity=2000
等参数提升 IOPS;分离数据文件与日志文件到独立磁盘,降低 I/O 竞争。
配置层(资源调度)
- 连接管理:通过
max_connections
限制并发连接数,配合thread_cache_size
缓存线程,避免频繁创建线程消耗资源。 - 缓冲与日志:调整
innodb_log_file_size
平衡事务提交速度与恢复时间;根据业务特性选择innodb_flush_log_at_trx_commit
(如金融场景用 1,日志非敏感场景用 2)。 - 查询优化参数:避免
tmp_table_size
过小导致磁盘临时表,或过大导致内存溢出;为排序、JOIN 等操作分配合理缓冲区(sort_buffer_size
、join_buffer_size
)。
- 连接管理:通过
SQL 层(效率核心)
- 索引策略:为高频查询字段创建索引(如
idx_name
),避免全表扫描(type=ALL
);使用复合索引(如(user_id, created_at)
)优化多条件查询。 - 查询改写:禁止
SELECT *
,仅查询必要字段;避免在WHERE
子句中对字段做函数运算(如DATE(created_at)
),防止索引失效。 - 执行计划分析:通过
EXPLAIN
确认索引命中情况(key
字段),优化rows
预估行数至最小,消除Using temporary
/Using filesort
等额外开销。
- 索引策略:为高频查询字段创建索引(如
(二)动态平衡原则
- 硬件与配置适配:若内存不足,需降低
innodb_buffer_pool_size
并增大swap
空间临时过渡,但长期需升级硬件。 - 参数与业务匹配:读写分离架构中,从库可增大
innodb_read_io_threads
提升读性能;秒杀场景需调优innodb_lock_wait_timeout
避免锁竞争。 - 索引与写入成本:索引虽提升查询速度,但会增加写入(INSERT/UPDATE/DELETE)开销,需根据业务读写比权衡索引数量(建议单表索引不超过 5 个)。
八、故障排查实战建议
(一)单实例故障快速定位流程
连接类故障(优先排查)
- 检查 MySQL 服务状态:
systemctl status mysql # Linux系统 net start mysql # Windows系统
- 验证端口连通性:
telnet 127.0.0.1 3306 # 本地连接测试 nmap -p 3306 服务器IP # 远程端口扫描
- 查看错误日志(
log_error
路径):tail -f /var/log/mysql/error.log
- 检查 MySQL 服务状态:
权限与安全故障
- 重置 root 密码时,确保在单用户模式下操作(添加
skip-grant-tables
后重启),避免未授权访问。 - 授权时使用具体 IP 而非
%
(如'root'@'192.168.1.%'
),减少安全风险;生产环境禁止使用GRANT ALL
,按需分配权限(如SELECT, INSERT ON db.table
)。
- 重置 root 密码时,确保在单用户模式下操作(添加
表损坏与数据恢复
- MyISAM 表修复:
# 备份后修复 myisamchk -r /var/lib/mysql/数据库名/表名.MYI
- InnoDB 表损坏:
- 尝试
innodb_force_recovery=4
启动数据库并导出数据,恢复后需重建表结构。 - 定期使用
mysqldump
或物理备份(如 Percona XtraBackup)预防数据丢失。
- 尝试
- MyISAM 表修复:
(二)主从复制故障排查步骤
基础连通性检查
- 主库验证:
SHOW MASTER STATUS; # 确认二进制日志已启用,记录File和Position
- 从库配置:
CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='复制用户', MASTER_PASSWORD='密码', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=100;
- 启动从库线程:
START SLAVE; SHOW SLAVE STATUS\G # 重点查看Slave_IO_Running和Slave_SQL_Running是否为Yes
- 主库验证:
常见同步问题处理
- server-id 冲突:修改从库
my.cnf
中的server-id=2
(主库默认 1),重启后重新同步。 - 中继日志损坏:
# 停止从库,删除损坏的中继日志 STOP SLAVE; RESET SLAVE; # 谨慎操作,会清空所有中继日志 # 重新指定主库日志位置 CHANGE MASTER TO MASTER_LOG_FILE='新的binlog文件', MASTER_LOG_POS=新位置; START SLAVE;
- 数据不一致:
- 主库锁表导出全量数据:
FLUSH TABLES WITH READ LOCK; # 锁定主库表 mysqldump -h 主库IP -u root -p 数据库名 > full_backup.sql UNLOCK TABLES; # 解锁
- 从库恢复数据后,重启同步:
STOP SLAVE; RESET SLAVE ALL; # 导入备份后重新配置主从 CHANGE MASTER TO ...; START SLAVE;
- 主库锁表导出全量数据:
- server-id 冲突:修改从库
(三)优化效果验证方法
性能指标监控
- 查看 MySQL 状态变量:
SHOW GLOBAL STATUS LIKE 'Threads_connected'; # 当前连接数 SHOW GLOBAL STATUS LIKE 'Slow_queries'; # 慢查询总数 SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_hit_rate'; # 缓冲池命中率(理想值>95%)
- 硬件监控工具:
iostat -x 5 # 磁盘I/O监控(重点关注%util是否接近100%) vmstat 5 # 内存与CPU负载监控
- 查看 MySQL 状态变量:
慢查询分析
- 导出慢查询日志:
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log # 按执行时间排序,取前10条
- 使用 pt-query-digest 分析:
pt-query-digest /var/log/mysql/slow.log > slow_analysis.txt
- 重点关注:
Rows_examined
(扫描行数)、Query_time
(执行时间)、未使用索引的查询(rows_examined > rows_sent
)。
- 重点关注:
- 导出慢查询日志:
压力测试验证
- 使用 sysbench 模拟高并发场景:
# 安装sysbench apt-get install sysbench # Ubuntu/Debian # 测试100张表,每张表100万条数据 sysbench oltp_read_write --tables=100 --table-size=1e6 prepare # 启动100个线程压测300秒 sysbench oltp_read_write --threads=100 --time=300 run
- 对比优化前后的 QPS(Queries per second)和 TPS(Transactions per second),验证性能提升效果。
- 使用 sysbench 模拟高并发场景:
九、生产环境最佳实践
(一)日常运维规范
定期备份策略
- 全量备份:每周一次,使用
mysqldump --single-transaction
(InnoDB)或物理备份工具(如 Percona XtraBackup)。 - 增量备份:每天一次,基于二进制日志(
binlog
)实现,备份命令:bash
mysqlbinlog --start-datetime="2025-05-19 00:00:00" --stop-datetime="2025-05-20 00:00:00" /var/log/mysql/mysql-bin.* > incremental_backup.sql
- 备份验证:定期恢复备份数据到测试环境,确保可用性。
- 全量备份:每周一次,使用
监控报警体系
- 核心指标报警:
- 连接数超过
max_connections*80%
时报警。 - 慢查询数每小时超过 10 条时触发预警。
- 磁盘空间使用率超过 80% 时报警(
df -h
)。
- 连接数超过
- 监控工具:使用 Prometheus+Grafana 组合,采集 MySQL 状态数据并可视化,设置阈值触发邮件 / 短信报警。
- 核心指标报警:
版本与补丁管理
- 生产环境使用稳定版本(如 MySQL 8.0.34),避免使用开发版或早期版本(如 8.0.11 存在 InnoDB 崩溃漏洞)。
- 定期更新安全补丁,测试环境验证后再部署至生产(如修复 CVE-2023-32663 远程代码执行漏洞)。
(二)高可用架构设计
主从 + 读写分离
- 应用层通过中间件(如 MyCat、ProxySQL)实现读写分离,主库处理写请求,从库承担读压力。
- 配置示例(ProxySQL):
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight) VALUES (1, '主库IP', 3306, 100); # 写节点(hostgroup_id=1) INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight) VALUES (2, '从库IP1', 3306, 50), (2, '从库IP2', 3306, 50); # 读节点(hostgroup_id=2)
故障切换机制
- 使用 MHA(Master High Availability)或 Orchestrator 自动检测主库故障,提升切换效率(秒级切换)。
- MHA 部署步骤:
# 主库配置 vi /etc/mha/master.cnf [server default] master_host=主库IP master_user=mha_user master_password=密码 # 从库配置 vi /etc/mha/slave1.cnf [server] hostname=从库IP1 # 启动MHA管理节点 masterha_manager --conf=/etc/mha/master.cnf
分布式架构扩展
- 当单集群无法承载业务压力时,采用分库分表(如按用户 ID 哈希分库),使用 Sharding-JDBC 或 Apache ShardingSphere 实现数据路由。
- 示例分库规则:
// Sharding-JDBC配置 sharding-sphere.sharding.tables.users.actual-data-nodes=ds$->{0..1}.users$->{0..1} sharding-sphere.sharding.tables.users.table-strategy.inline.sharding-column=user_id sharding-sphere.sharding.tables.users.table-strategy.inline.algorithm-expression=users$->{user_id % 2}