Başarısız olan veya hiç taahhüt edilmemiş işlemleri alın


Yanıtlar:


5

Hayır, SQL Server, alınıp önemsiz olan ve ek potansiyel sorunlar getirmeyen (@ ooutwire'ın cevabında belirtildiği gibi) iptal edilen / geri alınan işlemler hakkında herhangi bir geçmiş tutmaz . Hatta taahhüt edilen işlemler bile.

Hata işlemede kendi günlüğünüzü gerçekleştirmeniz veya sunucu tarafı izlemesini veya Genişletilmiş Olayları kullanarak işlemle ilgili belirli olayları yakalamanız gerekir.

Trace:

resim açıklamasını buraya girin

Genişletilmiş etkinlikler:

resim açıklamasını buraya girin


Elbette, günlük dosyasında ve günlük yedekleme dosyalarındadır.
ooutwire

1
@ooutwire ve bunlara nasıl kolayca ulaşırsınız? Ve artık kütükte değilse onlara nasıl ulaşırsınız? Bu günlük kayıtları en iyi ihtimalle geçicidir.
Aaron Bertrand

Cevabımı gör. En iyi yol, sık sık günlük yedekleri oluşturmaktır. Böyle bir çözümün ideal olmadığı konusunda hemfikirim; ancak durdurulan işlemler için her zaman arama yapmak için hiçbir neden göremiyorum. Bu arzu ise, bir iz veya XEvent'ten daha ihtiyatlı bir çözüm gibi görünecektir.
ooutwire

2
Cevabını gördüm elbette. Kolayca dedim ve güvenilir bir şekilde söylemeliydim . :-)
Aaron Bertrand

6
Bu konuda @AaronBertrand ile beraberim. İşlem günlüklerini taramak için gereken sorunla ( Not: amaçlananları değil ), bu sorun giderme için hafif bir XE oturumu da oluşturabilirsiniz.
Thomas Stringer

4

"Başarısız" işlemler derken, tam olarak ne demek istiyorsun?

Örneğin geçerli işlemleri görmek istiyorsanız, sys.dm_tran_active_transactionsDMV'yi kullanabilirsiniz .

Ayrıca, sys.dm_exec_sessionssahip open_transaction_countsize oturumda bu bilgileri verebilir. Aşağıda, açık işlemleri olan tüm kullanıcı işlemlerini çekmek için tanılama sorgusu bulunmaktadır:

select 
    s.session_id,
    s.login_name,
    s.open_transaction_count,
    st.text as most_recent_sql_text
from sys.dm_exec_sessions s
inner join sys.dm_exec_connections c
on s.session_id = c.session_id
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) st
where s.is_user_process = 1
and s.open_transaction_count > 0;

Bu bilgiler aşağıdakilerden de alınabilir sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

İşlemlerin ne zaman geri alındığını yakalamak istiyorsanız ("başarısız" işlemler isteğiniz tarafından çok fazla varsayılırsa) Genişletilmiş Etkinlikler rollback_tran_completedetkinliğini yakalayabilirsiniz . İşlemlerin "her şey" görünümünü arıyorsanız sql_transaction, SQL Server tarafından tanımlanan etkinliği yakalayabilirsiniz.

Bir SQL Server işlemi başladığında, tamamladığında, geri döndüğünde veya bir kayıt noktası çalıştırdığında oluşur. Uygulamaları, tetikleyicileri veya saklı yordamları giderirken işlem davranışını izlemek için bu olayı kullanın.


4

Fn_dblog () öğesini kullanabilir ve iptal edilen işlemler için işlem kimliklerini ve diğer birçok yararlı bilgiyi bulabilirsiniz.

SEÇ * 
BAŞLANGIÇ fn_dblog (NULL, NULL)
NEREDE İşlem = 'LOP_ABORT_XACT';
GİT

Günlüğün etkin bölümündeki tüm işlem günlüğünü tarar. Bu, en eski "yeniden kullanılmayan" VLF'nin başlangıcına mümkün olduğunca geri dönmenizi sağlayacak olan izleme bayrağı 2537 kullanılarak geçersiz kılınabilir. Bu işlevi kullanırken dikkatli olun, çünkü günlüğü rastgele tarar ve tarama yapılırken günlüğü değişemez; yani, günlük büyümesi görebilirsiniz.

Bir günlük yedekleme dosyasına karşı da fn_dump_dblog kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.