mysql 故障排除与优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: mysql 故障排除与优化

一    mysql 逻辑架构图

客户端和连接服务

核心服务功能

存储引擎层

数据存储层

二      msql单实例常见故障

1,  故障一

故障现象

问题分析

数据库未启动或者数据库端口被防火墙拦截

解决方法

启动数据库或者防火墙开放数据库监听端口

2,  故障二

故障现象

问题分析

密码不正确或者没有权限访问

解决方法

修改my.cnf主配置文件,在[mysqld]下添加skip-grant-tables(类似linux的单用户模式,改完密码记得把这个再注释掉)

update更新user表authentication string字段

重新授权

3,  故障三

故障现象

在使用远程连接数据库时偶尔会发生远程连接数据库很慢的问题

问题分析

DNS解析慢、客户端连接过多

解决方法

修改my.cnf主配置文件(增加skip-name-resolve参数)

数据库授权禁止使用主机名

4,  故障四

故障现象

问题分析

服务器非正常关机,数据库所在空间已满,或一些其它未知的原因,对数据库表造成了损坏

因拷贝数据库导致文件的属组发生变化

解决方法

修复数据表(myisamchk、phpMyAdmin)  不一定能成功

修改文件的属组      注意! 拷贝数据时 保留原数据的属主数组

5,  故障五

故障现象

问题分析

超出最大连接错误数量限制

解决方法

清除缓存(flush-hosts关键字)

修改mysql配置文件(maxconnecterrors=1000)

6,  故障六

故障现象

问题分析

连接数超出MySQL的最大连接限制

解决方法

修改MySQL配置文件(maxconnections=10000)

临时修改参数

7,  故障七

故障现象

问题分析

MySQL的配置文件/etc/my.cnf权限问题

解决方法

8,  故障八

故障现象

问题分析

innodb数据文件损坏

解决方法

修改my.cnf配置文件(innodb_force_recovery=4)

启动数据库后备份数据文件

利用备份文件恢复数据

三     mysql 主从环境常见故障

1,  故障一

故障现象

从库的Slave_l0_Running为NO

问题分析

主库和从库的server-id值一样

解决方法

修改从库的server-id的值,修改为和主库不一样

重新启动数据库并再次同步

2,  故障二

故障现象

从库的Slave l0 Running为NO

问题分析

主键冲突或者主库删除或更新数据,从库内找不到记录,数据被修改导致

解决方法

3,  故障三

故障现象

问题分析

从库的中继日志relay-bin损坏

解决方法

手工修复,重新找到同步的binlog和pos点,然后重新同步即可

四    mysq 常见优化

1,硬件优化

CPU:推荐使用S.M.P.架构的多路对称CPU

内存:4GB以上的物理内存

磁盘:RAID-0+1磁盘阵列或固态硬盘

2,mysql 配置文件优化

调整配置项

3,sql 优化

尽量使用索引进行查询

优化分页

GROUP BY优化

4,mysql 架构优化

架构选择:主从、主主、一主多从、多主多从

五     mysql 数据库性能优化相关命令

1,查看每个客户端IP过来的连接消耗了多少资源

mysql> select * from sys.x$host_summary;

2,查看某个数据文件上发生了多少IO请求。

mysql> select * from sys.x$io_global_by_file_by_bytes;

3, 查看每个用户消耗了多少资源

mysql> select * from sys.x$user_summary;

4,查看总共分配了多少内存

mysql> select * from sys.x$memory_global_total;

5, 数据库连接来自哪里,以及这些连接对数据库的请求情况是怎样的?

查看当前连接情况。

mysql> select host, current_connections, statements from sys.x$host_summary;

6,查看当前正在执行的SQL和执行show full processlist的效果相当

mysql> select conn_id, user, current_statement, last_statement from sys.x$session;

7,数据库中哪些SQL被频繁执行? 执行下面命令查询TOP10 SQL。

mysql> select db,exec_count,query from sys.x$statement_analysis order by exec_count desc limit 10;

8,哪个文件产生了最多的IO,读多,还是写的多?

mysql> select * from sys.x$io_global_by_file_by_bytes limit 10;

9,哪个表上的IO请求最多?

mysql> select * from sys.x$io_global_by_file_by_bytes where file like "%ibd" order by total desc limit 10;

您在尝试使用MySQL查询语句从sys.x$io_global_by_file_by_bytes系统视图中选择数据时遇到问题。该视图提供了关于文件级别的I/O操作统计信息,按照您的查询,您希望获取文件名中包含“ibd”(InnoDB表空间文件扩展名)的记录,并按total字段降序排列,最后显示前10条结果。

10 ,哪个表被访问的最多?

先访问statement_analysis,根据热门SQL排序找到相应的数据表。

哪些语句延迟比较严重?

查看statement_analysis中avg_latency的最高的SQL。

mysql> select * from sys.x$statement_analysis order by avg_latency desc limit 10;

11, 哪些SQL执行了全表扫描,如果没有使用索引,则考虑为大型表添加索引

mysql> select * from sys.x$statements_with_full_table_scans;

12, 列出所有做过排序的规范化语句

mysql> select * from sys.x$statements_with_sorting

13,哪些SQL语句使用了临时表,又有哪些用到了磁盘临时表

查看statement_analysis中哪个SQL的tmp_tables 、tmp_disk_tables值大于0即可。

mysql> select db, query, tmp_tables, tmp_disk_tables from sys.x$statement_analysis where tmp_tables>0 or tmp_disk_tables >0 order by (tmp_tables+tmp_disk_tables) desc limit 20;

14, 列出所有使用临时表的语句——访问最高的磁盘临时表,然后访问内存临时表

mysql>select * from sys.statements_with_temp_tables

15, 哪个表占用了最多的buffer pool?

mysql> select * from sys.x$innodb_buffer_stats_by_table order by allocated desc limit 10;

16,每个库(database)占用多少buffer pool?

mysql> select * from sys.x$innodb_buffer_stats_by_schema order by allocated desc limit 10;

六     总结

MySQL 常见的优化方法涵盖了许多方面,旨在提高查询性能、减少资源消耗和提升整体数据库系统的效率。以下是一些常见的MySQL优化策略:

  1. 选择合适的字段属性
  • 使用最适合数据特性和业务需求的数据类型,如使用INT而非VARCHAR存储整数。
  • 控制字段长度,如在不影响数据完整性的前提下,减小VARCHAR字段的最大长度。
  • 尽可能避免使用NULL,因为NULL值会增加存储开销且在查询时可能需要特殊处理。
  1. 创建和使用索引
  • 在频繁用于筛选、排序、关联的列上创建索引,尤其是主键和外键。
  • 选择合适的索引类型,如B-tree、Hash、全文索引等,依据查询模式和数据分布来决定。
  • 注意索引覆盖(covering index),即索引包含查询所需的所有列,以避免回表操作。
  • 定期分析和维护索引,删除冗余或很少使用的索引,监控并优化索引使用情况。
  1. 查询优化
  • 使用EXPLAIN分析查询计划,了解查询如何使用索引、进行全表扫描等情况,以便调整查询或索引设计。
  • 避免在WHERE子句中使用否定条件和复杂的表达式,这些可能妨碍索引的使用。
  • 减少IN子句中的值数量,大量值可能导致查询性能下降。
  • 明确指定SELECT语句中的字段名,避免使用SELECT *,特别是当表结构庞大时。
  • 当只需要单个结果时,使用LIMIT 1尽早终止查询。
  • 避免在未使用索引的列上进行排序,或者尽可能减少排序操作。
  1. 连接操作优化
  • 使用有效率的连接方式(如INNER JOIN、LEFT JOIN等),并确保关联字段上都有适当的索引。
  • 尽可能通过调整查询结构和添加适当索引来避免全表扫描和嵌套循环连接。
  • 在适当的情况下,使用JOIN替代子查询,因为JOIN通常能更有效地利用索引。
  1. 使用UNION替代临时表
  • 对于需要合并多个查询结果的情况,使用UNION而非手动创建临时表,以减少中间结果的存储和管理开销。
  1. 事务管理
  • 保持事务短小,避免长时间持有锁,减少死锁概率。
  • 合理设置事务隔离级别,平衡数据一致性与并发性能。
  1. 服务器参数调优
  • 根据服务器硬件、数据库负载和应用特点调整MySQL配置参数,如innodb_buffer_pool_sizequery_cache_sizemax_connections等。
  • 监控系统性能指标(如CPU、内存、磁盘I/O等),并据此调整参数。
  1. 数据分片与分区
  • 对于超大型表,考虑使用分表(水平拆分)或分区(垂直拆分)策略,分散数据和查询负载。
  • 选择合适的分片/分区键,确保数据分布均匀,查询能够高效路由。
  1. 缓存策略
  • 利用MySQL内置的查询缓存(如果适用),但需注意其在高并发场景下的局限性。
  • 对于读多写少的场景,考虑使用外部缓存系统(如Memcached、Redis)缓存热点数据。
  1. 定期维护与清理
  • 定期分析和优化表,如运行ANALYZE TABLEOPTIMIZE TABLE命令。
  • 清理不需要的数据,如归档旧数据、删除冗余记录,以减少数据规模和查询范围。

综上所述,MySQL优化是一个综合性的过程,涉及到数据库设计、查询编写、服务器配置、硬件资源等多个层面。实施优化时应结合实际业务场景,持续监控数据库性能,并根据性能分析结果进行有针对性的调整。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
13天前
|
SQL Java 关系型数据库
MYSQL--JDBC优化
MYSQL--JDBC优化
|
1月前
|
SQL 缓存 关系型数据库
下次老板问你MySQL如何优化时,你可以这样说,老板默默给你加工资
【5月更文挑战第20天】下次老板问你MySQL如何优化时,你可以这样说,老板默默给你加工资
39 3
|
25天前
|
SQL 关系型数据库 MySQL
使用mysql数据库的binlog应对故障
【6月更文挑战第1天】本文介绍`mysql的 binlog`工具用于解析MySQL的二进制日志,转换为可执行的SQL语句,主要用于数据库主从复制和增量恢复。定期备份和binlog推送能实现故障时的数据恢复。
55 9
使用mysql数据库的binlog应对故障
|
8天前
|
SQL 缓存 关系型数据库
MySQL慢查询优化实践问答
MySQL慢查询优化实践问答
|
12天前
|
缓存 关系型数据库 MySQL
如何优化MySQL 8.0的性能?
【6月更文挑战第14天】如何优化MySQL 8.0的性能?
47 5
|
10天前
|
关系型数据库 MySQL 数据库
mysql索引优化
【6月更文挑战第16天】mysql索引优化
15 2
|
14天前
|
缓存 监控 关系型数据库
mysql优化
【6月更文挑战第12天】mysql优化
22 3
|
19天前
|
SQL 关系型数据库 MySQL
MySQL大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化
|
19天前
|
存储 SQL 关系型数据库
MySQL数据库——SQL优化(1/3)-介绍、插入数据、主键优化
MySQL数据库——SQL优化(1/3)-介绍、插入数据、主键优化
234 1
|
22小时前
|
SQL 关系型数据库 MySQL
Mysql优化之索引相关介绍(笔记)
这段内容涵盖了创建MySQL用户表的SQL语句,创建一个包含`username`、`age`和`dept`字段的联合索引,以及关于联合索引查询时遵循的最左前缀原则的解释。
13 0