DBMS查询日志,有可能吗?

时间:2011-02-18 12:08:44

标签: sql mysql sql-server logging

我们想将所有数据库查询记录到日志表中,是否可能?

3 个答案:

答案 0 :(得分:4)

对于sql server,请参阅this answer about sql server profiler。对于mysql,the query log是一个解决方案。但是,它们都写入文件,但如果要查询数据,则可以始终解析日志文件并将其插入表中。

请注意,但是日志记录不是免费的。在这两种情况下,您都会看到性能下降。如果您只想记录应用程序的查询,则可以选择在那里记录查询(可选地,异步)。您必须进行测试才能看到最佳选择。

编辑:此外,根据您的流量,记录所有查询可能会在短时间内占用大量磁盘空间。如果您登录该应用程序,则可以使用具有翻转系统的nlog等日志记录库(即,如果日志文件达到> 100 MB,则开始删除最旧的文件)。在所有这三种情况下,您还可以留出仅用于记录的分区,以便它不会填满您的主硬盘。

答案 1 :(得分:2)

从SQL Server的角度来看......

正如其他人所建议的那样,SQL Server Profiler当然是一种可行的方法,但是你会因此而遭受资源冲击。如果您选择此方法,您绝对必须将其实现为服务器端跟踪而不是通过GUI。

您可能还会进行一些成功监控,记录动态管理视图(DMV)的内容,以查询查询执行统计信息。

您需要查看DMV,例如:

例如,这是一个查询,可用于通过CPU消耗来识别性能最差的前20个SQL查询。不完全是你所追求的,但它确实展示了如何使用你感兴趣的DMV。

SELECT TOP 20
    qs.sql_handle,
    qs.execution_count,
    qs.total_worker_time AS Total_CPU,
    total_CPU_inSeconds = --Converted from microseconds
        qs.total_worker_time/1000000,
    average_CPU_inSeconds = --Converted from microseconds
        (qs.total_worker_time/1000000) / qs.execution_count,
    qs.total_elapsed_time,
    total_elapsed_time_inSeconds = --Converted from microseconds
        qs.total_elapsed_time/1000000,
   st.text,
   qp.query_plan
FROM
    sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY qs.total_worker_time DESC

答案 2 :(得分:1)

我认为你不能写入数据库表,MYSQL可以将它们写入file,你可以编写一个脚本来解析文件并插入查询。