我有一台 MySql 服务器,它有 2 个活动数据库用于 Web 应用程序,还有 3 个非活动数据库(用于存档,但当前未使用)。问题是服务器似乎正在运行异常数量的查询。例如,我重新启动服务器,一分钟内查询数量就会跳升至 800 - 然后它永远不会低于每秒 6 个查询。
为了进一步测试,我从活动和非活动数据库中删除了所有数据库用户,这样 Web 应用程序用户就无法连接到服务器。与服务器的远程连接也被禁用。与服务器关联的唯一剩余数据库用户是 PHPMyadmin 的用户。我让系统处于这种状态,这样就不会生成任何“真实查询”,现在我有以下数据:
自启动以来的网络流量:535 MiB
该 MySQL 服务器已运行 0 天 14 小时 41 分 26 秒。
自启动以来的问题数:31,858 每小时文档数:2,169 每分钟文档数:36
带有红旗(警告)的项目:
中止的客户端 2
中止的连接 1.1 k
创建的临时磁盘表 48
处理程序读取 rnd 17.9 k
处理程序读取 rnd next 3 M
Innodb 缓冲池读取 9.1 k
键读取 2.2 k
打开的表 757
慢查询 56
等待的表锁 5
我的服务器变量是附于此处
慢查询日志显示了我们从未在 Web 应用程序中编写的查询,例如:
SELECT /*!4001 SQL_NO_CACHE/* * FROM <tablename>
对于每个数据库中的每个表和一堆标记为“发送查询”,“延迟查询”,“SMTP 查询”等的大型联合查询。
我的问题是,在没有实际用户连接的情况下,我的服务器如何生成如此多的查询?这是正常的吗?我可以做些什么来改善这种情况吗?
答案1
你确定没有 cron 任务执行某些数据库查询吗?或者你的 MySQL 没有配置为使用其事件调度程序?
MySQL 事件是按照计划运行的任务。因此,我们有时将它们称为计划事件。创建事件时,您将创建一个命名的数据库对象,其中包含一个或多个 SQL 语句,这些语句将在一个或多个固定间隔内执行,并在特定日期和时间开始和结束。从概念上讲,这类似于 Unix crontab(也称为“cron 作业”)或 Windows 任务计划程序的概念。
答案2
这个问题已经有一段时间没有被问到了,但如果它对遇到它的人有帮助,一种方法是尝试打开通用查询日志来查看正在执行的所有查询(请参阅http://dev.mysql.com/doc/refman/5.5/en/query-log.html) 并查看是否有任何看起来很熟悉的内容。如果您不认识这些查询,您可以尝试对某些查询的部分内容执行递归 grep,以在服务器上找到它们所在的代码/脚本。