我负责维护网站托管服务器,服务器经常会因为负载增加或大量 CPU 资源被占用而变慢。我发现 MySQL 的使用导致负载大幅增加,服务器变得非常缓慢,但我想找出哪个用户导致了 MySQL 使用率过高?
答案1
可以以SHOW PROCESSLIST;
MySQL 管理用户的身份通过 MySQL CLI 进行相当基本的操作来完成此操作。
如果有一个进程需要终止,一个简单的操作KILL <query Id>;
就可以解决。
这个开发箱里什么也没有发生,但它是您在输出中看到的一个示例:
mysql> show processlist;
+----+------+-----------+--------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+--------+---------+------+-------+------------------+
| 7 | root | localhost | wikidb | Query | 0 | NULL | show processlist |
+----+------+-----------+--------+---------+------+-------+------------------+
如您所见,它显示有关运行查询的数据库、运行时、查询状态和查询内容的有用信息。
答案2
我确实同意@Michael Hampton 和@Adrian 的回复,但我想补充我自己的建议 - 尝试登录服务器并运行以下命令:
[~]# watch mysqladmin pr
这样应该会显示正在访问的数据库和执行的查询,添加“watch”将监视和刷新列表。如果任何数据库使服务器超载,您可以尝试运行以下命令:
service mysql stop
myisamchk -r /var/lib/mysql/dbname/*.MYI
service mysql start
如果重启后问题仍然存在,您可能需要优化查询或限制用户对 MySQL 服务器资源的访问。
答案3
另一个好的建议是启用查询日志/将慢查询时间设置得较低并查看这些日志/使用这样的工具percona 工具包来解析它们。
我们亲自利用玛拉雅数据库MySQL 的构建版本具有用户统计应用补丁程序对其进行修改information_schema
以包含有用的数据,例如使用的 CPU 时间、繁忙时间等等。
例子:
+------------------+----------+-----------+--------------+--------------+
| USER | CPU_TIME | BUSY_TIME | ROWS_FETCHED | ROWS_UPDATED |
+------------------+----------+-----------+--------------+--------------+
| xxx_agaipdf | 208850 | 219735 | 372405321 | 950924 |
| xxx_pdfseus | 179626 | 196981 | 145208779 | 771474 |
| xxx_gopdf | 177303 | 191366 | 323861619 | 653246 |
| xxx_nextuse | 140624 | 153672 | 37374285 | 425618 |
| xxx_gospel | 135814 | 142874 | 65301676 | 491579 |
+------------------+----------+-----------+--------------+--------------+