Ainda não sei como formular a pergunta porque ainda não sabemos muito, mas gostaria de perguntar mais cedo ou mais tarde, porque isso parece algo que não deve ser negligenciado.
Esta semana, começamos a ter problemas com nosso servidor de banco de dados. Parece ser um problema de consistência de dados e se manifesta por tempos limite, mesmo em consultas muito simples e em pequenas tabelas. "Corrigimos" o problema reiniciando o servidor no início desta semana e ele desapareceu, mas agora parece que ele está voltando e desta vez em tabelas mais cruciais. Por exemplo, acabei de fazer uma investigação e estou olhando para uma consulta como esta:
SELECT * FROM table WHERE id = 1234
para um ID específico. A tabela possui mais de 30 milhões de linhas. Mas parece que isso acontece apenas para uma pequena fração dos registros. Aposto que quando eu reiniciar o servidor ou o backup e restaurar o banco de dados em outro servidor, tudo ficará bem. Mas eu vou tentar.
Neste ponto, estou executando:
DBCC CHECKTABLE ('table', NOINDEX)
mas parece que vai durar para sempre. Quando resolvemos os problemas pela primeira vez, verifiquei a tabela incorreta e estava tudo bem. Essa nova tabela é muito maior.
Algumas informações técnicas de base:
- SQL Server 2008 R2, Windows Server 2008 R2
- AWS / EC2, m2.2xlarge, 32 GB de RAM, 4 x 1 TB de RAID 0
- quase sem E / S de disco, parece que a maior parte do db está na memória
- tamanho total do db: 100GB
Os volumes ELB são "novos". Nós os criamos esta semana.
Editar: Acabei de usar o seguinte comando:
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
e constatei que minha consulta está aguardando um bloqueio compartilhado (LCK_M_S) onde a sessão de bloqueio está aguardando outro bloqueio compartilhado bloqueado por uma sessão que não existe.
Editar 2: OK, a sessão existe (eu a encontrei usando sys.dm_exec_sessions
), mas parece não fazer nada agora.
Edit 3: Não consigo encontrar nada de interessante sobre a sessão. Vejo de que servidor Web ele vem, mas não muito mais.
Edit 4: Edit 4: Encontramos um possível bug em nosso código: uma função que não estava garantindo que uma conexão com o banco de dados fosse fechada. Por outro lado, parecia que a transação que a função estava usando costumava ser descartada corretamente; nesse caso, todos os bloqueios deveriam ter sido limpos. Ainda não está muito claro para mim, mas parece ser o motivo provável. Nós vamos consertar o bug e ficar de olho nele.
fonte