क्या अनिश्चित अनिश्चित समय के लिए फायरिंग लॉग फ़ाइल का आकार बढ़ाती है?


16

अपने ऐप की अंतिम रिलीज़ में, मैंने एक कमांड जोड़ा जो सेवा ब्रोकर कतार में कुछ आने पर प्रतीक्षा करने के लिए कहता है:

WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)

डीबीए मुझे बताता है कि जोड़ के बाद से, लॉग आकार छत के माध्यम से चले गए हैं। क्या यह सही हो सकता है? या मुझे कहीं और देखना चाहिए?

जवाबों:


17

कोई भी सक्रिय खुला लेनदेन लॉग को पिन करेगा, ट्रंकेशन को रोक देगा और अंततः विकास का कारण होगा। यदि आप कोई लेन-देन शुरू करते हैं, तो लॉग को लिखें और फिर हमेशा के लिए प्रतीक्षा करें उम्मीद है कि एक संदेश अंततः आपको जगाएगा, आपने बस लॉग को पिन किया और इसे बढ़ने का कारण बना।

हाल ही में मैंने लोगों को लूप के साथ सक्रिय प्रक्रिया में वातोर को दूर करने की सलाह दी। बस एक RECIEVe जारी करें और किया जाए, आपके लिए सक्रियण तंत्र लूप दें (यह करता है) और WAITFOR नहीं, बस सादा RECEIVE।

RECEIVE का WAITFOR स्वाद आंतरिक रूप से एक बचत बिंदु बनाता है। यह लॉग उत्पन्न करता है (कम से कम 3 लॉग रिकॉर्ड) और वास्तव में प्रतीक्षा करते समय लॉग को पिन करता है। एक लंबे समय तक चलना (या बुरा, एक अनंत) एक बहुत बुरा अभ्यास होगा।


1
WAITFOR (...) TIMEOUT 3600000समस्या का समाधान होगा ? जैसे प्रति घंटा जारी।
गुस्से में डेकर

2
आपका लॉग एक घंटे में बहुत बढ़ जाएगा । WAITFOR (REC EIVE) 5 सेकंड के अंतराल के लिए होता है ...
रेमस रूसु

1
आपको यह भी जांचना चाहिए कि आपका लेनदेन वास्तव में सक्रिय क्यों है (लॉग लिखा है)। विशिष्ट सेवा ब्रोकर पैटर्न डॉव RECEIVE से पहले कोई भी लिखना जारी नहीं करता है।
रेमस रूसन

1
मुझे आपकी अंतिम टिप्पणी समझ में नहीं आ रही है। लेनदेन सक्रिय है क्योंकि मैंने जारी किया था WAITFOR (RECEIVE...क्या आप विस्तार कर सकते हैं? शायद, मुझे गलत समझा गया।
एंग्रीहैकर

8
begin transaction; waitfor(receive...)प्रतीक्षा करते समय कोई लॉग रिकॉर्ड उत्पन्न नहीं करेगा (लेनदेन को सक्रिय नहीं करेगा), और इस तरह लॉग को पिन नहीं करेगा। केवल begin transaction;[insert|update|delete];waitfor(receive...)लेन-देन का कारण 'सक्रिय' (लॉग रिकॉर्ड उत्पन्न करना) होगा और इस प्रकार वास्तव में प्रतीक्षा करते समय लॉग को पिन करना होगा।
रेमस रुसानु

5

SQL सर्वर 2008 R2 पर, यदि मैं एक WAITFOR (RECEIVE) निष्पादित करता हूं, तो DBCC OPENTRAN चलाएं, यह किसी भी पूर्व अद्यतन के अभाव में लेनदेन को सक्रिय दिखाता है।


2
सही है, WAITFOR आंतरिक रूप से एक savepoint बनाता है और यह लॉग लेखन को ट्रिगर करता है इसलिए यह लॉग को जगह में पिन करता है।
रेमुस रानानु


@binki जो टिप्पणी SQL सर्वर 2005 को संदर्भित करता है। यह 2008 R2 के लिए है। वे इस मुद्दे के संबंध में अलग तरह से व्यवहार करते हैं, अगर मुझे सही याद है।
रेमुस रुसानु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.