我有一个 INSERT 查询,它将订单添加到 DB,它已在生产服务器上成功运行了几年,今天大约 10% 的 INSERT 尚未出现在 DB 表中,运行此查询的代码没有任何变化所以我假设这是基于性能的,因为服务器最近肯定承受着更重的负载。
该表是 MyISAM,在 CentOS 服务器上运行约 90,000 条记录。
是否有任何故障排除方法来查看为什么查询没有插入数据,因为我觉得服务器本身就是瓶颈?
答案1
高负载不会导致 MySQL 盲目地放弃 INSERT 查询。我猜你的应用程序在连接到数据库时可能会出错,因此 MySQL 从未真正收到 INSERT 查询。我建议检查你的代码,以确保你正确地捕获和记录数据库错误。
顺便说一句,你真的已检查查看服务器是否正在经历高负载。您说这个表有 90k 条记录(实际上非常小),但您没有给出服务器每秒处理的查询数。运行top
以查看高峰使用期间的平均负载,不仅要注意平均负载本身,还要注意进程处于 iowait 状态的时间百分比(%wa
中的值top
)
答案2
我还怀疑代码在执行过程中忽略了一个错误。可能的原因:
- MySQL 连接数已达到上限(参见 ErikA 的回答)。基本上,服务器无法获取 INSERT 查询。检查连接数(“SHOW GLOBAL STATUS;”中的threads_connected 与 max_connections 进行比较)。
- 参数错误,INSERT 失败,但错误被忽略。启用 MySQL 查询日志以查看服务器是否收到带有错误参数的查询
- 代码在发送查询之前失败(例如由于魔术参数转换)。检查 php 错误日志/web 服务器错误日志。