SQL सर्वर लॉग रिकॉर्ड किए गए कार्रवाई नहीं करता है?


12

मैं अक्सर sql सर्वर लॉग रिकॉर्ड जैसे बयानों को हर ट्रांजेक्शन और ऑपशन में देखता हूं।

लेकिन मैं क्या होता है जब एक सौदे अंत में है के बारे में उलझन में हूँ लुढ़का वापस ।

कहते हैं एक स्पष्ट लेनदेन 3 बयान है: statement A, statement B, statement C, और अंत में एक rollback statement D।

अब यह कहें कि जब निष्पादन नहीं हुआ है rollback statement D, तो क्या परिणामस्वरूप statements A through Cप्राप्त होने वाले संशोधन sql सर्वर लॉग में दर्ज किए जाएंगे ?

1 को समझना :

डी के माध्यम से कथन ए सभी दर्ज किए जाते हैं। SQL सर्वर सब कुछ रिकॉर्ड करता है, चाहे जो भी हो।

2 को समझना : संशोधन केवल स्मृति में कहीं संग्रहीत होते हैं, और केवल तब लॉग करने के लिए रिकॉर्ड किया जाता है जब SQL सर्वर एक commitबयान देखता है । यदि यह एक rollbackकथन है, तो SQL सर्वर केवल ट्रांसैक्रियन को अनदेखा करता है, लॉग करने के लिए कोई लेखन नहीं होता है क्योंकि यह बिना किसी उद्देश्य के कार्य करता है। दूसरे शब्दों में, लेन-देन से पहले और बाद में शुद्ध परिणाम होने पर SQL सर्वर लॉग होता है ।

दोनों तार्किक लगते हैं, कम से कम मेरे लिए लेकिन वे दोनों सही नहीं हो सकते। किसी भी मदद के लिए धन्यवाद।


नमस्ते, लॉग फ़ाइल में चल रहे व्हाट्स का विश्लेषण करने के लिए [ systoolsgroup.com/sql-log-analyzer.html] (SQL लॉग एनालाइज़र) आज़माएँ । आप केवल SQL लॉग डेटा का पूर्वावलोकन करने के लिए SysTools SQL लॉग एनालाइज़र का मुफ्त संस्करण आज़मा सकते हैं । उम्मीद है इससे आपका काम बनेगा।
— Rylan08

जवाबों:


13

1 को समझना सही है। SQL सर्वर डेटा को ट्रांजेक्शन लॉग में बदलने वाले हर ऑपरेशन को रिकॉर्ड करता है। रोलबैक डेटा में परिवर्तन है, इसलिए यह लेनदेन लॉग के लिए भी रिकॉर्ड करता है। स्टेटमेंट ए रन के रूप में यह ट्रांजेक्शन लॉग में डेटा लिखेगा और ट्रांजैक्शन लॉग में डेटा भी रखेगा। ए स्टेट स्टेटमेंट में बैक रोल करने की जरूरत है। बी और सी के लिए भी यही सच है। जब आप लेन-देन करते हैं तो लॉग में अधिक जानकारी लिखी जाएगी।

कार्रवाई में इसे देखने के बहुत सारे तरीके हैं इसलिए नीचे एक त्वरित डेमो है। यहाँ वह प्रश्न है जिसका उपयोग मैं यह देखने के लिए करूँगा कि लॉग में क्या लिखा गया था:

SELECT 
  COUNT(*) transaction_count
, SUM(database_transaction_log_bytes_used) used_bytes
, SUM(database_transaction_log_bytes_reserved) reserved_bytes
FROM sys.dm_tran_database_transactions
where database_id = 10;

मेरी टेबल:

create table TLOGDEMO (FLUFF VARCHAR(1000));

BEGIN TRANSACTION

क्वेरी ए न्यूनतम लॉगिंग का उपयोग करता है:

INSERT INTO TLOGDEMO WITH (TABLOCK)
SELECT REPLICATE('A', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

एक के बाद:

╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║                 1 ║   24006640 ║      175429451 ║
╚═══════════════════╩════════════╩════════════════╝

क्वेरी बी न्यूनतम लॉगिंग का उपयोग नहीं करता है:

INSERT INTO TLOGDEMO
SELECT REPLICATE('B', 1000)
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

बी के बाद:

╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║                 1 ║ 7352935708 ║     1613986255 ║
╚═══════════════════╩════════════╩════════════════╝

क्वेरी C कम डेटा बदलता है:

INSERT INTO TLOGDEMO
SELECT REPLICATE('C', 1000)
FROM master..spt_values c;

सी के बाद:

╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║                 1 ║ 7355821748 ║     1614545331 ║
╚═══════════════════╩════════════╩════════════════╝

अब मैं ROLLBACKDMV जारी करूंगा और रोलबैक होने के दौरान DMV को क्वेरी करूँगा । नीचे कुछ स्नैपशॉट की तालिका दी गई है:

╔═══════════════════╦════════════╦════════════════╗
║ transaction_count ║ used_bytes ║ reserved_bytes ║
╠═══════════════════╬════════════╬════════════════╣
║ 1                 ║ 7393305528 ║ 1573797677     ║
║ 1                 ║ 7458767420 ║ 1502635737     ║
║ 1                 ║ 7682482356 ║ 1259440979     ║
║ 1                 ║ 7803881368 ║ 1127471233     ║
║ ...               ║ ...        ║ ...            ║
╚═══════════════════╩════════════╩════════════════╝

के दौरान ROLLBACK, प्रयुक्त बाइट्स बढ़ जाती हैं और बाइट्स की आरक्षित संख्या घट जाती है। ऐसा इसलिए है क्योंकि SQL सर्वर उस स्थान का उपयोग कर रहा है जो लेन-देन को पूर्ववत करने से पहले सेट किया गया है। लेन-देन को पूर्ववत करने के लिए इसे डेटा बदलना होगा ताकि यह लॉग में अधिक डेटा लिख ​​सके।


8

डेटाबेस तालिकाओं में संशोधन पहले लॉग फ़ाइल में लिखे जाते हैं, फिर तालिकाओं में खुद को, पहले मेमोरी में और फिर, एक अतुल्यकालिक प्रक्रिया के साथ CHECKPOINT, जिसे डिस्क कहा जाता है । इस तंत्र को वाल (राइट-अहेड लॉगिंग) के रूप में जाना जाता है और सभी रिलेशनल डेटाबेस के लिए सामान्य है।

लॉग को पहले मेमोरी (लॉग बफर को, ठीक) और फिर डिस्क पर लिखा जाता है, लेकिन डेटाबेस टेबलों पर तब तक कुछ भी नहीं छुआ जाता है जब तक कि लॉग को डिस्क पर नहीं लिखा गया हो।

यह तंत्र पुनर्प्राप्ति प्रक्रिया के दौरान अग्रेषित किए गए लेनदेन को रोल करने और अप्राप्त लेनदेन को वापस करने की अनुमति देता है। , अपने उदाहरण के बारे में अगर कुछ बुरा के बाद हुआ statement Cहै और आप एक था commitएक के बजाय rollback(आप पहले से यह पता नहीं कर सकते हैं), प्रत्येक और लेनदेन में हर कदम को बिना सहेजे, आरडीबीएमएस एक सुसंगत में डेटाबेस ठीक करने के लिए कोई रास्ता नहीं होता रास्ता और लेन-देन D(टिकाऊपन) में पूरा नहीं होगा ACID।

जब कुछ ऑपरेशन वापस किए जाते हैं, तो यह डेटा फ़ाइल होती है CHECKPOINT, जो लॉग फ़ाइल नहीं, बल्कि शुद्ध परिवर्तन (के माध्यम से ) प्राप्त करती है ।


5

1 को समझना सही है, और स्पेगेटिडिबा और जो में अच्छी व्याख्या है।

यदि आप अपने लिए परीक्षण में रुचि रखते हैं (कृपया परीक्षण उदाहरण पर), तो आप नीचे दी गई स्क्रिप्ट का उपयोग कर सकते हैं:

--create a database and table for testing
USE master
GO
CREATE DATABASE tranlogtest
GO
USE tranlogtest
GO
CREATE TABLE t1
(junk char(1))

CHECKPOINT
GO

BEGIN TRAN
INSERT t1 VALUES ('a')
INSERT t1 VALUES ('b')
INSERT t1 VALUES ('c')

ROLLBACK
INSERT t1 VALUES ('d')

SELECT *
FROM fn_dblog(NULL,NULL)

आप देखेंगे कि SQL सर्वर सब कुछ रिकॉर्ड करता है, यहां तक ​​कि संचालन के लिए उठाए गए कदम भी।

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