当前位置: 首页 > news >正文

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';
      

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
      
    • 注意事项:修复前务必备份数据库。
    • 修改文件属组(仅适合 Linux 和 FreeBSD 用户):确保数据库文件的属组为 MySQL 运行账号可读写,使用chownchmod命令修改文件属组和权限。

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 服务。
    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,启动数据库后备份数据文件。
    • 去掉该参数,利用备份文件恢复数据。

(二)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 性能优化总结

(一)三层优化体系协同

  1. 硬件层(基础支撑)

    • CPU:优先选择多核高频 CPU,尤其适合复杂查询(如 JOIN、分组聚合)场景,避免 CPU 成为瓶颈。
    • 内存:扩大 InnoDB 缓冲池(innodb_buffer_pool_size)以缓存更多数据,建议占物理内存 60%-80%,减少磁盘 I/O。
    • 磁盘:使用 SSD 替换 HDD,搭配innodb_io_capacity=2000等参数提升 IOPS;分离数据文件与日志文件到独立磁盘,降低 I/O 竞争。
  2. 配置层(资源调度)

    • 连接管理:通过max_connections限制并发连接数,配合thread_cache_size缓存线程,避免频繁创建线程消耗资源。
    • 缓冲与日志:调整innodb_log_file_size平衡事务提交速度与恢复时间;根据业务特性选择innodb_flush_log_at_trx_commit(如金融场景用 1,日志非敏感场景用 2)。
    • 查询优化参数:避免tmp_table_size过小导致磁盘临时表,或过大导致内存溢出;为排序、JOIN 等操作分配合理缓冲区(sort_buffer_sizejoin_buffer_size)。
  3. 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 个)。

八、故障排查实战建议

(一)单实例故障快速定位流程

  1. 连接类故障(优先排查)

    • 检查 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
      
  2. 权限与安全故障

    • 重置 root 密码时,确保在单用户模式下操作(添加skip-grant-tables后重启),避免未授权访问。
    • 授权时使用具体 IP 而非%(如'root'@'192.168.1.%'),减少安全风险;生产环境禁止使用GRANT ALL,按需分配权限(如SELECT, INSERT ON db.table)。
  3. 表损坏与数据恢复

    • MyISAM 表修复:
      # 备份后修复
      myisamchk -r /var/lib/mysql/数据库名/表名.MYI
      
    • InnoDB 表损坏:
      • 尝试innodb_force_recovery=4启动数据库并导出数据,恢复后需重建表结构。
      • 定期使用mysqldump或物理备份(如 Percona XtraBackup)预防数据丢失。

(二)主从复制故障排查步骤

  1. 基础连通性检查

    • 主库验证:
      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
      
  2. 常见同步问题处理

    • 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;
        

(三)优化效果验证方法

  1. 性能指标监控

    • 查看 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负载监控
      
  2. 慢查询分析

    • 导出慢查询日志:
      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)。
  3. 压力测试验证

    • 使用 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),验证性能提升效果。

九、生产环境最佳实践

(一)日常运维规范

  1. 定期备份策略

    • 全量备份:每周一次,使用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
      
    • 备份验证:定期恢复备份数据到测试环境,确保可用性。
  2. 监控报警体系

    • 核心指标报警:
      • 连接数超过max_connections*80%时报警。
      • 慢查询数每小时超过 10 条时触发预警。
      • 磁盘空间使用率超过 80% 时报警(df -h)。
    • 监控工具:使用 Prometheus+Grafana 组合,采集 MySQL 状态数据并可视化,设置阈值触发邮件 / 短信报警。
  3. 版本与补丁管理

    • 生产环境使用稳定版本(如 MySQL 8.0.34),避免使用开发版或早期版本(如 8.0.11 存在 InnoDB 崩溃漏洞)。
    • 定期更新安全补丁,测试环境验证后再部署至生产(如修复 CVE-2023-32663 远程代码执行漏洞)。

(二)高可用架构设计

  1. 主从 + 读写分离

    • 应用层通过中间件(如 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)
      
  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
      
  3. 分布式架构扩展

    • 当单集群无法承载业务压力时,采用分库分表(如按用户 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故障排查与生产环境优化

目录 一、前置知识点&#xff1a;MySQL 逻辑架构解析 &#xff08;一&#xff09;客户端和连接服务层&#xff08;最上层&#xff09; &#xff08;二&#xff09;核心服务层&#xff08;第二层&#xff09; &#xff08;三&#xff09;存储引擎层 &#xff08;四&#xf…...

mysql故障排查与环境优化

一、mysql运行原理 mysql的运行分为三层 客户端和连接服务 核心服务功能&#xff08;sql接口、缓存的查询、sql的分析和优化以及部分内置函数的执行等。&#xff09; 存储引擎层&#xff08;负责mysql中数据的存储和提取。&#xff09; 二、示例 1、实验环…...

博图1200硬件组态与启保停程序编写步骤详解

一、前言 在工业自动化控制领域&#xff0c;西门子S7-1200 PLC因其性能稳定、编程灵活而广受欢迎。本文将详细介绍使用TIA Portal&#xff08;博图&#xff09;软件进行S7-1200 PLC硬件组态以及编写基本启保停程序的完整步骤&#xff0c;帮助初学者快速掌握这一基础而重要的技…...

深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践

深入解析Java微服务架构&#xff1a;Spring Boot与Spring Cloud的整合实践 引言 随着云计算和分布式系统的快速发展&#xff0c;微服务架构已成为现代软件开发的主流模式。Java作为企业级应用开发的核心语言&#xff0c;结合Spring Boot和Spring Cloud的强大生态&#xff0c;…...

AM32电调学习解读九:ESC上电启动关闭全流程波形分析

这是第九篇&#xff0c;前面的文章把各个模块的实现都介绍了一轮&#xff0c;本章是从运行的角度结合波形图&#xff0c;把整个流程走一遍。 先看下一运行的配置&#xff0c;我把一些配置关闭了&#xff0c;这样跑起来会好分析一些&#xff0c;不同配置跑起来效果会有差异。使用…...

迅联文库开发日志(三)登陆注册

目录 一、注册 Controller层 Service层 二、登录 其他需要注意的&#xff1a; 需要实现 Serializable 的场景​ 一、注册 先思考我们需要哪些参数&#xff1a; 邮箱、昵称、密码、邮箱验证码 &#xff08;图片验证码会调用checkCode()验证&#xff09; Controller层 Req…...

Oracle 数据库的默认隔离级别

Oracle 数据库的默认隔离级别 默认隔离级别&#xff1a;READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别&#xff0c;这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…...

PDF 合并测试:性能与内容完整性

我们一直在改进 PDF 合并工具 JPedal&#xff0c;并希望通过测试对比其与其他工具的表现。该工具支持合并包括大文件在内的完整文档。 如何测试 PDF 合并输出 我们在示例文件上进行了对比测试&#xff0c;您也可以用自有文件复现。 测试中使用的方法之一是借助 Adobe Reader&a…...

白杨SEO:不到7天,白杨SEO博客网站百度搜索显示和排名恢复正常!顺带说说上海线下GEO聚会分享和播客红利

大家好&#xff0c;我是白杨SEO&#xff0c;专注SEO十年以上&#xff0c;全网SEO流量实战派&#xff0c;AI搜索优化研究者。 5月开始&#xff0c;明显就忙起来了&#xff0c;不管是个人陪跑还是企业顾问&#xff0c;不管是需要传统SEO还是新媒体流量&#xff0c;还是当下这个A…...

docker介绍与常用命令汇总

docker简介 docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;它可以让开发者将应用与运行环境打包成一个标准的、可移植的容器&#xff08;Container&#xff09;&#xff0c;在任何地方都可以快速部署和运行&#xff0c;无需关心底层环境是否一致。 …...

Axure设计数字乡村可视化大屏:构建乡村数据全景图

今天&#xff0c;让我们一同深入了解由Axure设计的数字乡村可视化大屏&#xff0c;看看它如何通过精心的布局和多样化的图表类型&#xff0c;将乡村的各类数据以直观、易懂的方式呈现出来&#xff0c;为乡村管理者提供有力的数据支持。 原型效果预览链接&#xff1a;Axure数字乡…...

c#基础01(.Net介绍)

文章目录 .Net平台介绍.Net平台简介跨平台开源.Net Core.Net Framework开发工具安装选项 创建项目 .Net平台介绍 .Net平台简介 .NET是一种用于构建多种应用的免费开源开放平台&#xff0c;例如&#xff1a; Web 应用、Web API 和微服务 云中的无服务器函数 云原生应用 移动…...

GraphQL在.NET 8中的全面实践指南

一、GraphQL与.NET 8概述 GraphQL是一种由Facebook开发的API查询语言&#xff0c;它提供了一种更高效、更灵活的替代REST的方案。与REST不同&#xff0c;GraphQL允许客户端精确指定需要的数据结构和字段&#xff0c;避免了"过度获取"或"不足获取"的问题。…...

开源音视频转文字工具:基于 Vosk 和 Whisper 的多语言语音识别项目

背景介绍 随着短视频、播客等音视频内容的爆发式增长&#xff0c;快速将音视频内容转换为文字的需求也越来越大。无论是内容创作者需要的字幕&#xff0c;还是企业需要的会议记录&#xff0c;都需要一个可靠的语音转文字解决方案。 技术架构 本项目采用双引擎架构&#xff0…...

Playwright 多语言一体化——Python_Java_.NET 全栈采集实战

在现代 Web 自动化领域&#xff0c;Playwright 通过其多语言支持可在 Python、Java 及 .NET 三大生态中共享同一底层实现&#xff0c;简化了跨团队协作与维护成本 。然而&#xff0c;若忽略代理IP等必要配置&#xff0c;很容易导致功能异常或被目标网站限制&#xff0c;本文将以…...

【Linux网络】传输层协议UDP

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 &#x1f525; 系列专栏&#xff1a;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指针的理解&#xff08;结合汇编&#xff09; int i; char *p; p(char *) i; *pi &0x0f;p(char *) i; *pi &0x0f;MOV ECX,i MOV BYTE [ECX],(i &0x0f) 如果一开始不给p赋值&#xff0c;p的内存地址不确定&#xff0c;也就是这个ECX里的值不确定&#x…...

计算机视觉与深度学习 | Python实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据

以下是一个结合ARIMA、鲸鱼优化算法(WOA)、CNN和LSTM进行时间序列预测的Python实现框架。由于完整代码和数据量较大,此处提供核心代码结构和示例数据集,您可根据需求扩展。 1. 数据准备(示例数据) 使用airline-passengers.csv(航空乘客数据集): import pandas as pd…...

SCGI 服务器详解

1 协议与报文格式 项目说明连接类型长连接&#xff0c;单条 TCP/UnixSocket 可传多请求&#xff1b;由前端&#xff08;Nginx 等&#xff09;维护 keep-alive。报文分段"<len>:" <header netstring> "," <body><len> 计数10 进…...

Linux问题排查-找到偷偷写文件的进程

在 Linux 系统中&#xff0c;若要通过已修改的文件找到修改该文件的进程 PID&#xff0c;可以结合以下方法分析&#xff0c;具体取决于文件是否仍被进程打开或已被删除但句柄仍存在&#xff1a; 一、文件仍被进程打开&#xff08;未删除&#xff09; 如果文件当前正在被某个进…...

Linux的权限问题

引入&#xff1a;权限的意义是什么&#xff1f; 权限就是为了让人能做某些事或不能做某些事 一&#xff1a;Linux下的用户种类 Linux下只有两种用户&#xff1a;root 和 普通用户 root&#xff1a;拥有至高无上的权限&#xff0c;任何的权限都不能限制root 普通用户&#xf…...

WPF技巧-BindingProxy

WPF技巧-BindingProxy 文章目录 WPF技巧-BindingProxy&#x1f50d; 分析与解释1. **继承 Freezable**2. **重写 CreateInstanceCore 方法**3. **定义 DependencyProperty&#xff1a;Data** ✅ 使用场景场景说明&#xff1a;解决方案&#xff1a;示例 XAML&#xff1a; &#…...

深度解析:Redis 性能优化全方位指南

Redis 作为当前最流行的内存数据库之一&#xff0c;以其高性能、低延迟和丰富的数据结构支持&#xff0c;被广泛应用于缓存、消息队列、实时统计等场景。然而&#xff0c;随着业务规模的增长&#xff0c;Redis 可能面临性能瓶颈&#xff0c;如高延迟、内存不足、吞吐量下降等问…...

OpenHarmony外设驱动使用 (五),Fingerprint_auth

OpenHarmony外设驱动使用 &#xff08;五&#xff09; Fingerprint_auth 概述 功能简介 指纹认证是端侧设备不可或缺的功能&#xff0c;为设备提供用户认证能力&#xff0c;可应用于设备解锁、支付、应用登录等身份认证场景。用户注册指纹后&#xff0c;指纹认证模块就可为设…...

.NET外挂系列:2. 了解强大的 harmony 注解特性

一&#xff1a;背景 1. 讲故事 上一篇我们简单的聊了下harmony外挂的基本玩法&#xff0c;让大家宏观上感受到了外挂在 .NET高级调试 领域的威力&#xff0c;这一篇我们从 注解特性 这个角度继续展开。 二&#xff1a;harmony 注解特性 1. HarmonyPatch 解读 在harmony支持…...

【Arm】应用ArmDS移植最小FreeRTOS系统

一、文档背景 FreeRTOS&#xff08;Free Real-Time Operating System&#xff09;是一个开源的实时操作系统内核&#xff0c;广泛应用于嵌入式系统。它具有小巧、灵活、低功耗等特点&#xff0c;支持多任务调度、信号量、队列等实时操作系统基本功能。 将FreeRTOS移植到特定硬…...

Python----目标检测(labelimg和labelme的安装与使用,Pycharm配置教程)

一、labelimg labelimg是一款开源的图像标注工具&#xff0c;标签可用于分类和目标检测&#xff0c;它是用python写的&#xff0c;并使用Qt作为其图形界面&#xff0c;简单好用&#xff08;虽然是英文版的&#xff09;。其注释以 PASCAL VOC格式保存为XML文件&#xff0c;这是I…...

Axure跨页面交互:利用IFrame和JS实现父子页面菜单联动

在 Axure 中使用内联框架&#xff08;IFrame&#xff09;进行父子页面间的通信是一个非常有效的技巧&#xff0c;尤其是在需要实现复杂交互逻辑时。通过 JavaScript 直接操作 DOM 元素&#xff0c;可以突破 Axure 基础元件的限制&#xff0c;实现更灵活的页面联动。以下是对你描…...

百度飞桨OCR(PP-OCRv4_server_det|PP-OCRv4_server_rec_doc)文本识别-Java项目实践

什么是OCR? OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是一种通过技术手段将图像或扫描件中的文字内容转换为可编辑、可搜索的文本格式&#xff08;如TXT、Word、PDF等&#xff09;的技术。它广泛应用于文档数字化、信息提取、自动化…...

救生衣穿戴检测数据集VOC+YOLO格式2171张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2171 标注数量(xml文件个数)&#xff1a;2171 标注数量(txt文件个数)&#xff1a;2171 …...

JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received.

环境&#xff1a; vllm 0.8.5 java 17 Qwen3-32B-FP8 问题描述&#xff1a; JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received. WARNING: Unsupported upgrade request. INFO: - "POST /v1/chat/completions HTTP/1.1&…...

信号量基础入门:并发控制的核心概念

问题的复杂性产生的根本原因在于&#xff0c;如 2.2 节所述&#xff0c;共享变量的访问始终是“单向信息流”。也就是说&#xff0c;一个进程可以分配新值或检查当前值&#xff0c;但这种检查不会为其他进程留下任何痕迹。结果是&#xff0c;当一个进程想要对共享变量的当前值作…...

物联网之使用Vertx实现HTTP/WebSocket最佳实践

小伙伴们&#xff0c;你们好呀&#xff0c;我是老寇&#xff0c;跟我一起学习使用Vertx实现HTTP-Server和WebSocket-Server 实现Http/WebSocket【响应式】 Vertx-Web地址 实现过程 查看源码 代码比较简单&#xff0c;懒得讲解啦 代码比较简单&#xff0c;懒得讲解啦 代码…...

【神经网络与深度学习】GAN 生成对抗训练模型在实际训练中很容易判别器收敛,生成器发散

引言部分 在深度学习领域&#xff0c;生成对抗网络&#xff08;GAN&#xff09;是一种强大的数据生成方法&#xff0c;它通过生成器&#xff08;G&#xff09;和判别器&#xff08;D&#xff09;之间的博弈来不断优化模型。然而&#xff0c;在实际训练过程中&#xff0c;GAN 往…...

使用 NGINX 的 `ngx_http_secure_link_module` 模块保护资源链接

一、模块简介 版本&#xff1a;自 NGINX 0.7.18 起引入 功能&#xff1a; 签名校验&#xff1a;对请求 URI 中的签名进行校验&#xff0c;保证链接未经篡改。时效控制&#xff1a;根据请求中携带的过期时间&#xff0c;判断链接是否仍在有效期。 启用方式&#xff1a;编译 NG…...

5月19日day30打卡

模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 一、导入官方库 …...

NW860NW894美光闪存颗粒NX770NX789

在数字化浪潮席卷全球的当下&#xff0c;数据存储技术的革新正以惊人的速度推动着硬件性能的边界。美光科技作为半导体存储领域的领军者&#xff0c;其NW860、NW894、NX770、NX789系列闪存颗粒凭借前沿架构与精密工艺&#xff0c;成为高性能存储解决方案的核心载体。本文将深入…...

高性能锁机制 CAS:Java 并发编程中的深度剖析

引言 在并发编程领域&#xff0c;i操作的非线程安全性是开发者们熟知的问题。这一现象根源在于i并非原子操作&#xff0c;其内部执行过程包含读取、修改和写入三个步骤&#xff0c;在多线程环境下极易因线程切换导致数据竞争与不一致&#xff0c;这与我们此前探讨的多线程常见问…...

leetcode 每日一题 1931. 用三种不同颜色为网格涂色

题目 1931. 用三种不同颜色为网格涂色 思路 先获取列表&#xff0c;上下左右的所有情况。解决一维的问题 然后所有一维的问题暴力循环。已知一个一维的解&#xff0c;可以对应其他一维解的列表&#xff08;用于记忆化搜索&#xff09; 然后使用递归&#xff0c;进行累加 代…...

解决Windows磁盘管理中因夹卷导致的无法分区问题

解决Windows磁盘管理中因夹卷导致的无法分区问题 在现代计算机管理中&#xff0c;磁盘分区是一个常见且重要的操作。无论是为了优化存储空间&#xff0c;还是为了实现多系统安装&#xff0c;合理的磁盘分区都是必不可少的。然而&#xff0c;许多用户在使用Windows磁盘管理工具…...

龙虎榜——20250519

上证指数缩量收十字星&#xff0c;个股涨多跌少&#xff0c;这周反弹的概率比较大。 深证指数缩量调整&#xff0c;临近反弹&#xff0c;个股表现更好。 2025年5月19日龙虎榜行业方向分析 化工&#xff08;新能源材料国产替代&#xff09; • 代表个股&#xff1a;红宝丽、…...

Python在自动驾驶数据清洗中的应用

Python在自动驾驶数据清洗中的应用 在自动驾驶领域,数据是算法的燃料。高质量的数据意味着更精准的模型,更稳定的驾驶体验。然而,原始数据通常充满噪声、缺失值、不一致格式,甚至有异常点,这些都会严重影响自动驾驶系统的可靠性。因此,数据清洗是一道绕不开的关卡。 一…...

腾讯云Mysql实现远程链接

1.SQL语句&#xff1a;CREATE USER remote_user% IDENTIFIED BY YourPassword; GRANT ALL PRIVILEGES ON *.* TO remote_user%; FLUSH PRIVILEGES; 2.设置入站规则 3.设置安全组 4.效果...

大模型(2)——提示工程(Prompt Engineering)

文章目录 一、提示工程的核心概念为什么需要提示工程&#xff1f; 二、提示设计的基本原则三、实用提示工程技巧1. 角色设定法2. 示例引导法&#xff08;Few-Shot Learning&#xff09;3. 分阶段提问4. 负面约束5. 温度&#xff08;Temperature&#xff09;控制 四、不同任务类…...

深入Java G1 GC调优:如何解决高延迟与吞吐量瓶颈

引言 Java的垃圾回收&#xff08;GC&#xff09;机制是JVM性能的核心&#xff0c;但即使是最先进的G1&#xff08;Garbage-First&#xff09;收集器&#xff0c;在复杂场景下仍可能引发长时间停顿&#xff08;Stop-The-World, STW&#xff09;​或吞吐量骤降。许多开发者虽然熟…...

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文件在预览窗格无法预览的终级解决方法大全 参考链接&#xff1a; https://zhuanlan.zhihu.com/p/454259765...