Kev 建议这个问题(/sf/ask/736748701/)更适合这里。
我知道 phpMyAdmin 可以显示 MySQL vars 和类似内容的列表。
但是我很想有一个脚本来显示,例如,如果 MySQL 配置或一些图形工具有问题来查看当前的 MySQL 健康状态。
有这样的事情吗?例如,我如何知道当前设置是否对我的机器不利?
假设我将 innodb 缓冲池大小设置为 64MB,而我的一个 INNODB 表是 1GB。这一点都不好。这只是 innodb 池大小的一个例子。我认为可能还有许多其他设置需要注意基于 Web 的脚本可以帮助监控。
yes123 提出的问题非常相关,因为我们都想知道我们可以做些什么来提高 MySQL 的性能,而无需触及消耗该数据的应用程序。什么是能让一切变得更好的完美配置?尽管没有一个程序可以直接输出这种完美的配置,但还是有一些方法可以在不涉及任何代码的情况下显着提高服务器的效率。首先,我从服务器的健康状况以及该服务器注定要提供的数据类型开始。
了解 MySQL 数据库服务器的健康状况以及如何更好地配置它必须包括基于大量变量的许多因素。您的 MySQL 服务器用于什么用途,博客、电子商务、报告?您使用的主要引擎是什么,InnoDB、MyISAM?什么是操作系统、Windows、Linux、Unix?是否涉及复制?
了解这一点很重要,因为配置 MySQL 的方式取决于所有这些因素,还取决于安装 MySQL 的机器的健康状况。通常,人们很快将系统范围的问题归咎于 MySQL。如果您在只有 1 个 CPU、1Gb 内存的服务器上设置 Magento,并且由于有 1000 个同时在 Apache 上竞争而导致内存不足,这是 MySQL 的错吗?显然不是。
所以在你开始问自己 MySQL 做得怎么样之前,问问自己,它安装的服务器怎么样?
例如,在处理 Linux 服务器时,以下是我执行一般健康检查的步骤
对于 Windows Server,我将使用 perfmon 或 process explorer。
如果我没有剩余磁盘空间,没有剩余内存和/或您的网络带宽已饱和,则可能不是 MySQL 的错。由于 MySQL 停止工作或超时,我可能认为 MySQL 是另一个问题的受害者的原因
一个很好的免费 linux 图形程序称为 ksar http://sourceforge.net/projects/ksar/。您可以使用ksar根据 sar 服务收集的统计信息生成图表。sar 可以很容易地安装在 debian 和 centos 上,并收集有关内存、cpu、磁盘、网络使用情况的统计信息。sar 本身就以数字报告的形式为您提供这些信息。ksar 更进一步,将这些信息放入基于时间的图表中,这些图表有助于在一天中的任何给定时间点或从过去的任何给定日期可视化您的服务器的健康状况。
在 Windows 中,您需要一些可以做同样事情的东西,比如 Process Explorer http://technet.microsoft.com/en-us/sysinternals/bb896653或 perfmon。ksar 和 process explorer 都是免费的。
一旦我消除了服务器或其他应用程序(如 Apache)可能的罪魁祸首,那就是我开始研究 MySQL 的时候。
如果有的话,我将从 MySQL 的错误日志开始,然后查找磁盘空间错误、表损坏错误或其他突出的消息。如果我没有看到任何异常,我会转到我最喜欢的工具 Jet Profiler http://www.jetprofiler.com。
Jet Profiler为您提供给定时间段内 MySQL 服务器状态的实时统计信息。这比任何给定时刻的简单活动快照要有用得多。了解您的服务器在低高峰和高峰时段的行为将最终揭示您基础设施的薄弱环节,而这正是 Jet Profiler 的用武之地。它的分析和统计基于服务器随时间推移的工作负载。
查找有问题的查询
作为第一步,我尝试确定哪些有问题的查询。检查顶级查询和慢速查询,并比较每个查询的相对线程负载。也许,其中一些会从其他人中脱颖而出(根据 90/10 左右的规则)。这些是需要重点关注的查询,因为它们将在每次修复时提供最大的性能改进。
负载模式
负载模式也可能是服务器在大部分时间都运行良好,但有时会出现重复出现的峰值。放大峰值以发现在该时间范围内哪些查询很重,这将非常有帮助。即,如果您有每天运行一次的繁重 cron 作业,它们可能不会在过去 24 小时内在热门查询中显示得太高,因此您可能不会考虑它们。然而,它们仍然会导致如此多的负载和拥塞,以至于服务器在午夜时分变得非常慢。我分析的一个数据库具有这种模式 - 开发人员添加了每天进行各种清理、存档和统计计算的 cron 作业。问题是所有的工作都是从 0 0 * * * 开始的。虽然服务器可以处理一两个这样的工作并仍然为普通的网站访问者提供服务,但 5 个以上的并发工作太多了。所以网站每半夜就会宕机一两分钟。但是除非我们查看那个特定的峰值,否则这些查询可能不会出现。
更进一步,我继续讨论特定于我的 MySQL 表使用 MyISAM 或 InnoDB 的引擎的统计信息。
在此之前,我问自己一个重要的问题。数据库主要是 InnoDB 表还是 MyISAM 表?
use database;
show table status \G;
*************************** 148. row ***************************
Name: sometable
Engine: InnoDB
Run Code Online (Sandbox Code Playgroud)
MySQL 中的许多生产数据库混合了 InnoDB 和 MyISAM。这需要为两个引擎优化 MySQL。
InnoDB 特定信息
MyISAM 具体信息
锁定查询:由于锁定,查询很容易在 MyISAM 表中相互阻塞。Jet Profiler 将显示哪些查询被锁定以及锁定在哪些表上。然后,您可以通过将表引擎从 MyISAM 切换到 InnoDB 来轻松解决此问题。
MyISAM 缓存:这也应该尽可能接近 100%。如果没有,您可以增加密钥缓冲区缓存以解决问题和/或构建更好的索引。
接下来我看看全球正在发生什么。
全球因素
关联 KSAR 和 Jet Profiler 统计数据
使用 Ksar 和 Jet Profiler 的图表,您实际上可以将服务器性能图表与 MySQL 的性能图表相关联。当 MySQL 开始运行该批处理作业时,服务器的行为如何。如果您在 MySQL 处理大量导入时发现 KSAR 中存在大量主要页面错误,而当 MySQL 为 1000 个并发用户提供服务时,您在 Jet Profiler 中看到它作为 Top Query 运行,您可以简单地运行导入。没有那么多传入连接。
然后还有其他因素,例如是否打开了跳过名称解析功能。如果 MySQL 必须花时间解析域名,那么它花在检索数据上的时间就更少了。我还查看了查询计划缓存以确保它也是 100%
就网络解决方案而言。我开始发现 Zabbix http://www.zabbix.com/的乐趣。它旨在同时监控多个服务器,但能够提供有关 MySQL 和所有类型的服务器和技术的非常精确的详细信息。
有可能拥有完美的配置。通过对操作系统的全面了解、对服务器健康状况的智能分析、其处理的查询以及您要求它处理的工作负载类型,您可以只关注那些需要您注意的领域。只需向缓冲池增加几 GB 或获得更快的磁盘可能会提高服务器的性能,但是为什么要花钱购买内存和更快的磁盘,因为解决方案可能只需要花费几个小时来分析服务器的工作负载及其工作方式即使您不在那里监视它,也会表现得很好。