MySQL故障排查与生产环境优化
目录
一、前置知识点:MySQL 逻辑架构解析
(一)客户端和连接服务层(最上层)
(二)核心服务层(第二层)
(三)存储引擎层
(四)数据存储层
二、案例实验环境
(一)环境搭建
(二)所需资源
三、案例需求
(一)MySQL 常见故障解决
(二)MySQL 性能优化
四、案例实现思路
(一)单库常见故障分析
(二)主从常见故障分析
(三)MySQL 优化
五、案例实施
(一)MySQL 单实例故障排查
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)
3. 故障现象 3:远程连接数据库偶尔很慢
4. 故障现象 4:Can't open file: 'xxx_forums.MYI'.(errno: 145)
5. 故障现象 5:ERROR 1129 (HY000): Host 'xxx.xx.xxx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
6. 故障现象 6:客户端报 Too many connections
7. 故障现象 7:Warning: World-writable config file '/etc/my.cnf' is ignored ERROR! MySQL is running but PID file could not be found
8. 故障现象 8:InnoDB: Error: page 14178 log sequence number 29455369832 InnoDB: is in the future! Current system log sequence number 29455369832
(二)MySQL 主从故障排查
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 优化
1. 硬件方面
2. 配置参数优化
3. SQL 方面
六、示例配置片段(my.cnf)
七、MySQL 性能优化总结
(一)三层优化体系协同
(二)动态平衡原则
八、故障排查实战建议
(一)单实例故障快速定位流程
(二)主从复制故障排查步骤
(三)优化效果验证方法
九、生产环境最佳实践
(一)日常运维规范
(二)高可用架构设计
一、前置知识点: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() BEGINDECLARE i INT DEFAULT 0;WHILE i<100000 DOINSERT 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}
相关文章:
MySQL故障排查与生产环境优化
目录 一、前置知识点:MySQL 逻辑架构解析 (一)客户端和连接服务层(最上层) (二)核心服务层(第二层) (三)存储引擎层 (四…...
mysql故障排查与环境优化
一、mysql运行原理 mysql的运行分为三层 客户端和连接服务 核心服务功能(sql接口、缓存的查询、sql的分析和优化以及部分内置函数的执行等。) 存储引擎层(负责mysql中数据的存储和提取。) 二、示例 1、实验环…...
博图1200硬件组态与启保停程序编写步骤详解
一、前言 在工业自动化控制领域,西门子S7-1200 PLC因其性能稳定、编程灵活而广受欢迎。本文将详细介绍使用TIA Portal(博图)软件进行S7-1200 PLC硬件组态以及编写基本启保停程序的完整步骤,帮助初学者快速掌握这一基础而重要的技…...
深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践
深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践 引言 随着云计算和分布式系统的快速发展,微服务架构已成为现代软件开发的主流模式。Java作为企业级应用开发的核心语言,结合Spring Boot和Spring Cloud的强大生态,…...
AM32电调学习解读九:ESC上电启动关闭全流程波形分析
这是第九篇,前面的文章把各个模块的实现都介绍了一轮,本章是从运行的角度结合波形图,把整个流程走一遍。 先看下一运行的配置,我把一些配置关闭了,这样跑起来会好分析一些,不同配置跑起来效果会有差异。使用…...
迅联文库开发日志(三)登陆注册
目录 一、注册 Controller层 Service层 二、登录 其他需要注意的: 需要实现 Serializable 的场景 一、注册 先思考我们需要哪些参数: 邮箱、昵称、密码、邮箱验证码 (图片验证码会调用checkCode()验证) Controller层 Req…...
Oracle 数据库的默认隔离级别
Oracle 数据库的默认隔离级别 默认隔离级别:READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别,这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…...
PDF 合并测试:性能与内容完整性
我们一直在改进 PDF 合并工具 JPedal,并希望通过测试对比其与其他工具的表现。该工具支持合并包括大文件在内的完整文档。 如何测试 PDF 合并输出 我们在示例文件上进行了对比测试,您也可以用自有文件复现。 测试中使用的方法之一是借助 Adobe Reader&a…...
白杨SEO:不到7天,白杨SEO博客网站百度搜索显示和排名恢复正常!顺带说说上海线下GEO聚会分享和播客红利
大家好,我是白杨SEO,专注SEO十年以上,全网SEO流量实战派,AI搜索优化研究者。 5月开始,明显就忙起来了,不管是个人陪跑还是企业顾问,不管是需要传统SEO还是新媒体流量,还是当下这个A…...
docker介绍与常用命令汇总
docker简介 docker是什么? Docker 是一个开源的应用容器引擎,它可以让开发者将应用与运行环境打包成一个标准的、可移植的容器(Container),在任何地方都可以快速部署和运行,无需关心底层环境是否一致。 …...
Axure设计数字乡村可视化大屏:构建乡村数据全景图
今天,让我们一同深入了解由Axure设计的数字乡村可视化大屏,看看它如何通过精心的布局和多样化的图表类型,将乡村的各类数据以直观、易懂的方式呈现出来,为乡村管理者提供有力的数据支持。 原型效果预览链接:Axure数字乡…...
c#基础01(.Net介绍)
文章目录 .Net平台介绍.Net平台简介跨平台开源.Net Core.Net Framework开发工具安装选项 创建项目 .Net平台介绍 .Net平台简介 .NET是一种用于构建多种应用的免费开源开放平台,例如: Web 应用、Web API 和微服务 云中的无服务器函数 云原生应用 移动…...
GraphQL在.NET 8中的全面实践指南
一、GraphQL与.NET 8概述 GraphQL是一种由Facebook开发的API查询语言,它提供了一种更高效、更灵活的替代REST的方案。与REST不同,GraphQL允许客户端精确指定需要的数据结构和字段,避免了"过度获取"或"不足获取"的问题。…...
开源音视频转文字工具:基于 Vosk 和 Whisper 的多语言语音识别项目
背景介绍 随着短视频、播客等音视频内容的爆发式增长,快速将音视频内容转换为文字的需求也越来越大。无论是内容创作者需要的字幕,还是企业需要的会议记录,都需要一个可靠的语音转文字解决方案。 技术架构 本项目采用双引擎架构࿰…...
Playwright 多语言一体化——Python_Java_.NET 全栈采集实战
在现代 Web 自动化领域,Playwright 通过其多语言支持可在 Python、Java 及 .NET 三大生态中共享同一底层实现,简化了跨团队协作与维护成本 。然而,若忽略代理IP等必要配置,很容易导致功能异常或被目标网站限制,本文将以…...
【Linux网络】传输层协议UDP
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12891150.html 目录 传输层 再谈端口号 端口号范围划分 认识知名端口号(Well-Know Port Number…...
VAPO:视觉-语言对齐预训练(对象级语义)详解
简介 多模态预训练模型(Vision-Language Pre-training, VLP)近年来取得了飞跃发展。在视觉-语言模型中,模型需要同时理解图像和文本,这要求模型学习二者之间的语义对应关系。早期方法如 VisualBERT、LXMERT 等往往使用预先提取的图像区域特征和文本词嵌入拼接输入,通过 T…...
自制操作系统day4(c指针)(指针和数组)(CLI和STI)(EFLAGS)
day4 关于c指针的理解(结合汇编) int i; char *p; p(char *) i; *pi &0x0f;p(char *) i; *pi &0x0f;MOV ECX,i MOV BYTE [ECX],(i &0x0f) 如果一开始不给p赋值,p的内存地址不确定,也就是这个ECX里的值不确定&#x…...
计算机视觉与深度学习 | Python实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据
以下是一个结合ARIMA、鲸鱼优化算法(WOA)、CNN和LSTM进行时间序列预测的Python实现框架。由于完整代码和数据量较大,此处提供核心代码结构和示例数据集,您可根据需求扩展。 1. 数据准备(示例数据) 使用airline-passengers.csv(航空乘客数据集): import pandas as pd…...
SCGI 服务器详解
1 协议与报文格式 项目说明连接类型长连接,单条 TCP/UnixSocket 可传多请求;由前端(Nginx 等)维护 keep-alive。报文分段"<len>:" <header netstring> "," <body><len> 计数10 进…...
Linux问题排查-找到偷偷写文件的进程
在 Linux 系统中,若要通过已修改的文件找到修改该文件的进程 PID,可以结合以下方法分析,具体取决于文件是否仍被进程打开或已被删除但句柄仍存在: 一、文件仍被进程打开(未删除) 如果文件当前正在被某个进…...
Linux的权限问题
引入:权限的意义是什么? 权限就是为了让人能做某些事或不能做某些事 一:Linux下的用户种类 Linux下只有两种用户:root 和 普通用户 root:拥有至高无上的权限,任何的权限都不能限制root 普通用户…...
WPF技巧-BindingProxy
WPF技巧-BindingProxy 文章目录 WPF技巧-BindingProxy🔍 分析与解释1. **继承 Freezable**2. **重写 CreateInstanceCore 方法**3. **定义 DependencyProperty:Data** ✅ 使用场景场景说明:解决方案:示例 XAML: &#…...
深度解析:Redis 性能优化全方位指南
Redis 作为当前最流行的内存数据库之一,以其高性能、低延迟和丰富的数据结构支持,被广泛应用于缓存、消息队列、实时统计等场景。然而,随着业务规模的增长,Redis 可能面临性能瓶颈,如高延迟、内存不足、吞吐量下降等问…...
OpenHarmony外设驱动使用 (五),Fingerprint_auth
OpenHarmony外设驱动使用 (五) Fingerprint_auth 概述 功能简介 指纹认证是端侧设备不可或缺的功能,为设备提供用户认证能力,可应用于设备解锁、支付、应用登录等身份认证场景。用户注册指纹后,指纹认证模块就可为设…...
.NET外挂系列:2. 了解强大的 harmony 注解特性
一:背景 1. 讲故事 上一篇我们简单的聊了下harmony外挂的基本玩法,让大家宏观上感受到了外挂在 .NET高级调试 领域的威力,这一篇我们从 注解特性 这个角度继续展开。 二:harmony 注解特性 1. HarmonyPatch 解读 在harmony支持…...
【Arm】应用ArmDS移植最小FreeRTOS系统
一、文档背景 FreeRTOS(Free Real-Time Operating System)是一个开源的实时操作系统内核,广泛应用于嵌入式系统。它具有小巧、灵活、低功耗等特点,支持多任务调度、信号量、队列等实时操作系统基本功能。 将FreeRTOS移植到特定硬…...
Python----目标检测(labelimg和labelme的安装与使用,Pycharm配置教程)
一、labelimg labelimg是一款开源的图像标注工具,标签可用于分类和目标检测,它是用python写的,并使用Qt作为其图形界面,简单好用(虽然是英文版的)。其注释以 PASCAL VOC格式保存为XML文件,这是I…...
Axure跨页面交互:利用IFrame和JS实现父子页面菜单联动
在 Axure 中使用内联框架(IFrame)进行父子页面间的通信是一个非常有效的技巧,尤其是在需要实现复杂交互逻辑时。通过 JavaScript 直接操作 DOM 元素,可以突破 Axure 基础元件的限制,实现更灵活的页面联动。以下是对你描…...
百度飞桨OCR(PP-OCRv4_server_det|PP-OCRv4_server_rec_doc)文本识别-Java项目实践
什么是OCR? OCR(Optical Character Recognition,光学字符识别)是一种通过技术手段将图像或扫描件中的文字内容转换为可编辑、可搜索的文本格式(如TXT、Word、PDF等)的技术。它广泛应用于文档数字化、信息提取、自动化…...
救生衣穿戴检测数据集VOC+YOLO格式2171张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2171 标注数量(xml文件个数):2171 标注数量(txt文件个数):2171 …...
JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received.
环境: vllm 0.8.5 java 17 Qwen3-32B-FP8 问题描述: JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received. WARNING: Unsupported upgrade request. INFO: - "POST /v1/chat/completions HTTP/1.1&…...
信号量基础入门:并发控制的核心概念
问题的复杂性产生的根本原因在于,如 2.2 节所述,共享变量的访问始终是“单向信息流”。也就是说,一个进程可以分配新值或检查当前值,但这种检查不会为其他进程留下任何痕迹。结果是,当一个进程想要对共享变量的当前值作…...
物联网之使用Vertx实现HTTP/WebSocket最佳实践
小伙伴们,你们好呀,我是老寇,跟我一起学习使用Vertx实现HTTP-Server和WebSocket-Server 实现Http/WebSocket【响应式】 Vertx-Web地址 实现过程 查看源码 代码比较简单,懒得讲解啦 代码比较简单,懒得讲解啦 代码…...
【神经网络与深度学习】GAN 生成对抗训练模型在实际训练中很容易判别器收敛,生成器发散
引言部分 在深度学习领域,生成对抗网络(GAN)是一种强大的数据生成方法,它通过生成器(G)和判别器(D)之间的博弈来不断优化模型。然而,在实际训练过程中,GAN 往…...
使用 NGINX 的 `ngx_http_secure_link_module` 模块保护资源链接
一、模块简介 版本:自 NGINX 0.7.18 起引入 功能: 签名校验:对请求 URI 中的签名进行校验,保证链接未经篡改。时效控制:根据请求中携带的过期时间,判断链接是否仍在有效期。 启用方式:编译 NG…...
5月19日day30打卡
模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 一、导入官方库 …...
NW860NW894美光闪存颗粒NX770NX789
在数字化浪潮席卷全球的当下,数据存储技术的革新正以惊人的速度推动着硬件性能的边界。美光科技作为半导体存储领域的领军者,其NW860、NW894、NX770、NX789系列闪存颗粒凭借前沿架构与精密工艺,成为高性能存储解决方案的核心载体。本文将深入…...
高性能锁机制 CAS:Java 并发编程中的深度剖析
引言 在并发编程领域,i操作的非线程安全性是开发者们熟知的问题。这一现象根源在于i并非原子操作,其内部执行过程包含读取、修改和写入三个步骤,在多线程环境下极易因线程切换导致数据竞争与不一致,这与我们此前探讨的多线程常见问…...
leetcode 每日一题 1931. 用三种不同颜色为网格涂色
题目 1931. 用三种不同颜色为网格涂色 思路 先获取列表,上下左右的所有情况。解决一维的问题 然后所有一维的问题暴力循环。已知一个一维的解,可以对应其他一维解的列表(用于记忆化搜索) 然后使用递归,进行累加 代…...
解决Windows磁盘管理中因夹卷导致的无法分区问题
解决Windows磁盘管理中因夹卷导致的无法分区问题 在现代计算机管理中,磁盘分区是一个常见且重要的操作。无论是为了优化存储空间,还是为了实现多系统安装,合理的磁盘分区都是必不可少的。然而,许多用户在使用Windows磁盘管理工具…...
龙虎榜——20250519
上证指数缩量收十字星,个股涨多跌少,这周反弹的概率比较大。 深证指数缩量调整,临近反弹,个股表现更好。 2025年5月19日龙虎榜行业方向分析 化工(新能源材料国产替代) • 代表个股:红宝丽、…...
Python在自动驾驶数据清洗中的应用
Python在自动驾驶数据清洗中的应用 在自动驾驶领域,数据是算法的燃料。高质量的数据意味着更精准的模型,更稳定的驾驶体验。然而,原始数据通常充满噪声、缺失值、不一致格式,甚至有异常点,这些都会严重影响自动驾驶系统的可靠性。因此,数据清洗是一道绕不开的关卡。 一…...
腾讯云Mysql实现远程链接
1.SQL语句:CREATE USER remote_user% IDENTIFIED BY YourPassword; GRANT ALL PRIVILEGES ON *.* TO remote_user%; FLUSH PRIVILEGES; 2.设置入站规则 3.设置安全组 4.效果...
大模型(2)——提示工程(Prompt Engineering)
文章目录 一、提示工程的核心概念为什么需要提示工程? 二、提示设计的基本原则三、实用提示工程技巧1. 角色设定法2. 示例引导法(Few-Shot Learning)3. 分阶段提问4. 负面约束5. 温度(Temperature)控制 四、不同任务类…...
深入Java G1 GC调优:如何解决高延迟与吞吐量瓶颈
引言 Java的垃圾回收(GC)机制是JVM性能的核心,但即使是最先进的G1(Garbage-First)收集器,在复杂场景下仍可能引发长时间停顿(Stop-The-World, STW)或吞吐量骤降。许多开发者虽然熟…...
DAPO:用于指令微调的直接偏好优化解读
一、背景与动机:从RLHF到DPO,再到DAPO 大型语言模型(LLM)经过海量无监督预训练后,往往需要对齐人类偏好或遵循指令的微调,使模型的回答更符合人类期望。这一过程通常通过人类反馈强化学习(RLHF)来实现。例如OpenAI的ChatGPT就使用了RLHF:先让人工标注对模型输出进行偏…...
vue2、vue3项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息 和 前端项目的版本号json文件
vue2 打包生成text文件 和 前端项目的版本号json文件 项目打包生成txt文件-自动记录git版本、当前分支、提交人姓名、提交日期、提交描述等信息生成版本号json文件-自动记录当前版本号、打包时间等信息新建branch-version-webpack-plugin.js文件 // 同步子进程 const execSyn…...
iOS解码实现
import Foundation import VideoToolboxclass KFVideoDecoderInputPacket {var sampleBuffer: CMSampleBuffer? }class KFVideoDecoder {// MARK: - 常量private let kDecoderRetrySessionMaxCount 5private let kDecoderDecodeFrameFailedMaxCount 20// MARK: - 回调var pi…...
Windows中PDF TXT Excel Word PPT等Office文件在预览窗格无法预览的终级解决方法大全
Windows中PDF TXT Excel Word PPT等Office文件在预览窗格无法预览的终级解决方法大全 参考链接: https://zhuanlan.zhihu.com/p/454259765...