परिचय
यह अक्सर ऐसा होता है जब एक एमएस एसक्यूएल सर्वर लेनदेन को आरंभकर्ता द्वारा भुला दिया जाता है। सबसे अच्छा उदाहरण निम्नलिखित होगा:एसएसएमएस में एक स्क्रिप्ट निष्पादित की जाती है, जो 'शुरुआत ट्रैन' निर्देश के माध्यम से लेनदेन शुरू करती है और एक त्रुटि होती है; हालांकि, 'प्रतिबद्ध' या 'रोलबैक' से गुजरना नहीं पड़ता है और निष्पादन आरंभकर्ता ने इस प्रश्न को लंबे समय तक छोड़ दिया है। नतीजतन, अधिक से अधिक उतार-चढ़ाव तब प्रकट होता है जब उन प्रश्नों को अवरुद्ध करने की बात आती है जो बंद-बंद संसाधनों (टेबल और सर्वर संसाधन जैसे रैम, सीपीयू और इनपुट-आउटपुट सिस्टम) तक पहुंच का अनुरोध करते हैं।
इस लेख में, हम उन तरीकों में से एक को देखेंगे जिनसे आप भूली हुई लेन-देन हटाने की प्रक्रिया को स्वचालित कर सकते हैं।
समाधान
आइए एक भूले हुए लेन-देन को एक सक्रिय (वर्तमान में निष्पादित) लेनदेन के रूप में परिभाषित करें, जिसमें पर्याप्त समय के दौरान T, में कोई सक्रिय (वर्तमान में निष्पादित) क्वेरी नहीं है।
ऐसे लेन-देन को हटाने के लिए सामान्य एल्गोरिथम यहां दिया गया है:
- वर्तमान में भूले हुए लेन-देन के बारे में जानकारी को संग्रहीत करने और विश्लेषण करने के लिए एक तालिका बनाना और साथ ही विलोपन क्रियाओं द्वारा पहली तालिका से चयनित लेनदेन को क्रमबद्ध और संग्रहीत करने के लिए एक तालिका बनाना।
- जानकारी इकट्ठा करना (लेन-देन और उनके सत्र जिनमें कोई प्रश्न नहीं है, यानी, लेनदेन जो एक निर्दिष्ट समय अवधि के भीतर निष्पादित और भूल गए हैं।
- चरण 1 में प्राप्त सभी वर्तमान में भूले हुए लेन-देन वाली तालिका को ताज़ा करना (यदि किसी भूले हुए लेन-देन ने एक सक्रिय क्वेरी प्राप्त कर ली है, तो इस तरह के लेनदेन को इस तालिका से हटा दिया जाएगा)।
- उन सत्रों को पुनः प्राप्त करना जिन्हें हमें मारने की आवश्यकता है (एक सत्र में कम से कम एक लेनदेन होता है जिसे चरण 1 K या अधिक बार तालिका में भुला दिया गया था और सत्र में एक समान सक्रिय क्वेरी गायब थी)।ली>
- उस डेटा को संग्रहित करना जिसे हम मिटाने जा रहे हैं (सत्रों, कनेक्शनों और लेन-देन के बारे में विवरण जो समाप्त हो जाएंगे)।
- चयनित सत्रों को हटाना।
- संसाधित प्रविष्टियों के साथ-साथ उन्हें हटाना जिन्हें हटाया नहीं जा सकता और जो चरण 1 से तालिका में बहुत लंबे समय से हैं।
अब, देखते हैं कि हम इस एल्गोरिथम को कैसे लागू कर सकते हैं।
सबसे पहले, हमें वर्तमान में भूले गए सभी लेनदेन के बारे में जानकारी संग्रहीत और विश्लेषण करने के लिए एक तालिका बनाने की आवश्यकता होगी:
उपयोग [DB_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। ] [छोटा] नॉट न्यूल, [ट्रांजैक्शनबीजिनटाइम] [डेटाटाइम] नॉट न्यूल, [इन्सर्टयूटीसीडेट] [डेटाटाइम] न्यूल नहीं, [अपडेटयूटीसीडेट] [डेटाटाइम] नॉट न्यूल, कॉन्स्ट्रेंट [पीके_सेशनट्रान] प्राथमिक कुंजी क्लस्टर ([सत्र आईडी] एएससी, [लेनदेन आईडी] ASC) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [प्राथमिक]) ऑन [प्राथमिक] GOALTER TABLE [संस्करण (काउंट_संक्रमण) [डीएनडीएसईशन (काउंट_संक्रमण]। 0)) के लिए [काउंटट्रान नॉट रिक्वेस्ट] गोल्टर टेबल [एसआरवी]। ) के लिए [insertUTCDate]गोल्टर टेबल [srv]।[सत्र Tran] [UpdateUTCDate]GOके लिए CONSTRAINT जोड़ें [DF_SessionTran_UpdateUTCDate] डिफ़ॉल्ट (getutcdate ())
यहां:
1) सत्र आईडी - सत्र पहचानकर्ता
2) लेनदेन आईडी - भूल गए लेनदेन पहचानकर्ता
3) CountTranNotRequest - किसी लेनदेन को भूल जाने की संख्या के रूप में पंजीकृत किया गया है
4) CountSessionNotRequest - एक सत्र की संख्या सक्रिय प्रश्नों के बिना पंजीकृत किया गया है और एक भूल गया लेनदेन था
5) TransactionBeginTime — भूले हुए लेनदेन की शुरुआत की तारीख और समय
6) InsertUTCDate — प्रवेश निर्माण की तिथि और समय (UTC)
7) UpdateUTCDate — प्रवेश अद्यतन की तिथि और समय (UTC)
इसके बाद, हम हटाने की क्रियाओं द्वारा पहली तालिका से लेनदेन को संग्रहित करने और क्रमबद्ध करने के लिए एक तालिका तैयार करेंगे:
[शीर्षक विस्तृत करें =”कोड "]
उपयोग [DB_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। ] न्यूल नहीं, [लॉगिन_टाइम] [डेटाटाइम] न्यूल नहीं, [होस्ट_नाम] [नवरचर] (128) न्यूल, [प्रोग्राम_नाम] [नवरचर] (128) न्यूल, [होस्ट_प्रोसेस_आईडी] [इंट] न्यूल, [क्लाइंट_वर्जन] [इंट] न्यूल , [client_interface_name] [nvarchar](32) NULL, [security_id] [varbinary](85) NOT NULL, [login_name] [nvarchar](128) NOT NULL, [nt_domain] [nvarchar](128) NULL, [nt_user_name] [nvarchar](128) NULL, [status] [nvarchar](30) NOT NULL, [context_info] [varbinary](128) NULL, [cpu_time] [int] NULL, [memory_usage] [int] NOT NULL, [ Total_scheduled_time] [int] न्यूल नहीं, [total_elapsed_time] [int] नॉट न्यूल, [endpoint_id] [int] नॉट न्यूल, [last_request_start_time] [डेटाटाइम] न्यूल नहीं, [last_request_end_time] [डेटाटाइम] न्यूल, [पढ़ता है] [बिगिंट] नहीं न्यूल, [लिखता है] [बिगिन्ट] न्यूल नहीं, [लॉजिकल_रीड्स] [बिगिन्ट] नॉट न्यूल, [is_user_process] [बिट] न्यूल नहीं, [text_size] [int] न्यूल नहीं, [भाषा] [nvarchar](128) NULL, [date_format] [nvarchar](3) NULL, [date_first] [छोटा] नॉट न्यूल, [उद्धृत_पहचानकर्ता] [बिट] नहीं न्यूल, [अरिथबॉर्ट] [बिट] न्यूल नहीं, [ansi_null_dflt_on] [बिट] न्यूल नहीं, [ansi_defaults] [बिट] न्यूल नहीं, [ansi_warnings] [बिट] न्यूल नहीं, [ansi_padding] [बिट] नॉट न्यूल, [ansi_nulls] [बिट] नॉट न्यूल, [concat_null_yields_null] [बिट] नॉट न्यूल, [लेन-देन_आइसोलेशन_लेवल] [स्मॉलिंट] नॉट न्यूल, [लॉक_टाइमआउट] [इंट] न्यूल, [डेडलॉक_प्रायरिटी] [इंट] नॉट न्यूल, [रो_काउंट] [बिगिन्ट] नॉट न्यूल , [prev_error] [int] नॉट न्यूल, [ऑरिजिनल_सिक्योरिटी_आईडी] [varbinary] (85) नॉट न्यूल, [ऑरिजिनल_लॉगिन_नाम] [nvarchar] (128) न्यूल नहीं, [last_successful_logon] [डेटाटाइम] न्यूल, [last_unsuccessful_logon] [डेटाटाइम] न्यूल, [unsuccessful_logons] [bigint] NULL, [group_id] [int] नॉट न्यूल, [डेटाबेस_आईडी] [स्मॉलिंट] नॉट न्यूल, [authenticating_database_id] [int] NULL, [open_transaction_count] [int] NOT NULL, [most_recent_session_id] [int] NULL , [कनेक्ट_टाइम] [ डेटाटाइम] NULL, [net_transport] [nvarchar] (40) NULL, [प्रोटोकॉल_टाइप] [nvarchar](40) NULL, [प्रोटोकॉल_वर्जन] [int] NULL, [encrypt_option] [nvarchar](40) NULL, [auth_scheme] [nvarchar ](40) न्यूल, [नोड_एफिनिटी] [स्मॉलिंट] न्यूल, [num_reads] [इंट] न्यूल, [num_writes] [इंट] न्यूल, [last_read] [डेटाटाइम] न्यूल, [last_write] [डेटाटाइम] न्यूल, [net_packet_size] [ int] NULL, [client_net_address] [nvarchar](48) NULL, [client_tcp_port] [int] NULL, [local_net_address] [nvarchar](48) NULL, [local_tcp_port] [int] NULL, [connection_id] [uniqueidentifier] NULL, [parent_connection_id] [अद्वितीय पहचानकर्ता] NULL, [most_recent_sql_handle] [varbinary] (64) NULL, [LastTSQL] [nvarchar] (अधिकतम) NULL, [transaction_begin_time] [डेटाटाइम] नॉट न्यूल, [CountTranNotRequest] [टिनींट] नॉट न्यूल, [CountSessionNotRequest ] [छोटा] नॉट न्यूल, [इन्सर्टयूटीसीडेट] [डेटटाइम] नॉट न्यूल, कॉन्स्ट्रेंट [पीके_किलसेशन] प्राथमिक कुंजी क्लस्टर ([आईडी] एएससी) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =ALLOW, ALLOW, ALLOW, ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOALTER TABLE [srv]।[KillSession] ADD CONSTRAINT [DF_KillSession_Insert [/विस्तार]यहां, सभी फ़ील्ड 'sys.dm_exec_sessions' और 'sys.dm_exec_connections' सिस्टम अभ्यावेदन से लिए गए हैं, और 'InsertUTCDate' प्रविष्टि बनाए जाने के UTC समय को निर्दिष्ट करता है।
फिर, शेष चरणों को पूरा करने के लिए, [srv] को लागू करें। [AutoKillSessionTranBegin] संग्रहीत कार्यविधि इस प्रकार है:
[शीर्षक विस्तृत करें =”कोड "]
उपयोग [DB_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]। टेबल (के) ASBEGIN सेट NOCOUNT ON; सेट ट्रांज़ेक्शन आइसोलेशन लेवल बिना पढ़े पढ़ा; @tbl तालिका घोषित करें (SessionID int, TransactionID bigint, IsSessionNotRequest बिट, TransactionBeginTime डेटाटाइम); - जानकारी प्राप्त करना (लेन-देन और उनका सत्र जिसमें कोई अनुरोध नहीं है, यानी, लेनदेन जो शुरू किए गए और भूल गए थे) @tbl (SessionID, TransactionID, IsSessionNotRequest, TransactionBeginTime) में डालें। t.[session_id] को सत्र आईडी के रूप में चुनें, टी। [transaction_id] TransactionID के रूप में, मामला जब मौजूद हो (sys.dm_exec_requests से r के रूप में शीर्ष (1) 1 का चयन करें जहां r। [session_id] =t. [session_id]) फिर 0 और 1 के अंत में IsSessionNotRequest , (शीर्ष (1) टा का चयन करें। [transaction_begin_time ] sys.dm_tran_active_transactions से टा के रूप में जहां टा। r के रूप में जहां r.[transaction_id]=t.[transaction_id]); - बिना किसी अनुरोध के सभी आरंभ किए गए लेन-देन वाली तालिका को रीफ़्रेश करना; srv.SessionTran को st पर t के रूप में @tbl का उपयोग करके st के रूप में मर्ज करें। [SessionID] =t। [SessionID] और st। [TransactionID] =t। फिर अपडेट सेट करें [अपडेटयूटीसीडेट] =getUTCDate() , [CountTranNotRequest] =सेंट। end , [TransactionBeginTime] =t. [TransactionBeginTime] जब लक्ष्य से मेल नहीं खाता है तो ([SessionID], [TransactionID], [TransactionBeginTime]) मान (t.[SessionID], t. [TransactionID], t.[TransactionBeginTime] डालें। ) जब स्रोत से मेल नहीं खाता है तो हटाएं; - सत्रों की सूची जिन्हें हटाने की आवश्यकता है (जिनमें भूले हुए लेनदेन शामिल हैं) @ किल्स टेबल (सत्र आईडी int) घोषित करते हैं; --детальная информация ля архива घोषित @kills_copy तालिका (SessionID int, TransactionID bigint, CountTranNotRequest tinyint, CountSessionNotRequest tinyint, TransactionBeginTime डेटाटाइम) --सत्रों को इकट्ठा करने के लिए हमें मारने की आवश्यकता है -- एक सत्र को कम से कम एक लेनदेन के रूप में चिह्नित किया गया था अनुरोध @countIsNotRequests बार -- और इस सत्र को कोई सक्रिय अनुरोध नहीं होने के रूप में चिह्नित किया गया था, @kills_copy (SessionID, TransactionID, CountTranNotRequest, CountSessionNotRequest, TransactionBeginTime) में समान मात्रा में सम्मिलित करने के लिए, सत्र आईडी, ट्रांज़ैक्शनआईडी, काउंटट्रान नॉट रिक्वेस्ट, काउंटसेशन नॉट रिक्वेस्ट, ट्रांज़ेक्शनबीगिन सेशन ट्रानव से चुनें। जहां [CountTranNotRequest]>[email protected] और [CountSessionNotRequest]>[email protected] और [TransactionBeginTime]<=DateAdd(min,[email protected],GetDate()); -- उस डेटा को संग्रहित करना जिसे हमें हटाने की आवश्यकता है (हटाए जाने वाले सत्रों, कनेक्शन और लेनदेन पर विवरण) INSERT INTO [srv]। [KillSession] ([session_id] ,[transaction_id] ,[login_time] ,[host_name] ,[program_name ] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[status] ,[context_info] ,[cpu_time] ,[memory_usage] ,[total_usage],[total_usage], [total_elapsed_time], [endpoint_id], [last_request_start_time], [last_request_end_time], [पढ़ता है], [लिखता है], [तार्किक_पढ़ता है], [is_user_process], [text_size], [भाषा], [date_format] ,[दिनांक_पहली पहचानकर्ता] ] ,[अरिथबॉर्ट] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[_deadlock_priority] , [prev_error] , [_idlock_priority] , [prev_error], [ last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[group_id] ,[database_id] ,[authenticating_database_id] ,[open_transaction_count] ,[most_recent_session_id] ,[tocol_transport], ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port], [local_n et_address] ,[local_tcp_port] ,[connection_id] ,[parent_connection_id] ,[most_recent_sql_handle] ,[LastTSQL] ,[transaction_begin_time] ,[CountTranNotRequest] ,[CountSessionNotRequest]) ES का चयन करें। [लॉगिन_टाइम], ईएस। [होस्ट_नाम], ईएस। [प्रोग्राम_नाम], ईएस। [होस्ट_प्रोसेस_आईडी], ईएस। [क्लाइंट_वर्जन], ईएस। [क्लाइंट_इंटरफेस_नाम], ईएस। [सुरक्षा_आईडी], ईएस। [लॉगिन_नाम], ईएस। [एनटी_डोमेन ] , ES। ईएस। [last_request_start_time], ईएस। [last_request_end_time], ईएस। [पढ़ता है], ईएस। [लिखता है], ईएस। [लॉजिकल_रीड्स], ईएस। [is_user_process ] , ES। ES.[ansi_warnings] ,ES.[ansi_padding] ,ES.[ansi_nulls] ,ES.[concat_null_yields_null] ,ES.[transaction_isolation_level] ,ES.[lock_timeout] ,ES.[deadlock_priority] ,ES.[row. [prev_error] ,ES.[original_security_id] ,ES.[original_login_name] ,ES.[last_successful_logon] ,ES.[last_unsuccessful_logon] ,ES.[unsuccessful_logons] ,ES.[group_id] ,ES.[database_id] ,ES. ] ,ES.[open_transaction_count] ,EC.[most_recent_session_id],EC.[connect_time] ,EC.[net_transport] ,EC.[protocol_type] ,EC.[protocol_version ] , EC. [encrypt_option] ,EC. ईसी। [क्लाइंट_नेट_एड्रेस], ईसी। [क्लाइंट_टीसीपी_पोर्ट], ईसी। [लोकल_नेट_एड्रेस], ईसी। [लोकल_टीसीपी_पोर्ट], ईसी। [कनेक्शन_आईडी], ईसी। [parent_connection_id], ईसी। [most_recent_sql_handle], (शीर्ष (1) टेक्स्ट चुनें। sys.dm_exec_sql_text(EC.[most_recent_sql_handle])) के रूप में [LastTSQL] ,kc.[TransactionBeginTime] ,kc.[CountTranNotRequest] ,kc.[CountSessionNotRequest] @kills_copy से kc इनर जॉइन के रूप में sys.dm_exec_readscommited ES के साथ .[SessionID]=ES.[session_id] EC.session_id =ES.session_id पर इनर sys.dm_exec_connections EC के साथ (readuncommitted) शामिल हों; --एकत्रीकरण सत्र @kills (SessionID) में सम्मिलित करें [SessionID] द्वारा @kills_copy समूह से [SessionID] चुनें; @SessionID int घोषित करें; - सत्र हटाते समय (मौजूद है (@kills से शीर्ष (1) 1 चुनें)) शीर्ष का चयन करें (1) @SessionID =[SessionID] @kills से; EXEC कोशिश करें sp_executesql N'kill @SessionID', N'@SessionID INT', @SessionID; END TRY BEGIN CATCH END CATCH @kills से हटाएं जहां [SessionID][email protected]; अंत में सेंट का चयन करें। @kills_copy kc जहां kc.[SessionID]=st.[SessionID]); -- संसाधित प्रविष्टियों को उन लोगों के साथ हटाना जिन्हें हटाया नहीं जा सकता है और तालिका में बहुत लंबे समय से #tbl से t से srv.SessionTran के रूप में t.[SessionID] =st.[SessionID] से जुड़ते हैं। टी। [लेनदेन आईडी] =सेंट। [लेनदेन आईडी]; ड्रॉप टेबल #tbl;ENDGO[/विस्तार]
एल्गोरिथम का चरण 7 इन दो काउंटरों में से एक के माध्यम से कार्यान्वित किया जाता है - CountTranNotRequest या CountSessionNotRequest - 250 के मान तक पहुँचता है।
परिणाम
इस लेख में, हमने एक प्रक्रिया के कार्यान्वयन पर ध्यान दिया है जो स्वचालित रूप से भूले हुए लेनदेन को हटा देता है।
यह विधि हमें भूली हुई लेन-देन हटाने की प्रक्रिया को स्वचालित करने की अनुमति देती है। इसका परिणाम इस तरह के लेन-देन द्वारा उत्पन्न अवरोधन में उतार-चढ़ाव वृद्धि को कम करना या रोकना है। इसलिए, DBMS का प्रदर्शन उन कार्यों से सुरक्षित रहता है जिनके परिणामस्वरूप लेन-देन को भुला दिया जा सकता है।
स्रोत:
» sys.dm_exec_requests
» sys.dm_tran_active_transactions
» sys.dm_tran_session_transactions
» sys.dm_exec_sql_text
» sys.dm_exec_sessions
» sys.dm_exec