এই দুটি এসকিউএল সার্ভার রোলব্যাকগুলি কীভাবে আলাদা?


13

এসকিউএল সার্ভার ২০০৮ আর 2 এ, এই দুটি রোলব্যাকগুলি কীভাবে পৃথক:

  1. ALTERকয়েক মিনিটের জন্য একটি বিবৃতি চালান , এবং তারপরে 'বাতিল করা কার্যকর করুন' চাপুন। পুরোপুরি রোলব্যাক করতে কয়েক মিনিট সময় নেয়।

  2. একই ALTERবিবৃতি চালান , তবে এটি নিশ্চিত করে যে LDFফাইলটি সফলভাবে শেষ হওয়ার জন্য যথেষ্ট পরিমাণে বড় নয়। একবার LDFসীমাটি পূরণ হয়ে গেলে এবং কোনও 'অটোগ্রোথ' অনুমোদিত না হয়ে গেলে ত্রুটি বার্তায় কোয়েরি এক্সিকিউশনটি তত্ক্ষণাত বন্ধ হয়ে যায় (বা কোনও রোলব্যাক ঘটে):

The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full. 
To find out why space in the log cannot be reused, see the 
log_reuse_wait_desc column in sys.databases

নিম্নলিখিত দুটি বিষয়গুলিতে এই দুটি কীভাবে আলাদা?

  1. দ্বিতীয় 'রোলব্যাক' তাত্ক্ষণিক কেন? এটিকে রোলব্যাক বলা যেতে পারে কিনা তা আমি পুরোপুরি নিশ্চিত নই। আমার ধারণাটি হ'ল, লেনদেনের লগটি কার্যকর হওয়ার সাথে সাথেই লিখিত হয় এবং এটি যখন বুঝতে পারে যে টাস্ক সম্পূর্ণরূপে সম্পন্ন করার জন্য পর্যাপ্ত জায়গা নেই, এটি কেবল কোনও 'শেষ' বার্তা দিয়ে থামিয়ে দেয়, বিনা প্রতিশ্রুতি ছাড়াই।

  2. যখন প্রথম রোলব্যাকটি এত বেশি সময় নেয় (কোনও রোলব্যাক একক থ্রেডযুক্ত হয়) তখন কী হয়?
    2.1। এসকিউএল সার্ভারটি কী ফিরে যাবে এবং LDFফাইলটিতে তৈরি এন্ট্রিগুলি পূর্বাবস্থায় ফিরে যাবে ?
    2.2। LDFফাইলের আকার রোলব্যাক শেষে ছোট পায় (থেকে DBCC SQLPERF(LOGSPACE))

  3. একটি অতিরিক্ত প্রশ্ন: দ্বিতীয় দৃশ্যের সময়, এসকিউএল সার্ভারটি LDFখুব দ্রুত ফাইল গ্রহণ শুরু করে । আমার ক্ষেত্রে, এটি 18% ব্যবহার থেকে প্রথম কয়েক মিনিটে 90% ব্যবহারে বেড়েছে (<4 মিনিট)। তবে একবার এটি 99% এ পৌঁছে গেলে এটি আরও 8 মিনিটের জন্য সেখানে অবস্থান করে, যখন 99.1% থেকে 99.8% এর মধ্যে ব্যবহারের ওঠানামা করে। ত্রুটি নিক্ষেপ হওয়ার আগে কয়েকবার এটি উপরে (99.8%) এবং ডাউন (99.2%) এবং আবার (99.7%) এবং নীচে (99.5%) যায়। পর্দার আড়ালে কী হচ্ছে?

এটি আরও ব্যাখ্যা করতে সহায়তা করতে পারে এমন কোনও এমএসডিএন লিঙ্ক প্রশংসাযোগ্য।

আলী রাজেঝি পরামর্শে, আমি আতর যুক্ত করছি: Disk Bytes/sec

দৃশ্যপট 1:

দৃশ্যপট 1

দৃশ্য 2:

দৃশ্য 2


কেবলমাত্র একটি তাত্ক্ষণিক মন্তব্য: ফাইলের আকার! = কোনও ফাইলের মধ্যে ব্যবহৃত স্থান।
অ্যারন বারট্রান্ড

@ অ্যারন হ্যাঁ, আমি এটির সাথে পরিচিত। আমি ব্যবহারটি পরিমাপ করার জন্য ডিবিসিসি এসকিউএলপারফ (লগস্পেস) ব্যবহার করেছি। এলডিএফ ফাইল পুরো সময়কালে একই থাকত, কারণ আমি ফাইলটির আকারটি 10 ​​জিবি সীমাবদ্ধ করেছিলাম। অভ্যন্তরীণ ব্যবহারের পরিবর্তন হয়।
টোকি

1
আমার সন্দেহ হয় যে দ্বিতীয় রোলব্যাকটি তাত্ক্ষণিকভাবে উপস্থিত হয় , কারণ রোলব্যাকটি সম্পূর্ণ হওয়ার পরে ত্রুটিটি রিপোর্ট করা হয়েছে। এগুলি সম্ভবত আপনি 3 এ 8 মিনিট পর্যবেক্ষণ করেছেন, যেখানে এলডিএফ ব্যবহার বেশ ধ্রুবক রয়েছে।
মুস্তাচিও

@ মুস্তাকসিও আমি আপনার সাথে একমত হই তবে শিল্পকর্মগুলি বিভিন্ন দিকে নির্দেশ করছে। যদি বাস্তবে রোলব্যাকটি ঘটে থাকে তবে লগ ফাইলের ব্যবহার অবশ্যই কম সংখ্যায় ফিরে আসতে হবে; ত্রুটি বার্তা নিক্ষেপ করা হয় এবং 99.3% এ থাকবেন না।
টোকি

1
আমি বিশ্বাস করি রোলব্যাক লগ স্পেস নেয়। রোলব্যাক চলাকালীন লগটি পূর্ণ হয়ে গেলে ডিবি সন্দেহ হয়। এটি আর স্পর্শ করা হয় না। এটি তাত্ক্ষণিক রোলব্যাকের মতো মনে হচ্ছে তবে আপনি অনলাইনে ডাটাবেসটি অনলাইনে নিতে সক্ষম না হওয়া অবধি রোলব্যাক পিছিয়ে দেওয়া হয়েছে (যখন সেখানে ডিস্কের স্পেস উপলব্ধ থাকে); এছাড়াও, লগটি পূর্ণ হয়ে গেলে এসকিউএল সার্ভার আইপি ক্রিয়াকলাপে স্পাইকগুলি ব্যাখ্যা করতে পারে এমন চেকপয়েন্ট দিয়ে রুম তৈরির চেষ্টা করতে পারে।
usr ডিরেক্টরির

উত্তর:


1

উপরে উল্লিখিত হিসাবে, আরও পরীক্ষা চালানোর পরে, আমি একটি গণনা করা সিদ্ধান্তে পৌঁছেছি। আমি তাদের সকলকে এখানে একটি ব্লগ পোস্টে সংক্ষিপ্ত করে জানিয়েছি , তবে আমি উত্তর পোস্টের জন্য কিছু পোস্ট এই পোস্টে অনুলিপি করব।

অনুমান (কিছু পরীক্ষার ভিত্তিতে)

এখন পর্যন্ত, এটি কেন হয় তা সম্পর্কে আমার স্পষ্ট ব্যাখ্যা নেই। তবে পরীক্ষাগুলির সময় জড়িত নিদর্শনগুলির উপর ভিত্তি করে আমার অনুমানগুলি নীচে দেওয়া হল।

রোলব্যাক দুটি পরিস্থিতিতেই ঘটে । একটি হ'ল সুস্পষ্ট রোলব্যাক (ব্যবহারকারীর ক্যান্সেল বাতিল বোতাম), অন্যটি অন্তর্নিহিত (এসকিএল সার্ভার অভ্যন্তরীণভাবে সিদ্ধান্ত নিচ্ছে)।

উভয় পরিস্থিতিতে লগ ফাইলে যাওয়ার ট্র্যাফিক সামঞ্জস্যপূর্ণ। নীচের চিত্রগুলি দেখুন:

দৃশ্যপট 1:

দৃশ্যপট 1:

দৃশ্য 2:

দৃশ্য 2

  • চিন্তার এই লাইনটিকে শক্তিশালী করে এমন একটি নিদর্শন দুটি পরিস্থিতিতেই স্কেল ট্রেসকে ক্যাপচার করছে।

    • পরিস্থিতি 1 হ'ল স্বাক্ষরিত ওরফে যখন আমরা 'বাতিল' চাপি তখন এটি পিছনে ফিরে আসে।
    • পরিস্থিতি 2 এ, ত্রুটি বার্তাটি স্পষ্টভাবে 'রোলব্যাক' করার পরে প্রদর্শিত হবে is স্কেল ট্রেস-এ, আমরা ত্রুটি বার্তাটি দেখতে পাই "স্ক্রিনে বার্তাটি প্রদর্শিত হওয়ার অনেক আগে" "ডাটাবেস 'স্যাম্পেলডিবি'র জন্য লেনদেন লগ পূর্ণ" is সুতরাং, আমার অনুমান যে রোলব্যাকগুলি উভয় পরিস্থিতিতেই ঘটে, তবে ত্রুটি বার্তাটি দৃশ্যপট 2 সফলভাবে এবং পুরোপুরি রোলব্যাক সম্পাদন করার পরে প্রদর্শিত হয়।
  • পরিস্থিতি 2 এটি আরও এগিয়ে যাওয়ার সাথে সাথে আরও বেশি সময় নেয় বলে মনে হয়, তাই রোলব্যাকটি আরও বেশি সময় নেয়।

অব্যক্ত আচরণ:

  • লগ ফাইলের ব্যবহার এত বেশি কেন পরিবর্তিত হয়?
    • এটি 90% এ উন্নত হয়, তারপরে 85% এ নেমে যায়, তারপরে 99% পর্যন্ত এবং সেখানে দীর্ঘ সময়ের জন্য ঘোরাঘুরি করে। আমি এটি বেশ কয়েকবার এর মতো উপরে ও নীচে যেতে দেখছি: 99.2%, 99.8%, 99.1%, 99.7%। কেন এমন হয়?
    • একটি সম্ভাব্য ব্যাখ্যা হ'ল, এখানে একটি ব্যাকগ্রাউন্ড প্রক্রিয়া (লগ ফ্লাশের মতো কিছু) থাকতে পারে যা প্রতি কয়েক মিনিটে লগ ফাইল সাফ করে। এবং যতবারই এটি কিক্স করে, কিছু এন্ট্রি সাফ হয়ে যায়, ফলস্বরূপ আরও মুক্ত স্থান উপলব্ধ।

আরও ভাল উপায়ে এই আচরণটি ব্যাখ্যা করতে সহায়তা করার জন্য কোনও ধারণা স্বাগত।


2
পল র্যান্ডালের সাথে চেক করা হয়েছে, তিনি নিশ্চিত করেছেন যে আপনি সঠিক উপসংহারে এসেছেন - উভয় ক্ষেত্রেই রোলব্যাক একই রকম।
পল হোয়াইট 9

0

আমি নিম্নলিখিত পরীক্ষার চেষ্টা করেছি এবং অনুরূপ ফলাফল পেয়েছি। উভয় ক্ষেত্রেই, fn_dblog () রোলব্যাক সংঘটিত দেখায় এবং পরিস্থিতি 1 এর তুলনায় পরিস্থিতি 2 এ এটি দ্রুত ঘটবে বলে মনে হয়।

যাইহোক, আমি উভয় এমডিএফ এবং এলডিএফ একই একক বহিরাগত (ইউএসবি ২.০) ডিস্কে রেখেছি।

আমার প্রাথমিক উপসংহারটি হল যে এই ক্ষেত্রে রোলব্যাকের ক্রিয়াকলাপে কোনও পার্থক্য নেই এবং সম্ভবত কোনও স্পষ্ট গতির পার্থক্য I / O সাবসিস্টেম সম্পর্কিত। এই মুহূর্তে এটি আমার কর্ম অনুমান।

দৃশ্যপট 1:

  • লগ ফাইল দিয়ে একটি ডেটাবেস তৈরি করুন যা 1MB থেকে শুরু হয়, 4MB খণ্ডে বৃদ্ধি পায় এবং সর্বোচ্চ আকার 100MB থাকে।
  • একটি স্পষ্ট লেনদেন খুলুন, এটি 10 ​​সেকেন্ডের জন্য চালান, এবং তারপরে ম্যানুয়ালি এটি এসএসএমএসের মধ্যে বাতিল করুন
  • Fn_dblog () গণনা এবং লগ রিজার্ভ আকার দেখুন এবং DBCC SQLPERF (লগস্পেস) দেখুন

দৃশ্য 2:

  • লগ ফাইল দিয়ে একটি ডেটাবেস তৈরি করুন যা 1MB থেকে শুরু হয়, 4MB খণ্ডে বৃদ্ধি পায় এবং সর্বোচ্চ আকার 100MB থাকে।
  • একটি সুস্পষ্ট লেনদেন খুলুন, লগ সম্পূর্ণ ত্রুটি প্রদর্শিত না হওয়া পর্যন্ত এটি চালান
  • Fn_dblog () গণনা এবং লগ রিজার্ভ আকার দেখুন এবং DBCC SQLPERF (লগস্পেস) দেখুন

পারফরম্যান্স মনিটরের ফলাফল:

দৃশ্যপট 1: ***দৃশ্যপট 1***

দৃশ্য 2: *** পরিস্থিতি 2 ***

কোড:

ব্যবহার [মাস্টার];
যাওয়া

যদি ডেটাবেসপ্রপেক্টেএক্স (এন'সাম্পলডিবি ', এন ভার্সন')> 0
BEGIN
    পরিবর্তে ডেটাবেস [নমুনা বিবি] সেট করুন সিঙ্গেল_ইউসার
        রোলব্যাক তাত্ক্ষণিকভাবে;
    ড্রপ ডেটাবেস [স্যাম্পেলডিবি];
শেষ;
যাওয়া

প্রাথমিকভাবে ডেটাবেস [স্যাম্পেলডিবি] তৈরি করুন 
( 
      নাম = এন'স্যাম্পলডিবি '
    , FILENAME = N'E: \ ডেটা \ SampleDB.mdf ' 
    , সাইজ = 3 এমবি 
    , FILEGROWTH = 1MB 
)
লগ ইন করুন 
( 
      NAME = N'SampleDB_log '
    , FILENAME = N'E: \ ডেটা \ SampleDB_log.ldf '
    , সাইজ = 1 এমবি 
    , MAXSIZE = 100MB 
    , FILEGROWTH = 4MB 
);
যাওয়া

ব্যবহার [স্যাম্পেলডিবি];
যাওয়া

- একটি টেবিল যোগ করুন
টেবিল তৈরি করুন dbo.test
(
    সি 1 চার (8000) নকল অনুলিপি ('এ', 8000) নয়
) অন [প্রাথমিক];
যাওয়া

- নিশ্চিত করুন যে আমরা ছদ্ম-সরল পুনরুদ্ধারের মডেল নই
ব্যাকআপ ডেটাবেস স্যাম্পলডবি
TO DISK = 'NUL';
যাওয়া

- লগ ফাইল ব্যাকআপ
ব্যাকআপ লগ নমুনাবিবি B
TO DISK = 'NUL';
যাওয়া

- ব্যবহৃত লগ স্পেস চেক করুন
ডিবিসিসি এসকিউএলপারফ (লগস্পেস);
যাওয়া

- fn_dblog () দিয়ে কয়টি রেকর্ড দৃশ্যমান?
Fn_dblog থেকে * নির্বাচন করুন (NULL, NULL); - আমার ক্ষেত্রে প্রায় 9

/ **********************************
             দৃশ্যপট 1
********************************** /
- একটি নতুন লেনদেন খুলুন এবং তারপরে এটি রোল করুন
শুরু করুন ট্রান্সেকশন

    ডিবিও.তম ডিফল্ট ভ্যালু অন্তর্ভুক্ত করুন;
    যান 10000 - চলুন 10 সেকেন্ডের জন্য চালানো হয় এবং তারপরে এসএসএমএস ক্যোয়ারী উইন্ডোতে বাতিল চাপুন

    - লেনদেন বাতিল করুন
    - এটি শেষ হতে কয়েক সেকেন্ড সময় নেওয়া উচিত


- লেনদেনটি রোলব্যাক করার দরকার নেই, কারণ বাতিল ইতিমধ্যে আপনার পক্ষে তা করেছে।
-- এটা চেষ্টা করুন. আপনি এই ত্রুটি পাবেন
- এমএসজি 3903, স্তর 16, রাজ্য 1, লাইন 1
- রোলব্যাক ট্রান্সএকশন অনুরোধটির সাথে সম্পর্কিত কোনও বিগইন ট্রান্সএশন নেই।
রোলব্যাক ট্রান্সঅ্যাকশন;

- ব্যবহৃত লগ স্পেসটি কী? 100% এর উপরে।
ডিবিসিসি এসকিউএলপারফ (লগস্পেস);
যাওয়া

- fn_dblog () দিয়ে কয়টি রেকর্ড দৃশ্যমান?
নির্বাচন করুন * 
Fn_dblog থেকে (NULL, NULL); - আমার ক্ষেত্রে প্রায় 91,926

- fn_dblog দ্বারা প্রদর্শিত মোট লগ রিজার্ভ ()?
নির্বাচন করুন সুম ([লগ রিজার্ভ]) হিসাবে [মোট লগ রিজার্ভ]
Fn_dblog থেকে (NULL, NULL); - প্রায় 88.72MB


/ **********************************
             স্কেনারিও 2
********************************** /
- ডিবি উড়িয়ে দিয়ে আবার শুরু করুন
ব্যবহার [মাস্টার];
যাওয়া

যদি ডেটাবেসপ্রপেক্টেএক্স (এন'সাম্পলডিবি ', এন ভার্সন')> 0
BEGIN
    পরিবর্তে ডেটাবেস [নমুনা বিবি] সেট করুন সিঙ্গেল_ইউসার
        রোলব্যাক তাত্ক্ষণিকভাবে;
    ড্রপ ডেটাবেস [স্যাম্পেলডিবি];
শেষ;
যাওয়া

প্রাথমিকভাবে ডেটাবেস [স্যাম্পেলডিবি] তৈরি করুন 
( 
      নাম = এন'স্যাম্পলডিবি '
    , FILENAME = N'E: \ ডেটা \ SampleDB.mdf ' 
    , সাইজ = 3 এমবি 
    , FILEGROWTH = 1MB 
)
লগ ইন করুন 
( 
      NAME = N'SampleDB_log '
    , FILENAME = N'E: \ ডেটা \ SampleDB_log.ldf '
    , সাইজ = 1 এমবি 
    , MAXSIZE = 100MB 
    , FILEGROWTH = 4MB 
);
যাওয়া

ব্যবহার [স্যাম্পেলডিবি];
যাওয়া

- একটি টেবিল যোগ করুন
টেবিল তৈরি করুন dbo.test
(
    সি 1 চার (8000) নকল অনুলিপি ('এ', 8000) নয়
) অন [প্রাথমিক];
যাওয়া

- নিশ্চিত করুন যে আমরা ছদ্ম-সরল পুনরুদ্ধারের মডেল নই
ব্যাকআপ ডেটাবেস স্যাম্পলডবি
TO DISK = 'NUL';
যাওয়া

- লগ ফাইল ব্যাকআপ
ব্যাকআপ লগ নমুনাবিবি B
TO DISK = 'NUL';
যাওয়া

- এখন, আমাদের লেনদেনের মধ্যে লগ ফাইল আপ আপ করা যাক
শুরু করুন ট্রান্সেকশন
    ডিবিও.তম ডিফল্ট ভ্যালু অন্তর্ভুক্ত করুন;
    যান 10000

- রোলব্যাক কখনই জ্বলে না। চেষ্টা করে দেখুন আপনি একটি ত্রুটি পাবেন।
- এমএসজি 3903, স্তর 16, রাজ্য 1, লাইন 1
- রোলব্যাক ট্রান্সএকশন অনুরোধটির সাথে সম্পর্কিত কোনও বিগইন ট্রান্সএশন নেই।
রোলব্যাক ট্রান্সঅ্যাকশন;

- লগ ফাইলটি কি 100% পূর্ণ? 
ডিবিসিসি এসকিউএলপারফ (লগস্পেস);

- fn_dblog () দিয়ে কয়টি রেকর্ড দৃশ্যমান?
নির্বাচন করুন * 
Fn_dblog থেকে (NULL, NULL); - আমার ক্ষেত্রে প্রায় 91,926
যাওয়া

- fn_dblog দ্বারা প্রদর্শিত মোট লগ রিজার্ভ ()?
নির্বাচন করুন সুম ([লগ রিজার্ভ]) হিসাবে [মোট লগ রিজার্ভ]
Fn_dblog থেকে (NULL, NULL); - 88.72 এমবি
যাওয়া

বিস্তারিত পরীক্ষার জন্য আপনাকে ধন্যবাদ। আরও পরীক্ষা চালানোর পরে, আমি একই সিদ্ধান্তে পৌঁছেছি o সুতরাং, আমি একটি ব্লগ পোস্ট লিখেছিলাম । আমার জন্য সিনসিরিও 2 রোলব্যাক করতে আরও বেশি সময় নেয় কারণ স্কেল সার্ভারটি রোলব্যাক করার প্রয়োজনীয়তা সিনারিও ১ এর চেয়ে বেশি হওয়ার আগে, পরিস্থিতি 2-তে সঞ্চালিত কাজের পরিমাণটি বেশি হয়েছে
টোকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.