Saya tidak tahu bagaimana merumuskan pertanyaan karena kami belum tahu banyak, tetapi saya ingin bertanya lebih cepat daripada nanti karena ini terlihat seperti sesuatu yang tidak boleh diabaikan.
Minggu ini kami mulai mengalami masalah dengan server database kami. Tampaknya menjadi masalah konsistensi data dan memanifestasikan oleh batas waktu bahkan pada kueri yang sangat sederhana dan tabel kecil. Kami "memperbaiki" masalah dengan me-restart server awal minggu ini dan itu hilang, tetapi sekarang tampaknya sudah kembali dan kali ini pada tabel yang lebih penting. Sebagai contoh, saya baru saja melakukan investigasi dan saya melihat pertanyaan seperti ini:
SELECT * FROM table WHERE id = 1234
untuk ID tertentu. Tabel ini memiliki sekitar 30+ juta baris. Tetapi tampaknya itu terjadi hanya untuk sebagian kecil catatan. Saya yakin ketika saya me-restart server atau cadangan dan mengembalikan database di server lain, semuanya akan baik-baik saja. Tapi saya akan coba.
Pada titik ini, saya sedang menjalankan:
DBCC CHECKTABLE ('table', NOINDEX)
tapi sepertinya itu akan berjalan selamanya. Ketika kami mengalami masalah pertama kali, saya memeriksa meja yang menyinggung dan itu baik-baik saja. Meja baru ini jauh lebih besar.
Beberapa informasi teknis latar belakang:
- SQL Server 2008 R2, Windows Server 2008 R2
- AWS / EC2, m2.2xlarge, 32 GB RAM, 4 x 1TB RAID 0
- hampir tidak ada disk IO, tampaknya sebagian besar db ada di memori
- ukuran total db: 100GB
Volume ELB "baru". Kami menciptakannya minggu ini.
Sunting: Saya baru saja menggunakan perintah berikut:
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
dan menemukan bahwa permintaan saya menunggu kunci bersama (LCK_M_S) di mana sesi pemblokiran sedang menunggu kunci bersama lainnya diblokir oleh sesi yang tidak ada.
Sunting 2: OK, sesi ada (saya menemukannya menggunakan sys.dm_exec_sessions
), tetapi tampaknya tidak melakukan apa-apa sekarang.
Sunting 3: Saya tidak dapat menemukan sesuatu yang menarik tentang sesi ini. Saya melihat dari mana server web itu berasal, tetapi tidak banyak lagi.
Sunting 4: Sunting 4: Kami menemukan kemungkinan bug dalam kode kami: fungsi yang tidak memastikan koneksi basis data ditutup. Di sisi lain, itu tampak seperti transaksi fungsi yang digunakan dulu dibuang dengan benar dalam hal ini semua kunci harus dibersihkan. Ini masih belum begitu jelas bagi saya, tetapi sepertinya itulah alasannya. Kami akan memperbaiki bug dan mengawasi itu.