我还不太了解如何提出这个问题,因为我们还不了解,但是我想提早提出,因为这看起来像是不容忽视的事情。
本周,我们开始遇到数据库服务器的问题。它似乎是一个数据一致性问题,甚至在非常简单的查询和小型表上也通过超时来体现。我们通过在本周早些时候重新启动服务器来“解决”该问题,但该问题消失了,但是现在看来它又回来了,这次是在更关键的表上。例如,我刚刚进行了一些调查,并且正在查看这样的查询:
SELECT * FROM table WHERE id = 1234
特定的ID。该表有大约30+百万行。但是,似乎只有一小部分记录会发生这种情况。我敢打赌,当我重新启动服务器或备份并在另一台服务器上还原数据库时,一切都会好的。但是我会努力的。
此时,我正在运行:
DBCC CHECKTABLE ('table', NOINDEX)
但似乎它将永远持续下去。当我们第一次遇到问题时,我检查了违规表,一切都很好。这个新桌子更大了。
一些背景技术信息:
- SQL Server 2008 R2,Windows Server 2008 R2
- AWS / EC2,m2.2xlarge,32 GB RAM,4 x 1TB RAID 0
- 几乎没有磁盘IO,似乎大多数数据库都在内存中
- 总数据库大小:100GB
ELB卷是“全新的”。我们本周创建了它们。
编辑:我只是使用以下命令:
SELECT
sqltext.TEXT,
req.session_id,
req.blocking_session_id,
req.wait_type,
req.wait_time,
req.last_wait_type,
req.wait_resource,
req.open_transaction_count,
req.transaction_id,
req.total_elapsed_time
FROM
sys.dm_exec_requests req
CROSS APPLY
sys.dm_exec_sql_text(req.sql_handle) AS sqltext
并发现我的查询它正在等待共享锁(LCK_M_S),其中阻止会话正在等待由不存在的会话阻止的另一个共享锁。
编辑2:好的,该会话存在(我使用找到了它sys.dm_exec_sessions
),但现在似乎什么也没做。
编辑3:我找不到有关该会话的任何有趣信息。我看到它来自什么Web服务器,但是没有太多其他信息。
编辑4:编辑4:我们在代码中发现了一个可能的错误:该函数不能确保关闭数据库连接。另一方面,看起来该函数正在使用的事务已被正确处理,在这种情况下,所有锁应已清除。对我来说还不是很清楚,但这似乎是可能的原因。我们将修复该错误并留意该错误。