এসকিউএল সার্ভার লগ নিঃশব্দ অপারেশন রেকর্ড করে?


12

আমি প্রায়শই এসকিএল সার্ভার লগের প্রতিটি বিবরণ এবং অপারেশন রেকর্ডের মতো বিবৃতি দেখতে পাই।

কিন্তু আমি কি ঘটে যখন একটি লেনদেন অবশেষে সে সম্বন্ধে বিভ্রান্ত করছি ঘূর্ণিত ফিরে ।

বলুন একটি সুনির্দিষ্ট লেনদেন 3 বিবৃতি রয়েছে: statement A, statement B, statement C, এবং পরিশেষে একটি rollback statement D।

এখন বলুন যখন মৃত্যুদন্ড কার্যকর না হয়ে পৌঁছায় rollback statement D, statements A through Cস্কেল সার্ভার লগতে রেকর্ড হয়ে যাওয়া পরিবর্তনগুলি কি ঘটবে ?

বোঝা 1 :

ডি এর মাধ্যমে এ সংক্রান্ত বিবৃতি সমস্ত রেকর্ড করা হয়। এসকিউএল সার্ভার সবকিছুই রেকর্ড করে, যাই হোক না কেন।

2 বোঝা : পরিবর্তনগুলি কেবল মেমরির কোথাও সংরক্ষণ করা হয় এবং এসকিউএল সার্ভার যখন কোনও commitবিবৃতি দেখে তখন লগ করতে রেকর্ড করা হয় । যদি এটি একটি rollbackবিবৃতিতে পরিণত হয়, এসকিউএল সার্ভার কেবল ট্রান্সক্রিওনটিকে উপেক্ষা করে, লগতে কোনও লিখন ঘটে না কারণ এটি কোনও উদ্দেশ্য করে না। অন্য কথায়, লেনদেনের আগে এবং পরে যখন নেট ফলাফল হয় তখন এসকিউএল সার্ভার লগ হয় ।

দুটোই যৌক্তিক বলে মনে হচ্ছে, কমপক্ষে আমার কাছে তবে তারা উভয়ই সঠিক হতে পারে না। কোন সাহায্যের জন্য ধন্যবাদ।


হাই, লগ ফাইলে কী চলছে তা বিশ্লেষণ করতে [ systoolsgroup.com/sql-log-analyzer.html] (এসকিউএল লগ অ্যানালাইজার) চেষ্টা করুন। আপনি কেবল এসকিউএল লগ ডেটা প্রাকদর্শন করার জন্য সিসটুলস এসকিউএল লগ অ্যানালাইজারের বিনামূল্যে সংস্করণ চেষ্টা করতে পারেন । আশা করি এটি আপনার পক্ষে কাজ করে।
— Rylan08

উত্তর:


13

1 টি বোঝা সঠিক। এসকিউএল সার্ভার প্রতিটি ক্রিয়াকলাপ রেকর্ড করে যা লেনদেন লগে ডেটা পরিবর্তন করে। একটি রোলব্যাক ডেটাতে পরিবর্তন যা এটি লেনদেনের লগেও এটি রেকর্ড করে। স্টেটমেন্ট এ রান হিসাবে এটি লেনদেনের লগে ডেটা লিখবে এবং বিবৃতিতে এটিকে আবার ঘুরিয়ে দেওয়ার প্রয়োজনে লেনদেনের লগে ডেটা সংরক্ষণ করবে। বি এবং সি এর ক্ষেত্রেও এটি সত্য When আপনি যখন লেনদেনটি রোলব্যাক করবেন তখন আরও তথ্য লগতে লেখা হবে।

এটিকে কর্মে দেখার জন্য প্রচুর উপায় রয়েছে তাই নীচে একটি দ্রুত ডেমো রয়েছে। লগতে কী লেখা হয়েছিল তা দেখার জন্য আমি এখানে এমন ক্যোয়ারী দিচ্ছি:

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 ║
╚═══════════════════╩════════════╩════════════════╝

ক্যোরি সি কম ডেটা পরিবর্তন করে:

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

সি এর পরে:

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

এখন আমি একটি জারি করব ROLLBACKএবং রোলব্যাকটি হওয়ার সময় ডিএমভিকে জিজ্ঞাসা করব । নীচে কয়েকটি স্ন্যাপশটের একটি টেবিল দেওয়া হল:

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

চলাকালীন ROLLBACK, ব্যবহৃত বাইটগুলি বৃদ্ধি পায় এবং বাইটগুলির সংরক্ষিত সংখ্যা হ্রাস পায়। কারণ এসকিউএল সার্ভার লেনদেন পূর্বাবস্থায় ফেলার পূর্বে আলাদা করা স্থানটি ব্যবহার করছে। লেনদেনটি পূর্বাবস্থায় ফেলার জন্য এটি অবশ্যই ডেটা পরিবর্তন করতে হবে যাতে এটি লগতে আরও ডেটা লেখে।


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)

আপনি দেখতে পাবেন যে এসকিউএল সার্ভার সমস্ত কিছু রেকর্ড করে, এমনকি অপারেশনগুলি পূর্বাবস্থায় নিয়ে যাওয়ার পদক্ষেপগুলিও।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.