在插入或更新时获取完整的MySQL查询字符串

asy*_*qin 19 mysql logging triggers

需要MySQL的帮助,因为它不是我的强项.所以任何帮助都表示赞赏.

我的网站上存在问题,其中UPDATEINSERT缺少值.这导致网站上的其他功能出现一些问题,但我无法找到任何类中的UPDATEINSERT已完成的位置.

有没有什么办法,也许MySQL的触发器,我可以添加到这些表,让我保存的原件或完整的查询UPDATEINSERT.我尝试过记录,但这适用于整个数据库,它占用了太多的磁盘空间.

提前感谢您的回复.

PS:目前,PHP类有点乱,因为我们还处于开发阶段,因此在更新或插入函数中添加例外将花费太多时间.所以请把重点放在问题的答案上.再次感谢.

Ita*_*dev 36

您可以使用以下语句将当前SQL查询作为字符串获取:

SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID()
Run Code Online (Sandbox Code Playgroud)

所以你需要做的是创建一个TRIGGER在你的表上运行插入和/或更新操作的应该(i)获取当前的sql语句和(ii)将其插入另一个表,如下所示:

DELIMITER |

CREATE TRIGGER log_queries_insert BEFORE INSERT ON `your_table`
FOR EACH ROW
BEGIN
    DECLARE original_query VARCHAR(1024);
    SET original_query = (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());
    INSERT INTO `app_sql_debug_log`(`query`) VALUES (original_query);
END;
|
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

您将不得不创建两个触发器 - 一个用于更新,另一个用于插入.触发器将新查询作为字符串插入列中的app_sql_debug_log表中query.

  • 我总是得到SELECT info FROM ...作为最后一个查询..任何想法为什么? (2认同)

Rav*_*ddy 4

我认为您需要检查数据库服务器的 常规查询日志。

The server ... ... logs each SQL statement received from clients. ... ... Since MySQL 5.1.6 log can be a file or a table.

  • 这可行。将一般查询日志设置为保存到 log_table 中,并添加一个“INSERT”触发器,该触发器仅允许“LIKE '%INSERT %”和“LIKE '%tableA%'”的查询实际插入到 log_table 中(因此您节省空间) (3认同)
  • @ypercube - 好主意!但不确定间接费用是多少。 (2认同)