ऐसे लेनदेन प्राप्त करें जो विफल रहे या कभी प्रतिबद्ध नहीं थे


जवाबों:


5

नहीं, SQL सर्वर लेन-देन के बारे में कोई इतिहास नहीं रखता है जिसे वापस ले लिया गया था / लुढ़का हुआ था जो कि अतिरिक्त संभावित समस्याओं का परिचय नहीं देता है और ( ओटवायर के उत्तर में उल्लिखित है )। या यहां तक ​​कि लेनदेन भी किया गया है।

आपको अपनी त्रुटि से निपटने के लिए अपनी लॉगिंग का प्रदर्शन करना होगा, या सर्वर-साइड ट्रेस या विस्तारित इवेंट का उपयोग करके विशिष्ट लेनदेन से संबंधित घटनाओं को कैप्चर करना होगा।

ट्रेस:

यहाँ छवि विवरण दर्ज करें

विस्तारित कार्यक्रम:

यहाँ छवि विवरण दर्ज करें


यकीन है कि यह करता है, वे लॉग फ़ाइल में हैं और बैकअप फ़ाइलों को लॉग करें।
ooutwire

1
@ooutwire और आप आसानी से उन लोगों के लिए कैसे प्राप्त करते हैं? और अगर आप लॉग में नहीं हैं तो आप उन्हें कैसे प्राप्त करेंगे? वे लॉग रिकॉर्ड्स सबसे अच्छे हैं।
हारून बर्ट्रेंड

मेरा जवाब देखिए। सबसे अच्छा तरीका लगातार लॉग बैकअप बनाना है। मैं इस बात से सहमत हूँ कि ऐसा कोई समाधान आदर्श नहीं है; लेकिन मुझे कोई कारण नहीं दिखाई देता है कि मैं हर समय गर्भपात वाले लेनदेन के लिए खोज करूं। यदि यह इच्छा है, एक ट्रेस या XEvent की तुलना में विवेकपूर्ण समाधान प्रतीत होता है।
ooutwire

2
मैंने आपका जवाब देखा, बिल्कुल। मैंने आसानी से कहा और मुझे भी मज़बूती से कहना चाहिए था । :-)
हारून बर्ट्रेंड

6
मैं इस पर @AaronBertrand के साथ हूं। लेन-देन लॉग्स के माध्यम से कंघी करने में परेशानी के साथ ( ध्यान दें: वे नहीं हैं जिनके लिए इरादा है ) आप इस समस्या निवारण के लिए बस एक हल्का एक्सई सत्र बना सकते हैं।
थॉमस स्ट्रिंगर

4

जब आप "विफल" लेनदेन कहते हैं, तो वास्तव में आपका क्या मतलब है?

यदि आप उदाहरण पर वर्तमान लेनदेन देखना चाहते हैं, तो आप sys.dm_tran_active_transactionsDMV का उपयोग कर सकते हैं ।

इसके अलावा, sys.dm_exec_sessionsयह है open_transaction_countकि आप सत्र के द्वारा यह जानकारी दे सकते हैं। नीचे सभी उपयोगकर्ता प्रक्रियाओं को खोलने के लिए एक नैदानिक ​​क्वेरी है जिसमें खुले लेनदेन हैं:

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;

यह जानकारी भी इससे खींची जा सकती है sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

यदि आप लेन-देन को वापस लुढ़काना चाहते हैं, तो ("विफल" लेनदेन के लिए आपकी इच्छा से बहुत कुछ मानते हुए) आप विस्तारित ईवेंट rollback_tran_completedईवेंट को कैप्चर कर सकते हैं । यदि आप लेनदेन के "सब कुछ" दृश्य की तलाश कर रहे हैं, तो आप उस sql_transactionईवेंट को कैप्चर कर सकते हैं , जिसे SQL सर्वर द्वारा परिभाषित किया गया है

SQL सर्वर ट्रांज़ेक्शन शुरू होने पर, वापस आता है या सहेजता है। अनुप्रयोग, ट्रिगर या संग्रहीत कार्यविधियों का निवारण करते समय लेन-देन व्यवहार की निगरानी के लिए इस घटना का उपयोग करें।


4

आप fn_dblog () का उपयोग कर सकते हैं और निरस्त लेनदेन के लिए लेन-देन आईडी के साथ-साथ अन्य उपयोगी जानकारी के एक मेजबान का पता लगा सकते हैं।

चुनते हैं * 
Fn_dblog (NULL, NULL) से
कहाँ ऑपरेशन = 'LOP_ABORT_XACT';
जाओ

यह लॉग के सक्रिय हिस्से में सभी लेनदेन लॉग को स्कैन करता है। ट्रेस फ्लैग 2537 का उपयोग करके इसे ओवर-राइड किया जा सकता है, जो आपको सबसे पुराने "अन-रीयूज्ड" वीएलएफ की शुरुआत के लिए जितना संभव हो सके वापस जाने की अनुमति देगा। इस फ़ंक्शन का उपयोग करते समय सावधान रहें, क्योंकि यह लॉग को बेतरतीब ढंग से स्कैन करता है और स्कैन होने पर लॉग बदल नहीं सकता है; इसलिए, आप लॉग वृद्धि देख सकते हैं।

आप लॉग बैकअप फ़ाइल के खिलाफ fn_dump_dblog का भी उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.