111,120
社区成员
发帖
与我相关
我的任务
分享
Common.Program.WriteObjectLog("law详细查询", new
{
this.Command
}, endTime: new DateTime(2018, 9, 30, 20, 0, 0));
#if DEBUG
return Search(query);
#else
try
{
return Search(query);
}
catch (Exception ex)
{
Common.Program.WriteObjectLog("law详细查询", new
{
query,
error = ex.ToString()
});
throw;
}
#endif这里首先使用条件编译语句,区分 BEBUG 和 Release,在 DEBUG 中根本不去 try...catch。
然后在 Release 的时候,在特定的日志文件中,记录了参数 query 和 异常堆栈信息。当出现错误的时候,你需要贴出特定的日志文件,查看当时的变量值和异常堆栈。如果贴不出来错误日志,那就不算是能够 debug。这就好像一个庸医不首先拿到诊断书,而是只能乱猜乱想什么以学书本上的教条。SELECT TOP 10 OBJECT_NAME(qt.objectid, qt.dbId) AS procName,
DB_NAME(qt.dbId) AS [db_name],
qt.text AS SQL_Full,
SUBSTRING(
qt.text,
(qs.statement_start_offset / 2) + 1,
(
(
CASE statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END
- qs.statement_start_offset
) / 2
) + 1
) AS SQL_Part --统计对应的部分语句
,
qs.creation_time,
qs.last_execution_time,
qs.execution_count,
qs.last_elapsed_time / 1000000 AS lastElapsedSeconds,
qs.last_worker_time / 1000000 AS lastCpuSeconds,
CAST(
qs.total_elapsed_time / 1000000.0 / (
CASE
WHEN qs.execution_count = 0 THEN -1
ELSE qs.execution_count
END
) AS DECIMAL(28, 2)
) AS avgDurationSeconds,
CAST(qs.last_logical_reads AS BIGINT) * 1.0 / (1024 * 1024) * 8060 AS
lastLogicReadsMB,
qs.last_logical_reads,
qs.plan_handle
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS p
WHERE qs.last_execution_time >= CONVERT(CHAR(10),GETDATE(),120)+' 08:00' --今天8点之后的慢SQL
AND qs.last_elapsed_time >= 3 * 1000 * 1000 --只取执行时间大于 3 秒的记录
AND qt.[text] NOT LIKE '%Proc_DBA%'
ORDER BY
qs.last_worker_time DESC
[/quote]
我用的sql2005执行不了额,
消息 102,级别 15,状态 1,第 36 行
'.' 附近有语法错误。
这一行 CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
从这里开始的,是一个添加语句,还有其他的修改语句。 日志一直到一点钟就没动静了,估计是网站挂了。
还有一个错误!!!刚刚看到
这个。这个也有可能。这个之前也出现过。后来百度说是缓存过期了,我按照上面说的把缓存时间改成100年了,现在还是报错了。这咋解决。
因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。[/quote]
你这个就是把结果当作原因,这不是找故障原因的正确方法。
这是今天凌晨报的错,早上七点多起来看网站就挂掉了SELECT TOP 10 OBJECT_NAME(qt.objectid, qt.dbId) AS procName,
DB_NAME(qt.dbId) AS [db_name],
qt.text AS SQL_Full,
SUBSTRING(
qt.text,
(qs.statement_start_offset / 2) + 1,
(
(
CASE statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END
- qs.statement_start_offset
) / 2
) + 1
) AS SQL_Part --统计对应的部分语句
,
qs.creation_time,
qs.last_execution_time,
qs.execution_count,
qs.last_elapsed_time / 1000000 AS lastElapsedSeconds,
qs.last_worker_time / 1000000 AS lastCpuSeconds,
CAST(
qs.total_elapsed_time / 1000000.0 / (
CASE
WHEN qs.execution_count = 0 THEN -1
ELSE qs.execution_count
END
) AS DECIMAL(28, 2)
) AS avgDurationSeconds,
CAST(qs.last_logical_reads AS BIGINT) * 1.0 / (1024 * 1024) * 8060 AS
lastLogicReadsMB,
qs.last_logical_reads,
qs.plan_handle
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS p
WHERE qs.last_execution_time >= CONVERT(CHAR(10),GETDATE(),120)+' 08:00' --今天8点之后的慢SQL
AND qs.last_elapsed_time >= 3 * 1000 * 1000 --只取执行时间大于 3 秒的记录
AND qt.[text] NOT LIKE '%Proc_DBA%'
ORDER BY
qs.last_worker_time DESC
因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。[/quote]
挂掉时30G,那么平时你看过吗?是多少呢
因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。[/quote]
真不是 bug .
我在 #3 的评论, 你仔细看完, 就会明白: 数据库最好不要跟应用放在一起。
数据库的争夺性非常强, 你没限制的话肯定会挤压 iis 的内存空间。
如果数据库的问题, 百度一下就能解决, DBA 就没有必要了。[/quote]
好 谢谢 新增服务器是没指望的,我们公司很穷的。。
如果是设置数据库的内存大小就是设置数据库里面最大服务器内存是吧?
因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。[/quote]
挂掉时30G,那么平时你看过吗?是多少呢[/quote]
平时一般维持在28G左右 到30G的时候就不行了。重启的话一般是从几G开始上涨
因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。[/quote]
真不是 bug .
我在 #3 的评论, 你仔细看完, 就会明白: 数据库最好不要跟应用放在一起。
数据库的争夺性非常强, 你没限制的话肯定会挤压 iis 的内存空间。
如果数据库的问题, 百度一下就能解决, DBA 就没有必要了。
因为每次网站挂掉的时候我去看内存都是数据库占了30G,然后重启就好了。。