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

  显示原文与译文双语对照的内容
0 0

需要MySQL的帮助,因为它实在不是我的专长。 因此任何感谢你的帮助。

问题在我的网站上怎么过 UPDATEINSERT人们不想使用灯泡的缺少值。 这会导致一些问题上其他函数的站点上,但我不是找不到的地方 UPDATEINSERT特技是在任何类。

有没有一种方法,也许MySQL触发器后,我才添加到这些表让我可以存储原始或完整查询的 UPDATEINSERT. 我试过记录但这适用于整个数据库和它占用太多磁盘空间。

提前感谢任何回复。

ps : 在目前来看PHP类有点乱,我们还在发展阶段,因此将例外情况添加到自动更新或插入函数所花费的时间太多。 所以请关注此问题的答案。 谢了。

时间:原作者:13个回答

0 0

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

SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID()

所以你需要做的是创建一个TRIGGER这是以前运行了INSERT或上UPDATE操作表如下:

  1. 获取当前语句
  2. 将其插入到名为'app_sql_debug_log'

好 ! 这是触发器声明 SQL

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 ;

你需要创建两个触发器一个用于更新查询,另一个用于插入查询。 触发器插入新查询中string的形式 app_sql_debug_log表的列称为 query

原作者:
0 0

我想你需要检查 General Query Log 你的数据库服务器。

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

原作者:
0 0

你一点也不需要需要将其记录到一个数据库中。

使用 file_put_contents与FILE_APPEND 并将其存储在文本文件使用tab分隔符或作为csv 。 这样可以方便地导入到数据库需要或查看文件时在Excel或Numbers ( 在Mac ) 在需要时随时。

可以记录文本文件通过日期,ie sql_queries_2012 05 24,并将其存储在文件夹里。 文本文件不应沦为更多空间比存储在数据库中。 一个简单的ifelse语句,与php日期函数,应该获取日志按日期排序。

使用文本文件显然更为经济的资源比将其储存在数据库中。 此外,使用 php fgetcsv 来索引和INSERT从文本文件在速度上远远超过使用my sql UPDATE 。

原作者:
0 0

如果不希望某个值缺少的数据库,你可以使用约束来设定上?

原作者:
0 0

Simple基于PHPSolution

使用override_functionPHP中重写 mysql_query使用自己的函数,可用于配置文件和/ 或记录任何有问题的查询。

rename_function('mysql_query', 'mysql_query_orig');
override_function('mysql_query', '$query', 'return override_mysql_query($query);');
function override_mysql_query($query)
{
    $result = mysql_query_orig($query);
    if (stripos($query, "mytablename") !== FALSE) {
        // log, echo, etc.
    }
    return $result;
}
原作者:
0 0

如果你的服务器有PHP 5 .3 .0或更高版本安装,则这可能有所帮助 http://www php .net/manual/en/mysqlnd .plugin php

原作者:
0 0

那么你可能需要启用 二进制日志,那么你可以查看每一个更新( note: 不是每个 ѯ ) 。 你只需添加。 --log-bin选项,然后查看所生成的日志使用 mysqlbinlog. 如有必要,可以启动数据库的副本从备份的位置处,开始在日志备份( 保存在备份中使用类似 --master-data选项设置为 mysqldump),并运行一次,直到你得到一个错误的行的更新。 然后,你知道哪些更新是罪魁祸首 你可以描述和( 或) 上使用二分查找最后那部分的长度记录,使其更快。

原作者:
...