আপনি কীভাবে এসকিউএল সার্ভার লেনদেন লগ সাফ করবেন?


577

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



3
ম্যানেজমেন্ট স্টুডিওতে একটি কমান্ড থাকা উচিত: "সঙ্কুচিত লগতে ক্লিক করুন" এবং আপনার কাজ শেষ।
ফরাসি

উত্তর:


748

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

প্রথমে পুরো ব্যাকআপ নিন

কোনও কিছু ভুল হয়ে যাওয়ার পরে আপনি এটি পুনরুদ্ধার করতে পারবেন না তা নিশ্চিত করে কখনও আপনার ডাটাবেসে কোনও পরিবর্তন করবেন না।

আপনি যদি পয়েন্ট-ইন-টাইম পুনরুদ্ধারের বিষয়ে যত্নশীল হন

(এবং পয়েন্ট-ইন-টাইম পুনরুদ্ধারের দ্বারা, আমি বলতে চাইছি আপনি সম্পূর্ণ বা ডিফারেনশিয়াল ব্যাকআপ ব্যতীত অন্য কোনও কিছুতে পুনরুদ্ধার করতে সক্ষম হওয়া সম্পর্কে যত্নশীল।)

সম্ভবত আপনার ডাটাবেস FULLপুনরুদ্ধার মোডে আছে। যদি তা না হয় তবে তা নিশ্চিত হয়ে নিন:

ALTER DATABASE testdb SET RECOVERY FULL;

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

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\testdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

নোট করুন যে \\backup_share\কোনও পৃথক মেশিনে থাকা উচিত যা একটি ভিন্ন অন্তর্নিহিত স্টোরেজ ডিভাইসের প্রতিনিধিত্ব করে। এগুলিকে একই মেশিনে ব্যাক আপ করা (বা কোনও ভিন্ন মেশিন যা একই আন্ডারলাইং ডিস্কগুলি ব্যবহার করে, বা একই শারীরিক হোস্টে থাকা একটি ভিন্ন ভিএম) আপনাকে সত্যিই সহায়তা করে না, যেহেতু মেশিনটি ফুঁসে উঠলে আপনি আপনার ডাটাবেস হারিয়ে ফেলেছেন এবং এর ব্যাকআপ। আপনার নেটওয়ার্ক অবকাঠামোর উপর নির্ভর করে স্থানীয়ভাবে ব্যাকআপ নেওয়ার বিষয়টি আরও বুদ্ধিমান হতে পারে এবং তারপরে এগুলি পর্দার আড়ালে অন্য কোনও স্থানে স্থানান্তর করতে পারে; উভয় ক্ষেত্রেই আপনি এগুলি যত তাড়াতাড়ি সম্ভব প্রাথমিক ডাটাবেস মেশিন থেকে নামাতে চান।

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

নোট করুন যে সঙ্কুচিত হওয়ার সম্ভাব্য হওয়ার আগে আপনাকে দুবার লগ ব্যাক আপ করতে হবে (ধন্যবাদ রবার্ট)।

সুতরাং, আপনাকে আপনার লগ ফাইলের জন্য একটি ব্যবহারিক আকার নিয়ে আসা দরকার। আপনার সিস্টেম সম্পর্কে আরও বেশি কিছু না জেনেও এটি এখানে কেউ আপনাকে বলতে পারে না, তবে আপনি যদি লগ ফাইলটি ঘন ঘন সঙ্কুচিত করে চলেছেন এবং এটি আবার বাড়ছে, তবে একটি ভাল জলছবি সম্ভবত এটি সবচেয়ে বড় থেকে 10-50% বেশি is । আসুন এটি 200 এমবিতে আসে এবং আপনি যে কোনও পরবর্তী অটোগ্রোথ ইভেন্ট 50 এমবি হতে চান তা আপনি লগ ফাইলের আকারটি এইভাবে সামঞ্জস্য করতে পারেন:

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

নোট করুন যে লগ ফাইলটি বর্তমানে> 200 এমবি থাকলে আপনার প্রথমে এটি চালানোর প্রয়োজন হতে পারে:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO

আপনি যদি পয়েন্ট-ইন-টাইম পুনরুদ্ধারের বিষয়ে চিন্তা না করেন

যদি এটি একটি পরীক্ষামূলক ডাটাবেস হয় এবং আপনি পয়েন্ট-ইন-টাইম পুনরুদ্ধারের বিষয়ে যত্নশীল না হন তবে আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে আপনার ডাটাবেসটি SIMPLEপুনরুদ্ধার মোডে রয়েছে।

ALTER DATABASE testdb SET RECOVERY SIMPLE;

SIMPLEপুনরুদ্ধার মোডে ডাটাবেস স্থাপন করা নিশ্চিত করে যে এসকিউএল সার্ভার সমস্ত লেনদেনের রেকর্ড রাখার জন্য বাড়ার পরিবর্তে লগ ফাইলের ( FULLপুনরুদ্ধারে নিষ্ক্রিয় লেনদেনগুলি পুনরায় ব্যবহার করে) পুনরায় ব্যবহার করে (যেমন আপনি লগ ব্যাক আপ না করা পর্যন্ত পুনরুদ্ধার করে)। CHECKPOINTইভেন্টগুলি লগ নিয়ন্ত্রণ করতে সহায়তা করে এবং এটির মধ্যে এটির বাড়ানোর দরকার নেই তা নিশ্চিত করতে সাহায্য করবে যদি না আপনি মধ্যে প্রচুর টি-লগ ক্রিয়াকলাপ তৈরি করেনCHECKPOINT s এর ।

এরপরে, আপনার অবশ্যই নিখুঁতভাবে নিশ্চিত করা উচিত যে এই লগের বৃদ্ধি সত্যই কোনও অস্বাভাবিক ঘটনার কারণে হয়েছিল (বলুন, একটি বার্ষিক বসন্ত পরিষ্কার করা বা আপনার বৃহত্তম সূচকগুলি পুনর্নির্মাণ), এবং সাধারণ, দৈনন্দিন ব্যবহারের কারণে নয়। আপনি যদি লগ ফাইলটিকে একটি হাস্যকর আকারে সঙ্কুচিত করেন এবং এসকিউএল সার্ভারটি আপনার স্বাভাবিক ক্রিয়াকলাপ সামঞ্জস্য করতে আবার এটি বাড়িয়ে তুলতে পারে তবে আপনি কী অর্জন করেছেন? আপনি কি কেবলমাত্র অস্থায়ীভাবে ছেড়ে দিয়েছিলেন সেই ডিস্ক স্থানটি ব্যবহার করতে সক্ষম? আপনার যদি তাত্ক্ষণিক সংশোধন প্রয়োজন হয়, তবে আপনি নিম্নলিখিতগুলি চালাতে পারেন:

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
DBCC SHRINKFILE(yourdb_log, 200); -- unit is set in MBs
GO

অন্যথায়, একটি উপযুক্ত আকার এবং বৃদ্ধি হার সেট করুন। পয়েন্ট-ইন-টাইম পুনরুদ্ধারের ক্ষেত্রে উদাহরণ অনুসারে, কোন ফাইলের আকার উপযুক্ত তা নির্ধারণ করতে এবং যুক্তিযুক্ত অটোগ্রোথ পরামিতিগুলি সেট করতে আপনি একই কোড এবং যুক্তি ব্যবহার করতে পারেন।

কিছু কাজ আপনি করতে চান না

  • TRUNCATE_ONLYবিকল্পের সাথে লগটি ব্যাক আপ করুন এবং তারপরেSHRINKFILE । একটির জন্য, এই TRUNCATE_ONLYবিকল্পটি হ্রাস করা হয়েছে এবং এসকিউএল সার্ভারের বর্তমান সংস্করণগুলিতে আর উপলভ্য নয়। দ্বিতীয়ত, আপনি যদি FULLপুনরুদ্ধার মডেলটিতে থাকেন তবে এটি আপনার লগ চেইনটিকে ধ্বংস করবে এবং একটি নতুন, পূর্ণ ব্যাকআপের প্রয়োজন হবে।

  • ডাটাবেসটি আলাদা করুন, লগ ফাইলটি মুছুন এবং পুনরায় সংযুক্ত করুন । আমি জোর দিয়ে বলতে পারি না এটি কতটা বিপজ্জনক হতে পারে। আপনার ডাটাবেস ফিরে না আসতে পারে, সন্দেহ হিসাবে এটি আসতে পারে, আপনাকে ব্যাকআপে ফিরে যেতে হতে পারে (যদি আপনার একটি থাকে) ইত্যাদি etc.

  • "সঙ্কুচিত ডাটাবেস" বিকল্পটি ব্যবহার করুনDBCC SHRINKDATABASEএবং এটি করার জন্য রক্ষণাবেক্ষণ পরিকল্পনার বিকল্পটি হ'ল খারাপ ধারণা, বিশেষত যদি আপনার কেবলমাত্র কোনও লগ সমস্যার সমস্যা সমাধানের প্রয়োজন হয়। আপনি যে ফাইলটি সামঞ্জস্য করতে চান এবং এটি স্বাধীনভাবে সমন্বয় লক্ষ্য ব্যবহার DBCC SHRINKFILEবা ALTER DATABASE ... MODIFY FILE(উপরের উদাহরণগুলোতে)।

  • লগ ফাইলটি 1 এমবিতে সঙ্কুচিত করুন । এটি লোভনীয় বলে মনে হচ্ছে কারণ, আরে, এসকিউএল সার্ভার আমাকে এটি কিছু নির্দিষ্ট পরিস্থিতিতে করতে দেবে এবং এটি যে সমস্ত জায়গা খালি করে তা তাকাবে! আপনার ডাটাবেসটি কেবল না পড়লে (এবং এটি হ'ল এটি আপনাকে ব্যবহার হিসাবে চিহ্নিত করা উচিত ALTER DATABASE) এটি একেবারে কেবলমাত্র অনেক অপ্রয়োজনীয় বৃদ্ধির ঘটনা ঘটায়, কারণ লগটিকে পুনরুদ্ধারের মডেল নির্বিশেষে বর্তমান লেনদেনগুলি সামঞ্জস্য করতে হবে। এই স্থানটি অস্থায়ীভাবে মুক্ত করার অর্থ কী, কেবল এসকিউএল সার্ভার এটিকে আস্তে আস্তে এবং ব্যথার সাথে ফিরিয়ে নিতে পারে?

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

সতর্ক হও

আপনার লগ ফাইলটি কিছুটা অল্প পরিমাণে সঙ্কুচিত করার পরিবর্তে এবং অল্প পরিমাণে নিজেরাই অবিচ্ছিন্নভাবে বাড়িয়ে দেওয়ার পরিবর্তে এটি কিছুটা যুক্তিসঙ্গত বড় আকারে সেট করুন (এমন একটি যা আপনার বৃহত্তম সমান্তরাল লেনদেনের যোগফলকে সামঞ্জস্য করবে) এবং একটি যুক্তিসঙ্গত অটোগ্রো সেট করুন ফ্যালব্যাক হিসাবে সেট করা, যাতে একক লেনদেনকে সন্তুষ্ট করতে একাধিকবার বাড়তে হয় না এবং এটি স্বাভাবিক ব্যবসায়িক ক্রিয়াকলাপের সময় কখনও বাড়তে হবে এমনটি অপেক্ষাকৃত বিরল।

এখানে সবচেয়ে খারাপ সম্ভাব্য সেটিংসগুলি হ'ল 1 এমবি বৃদ্ধি বা 10% বৃদ্ধি। যথেষ্ট মজার বিষয়, এগুলি এসকিউএল সার্ভারের ডিফল্ট (যা আমি অভিযোগ করেছি এবং কোনও লাভের পরিবর্তনের জন্য বলেছি ) - ডেটা ফাইলের জন্য 1 এমবি, এবং লগ ফাইলের জন্য 10%। প্রাক্তনটি এই দিন এবং যুগে খুব ছোট এবং পরবর্তী সময়টি প্রতিবারই দীর্ঘ এবং দীর্ঘতর ইভেন্টগুলির দিকে পরিচালিত করে (বলুন, আপনার লগ ফাইলটি 500 এমবি, প্রথম বৃদ্ধি 50 এমবি, পরবর্তী বৃদ্ধি 55.5 এমবি, পরবর্তী বৃদ্ধি 60.5 এমবি ইত্যাদি ইত্যাদি - এবং ধীরে ধীরে I / O, বিশ্বাস করুন, আপনি সত্যিই এই বক্ররেখা লক্ষ্য করবেন)।

আরও পড়া

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

২০০৯ সালে আমি একটি ব্লগ পোস্ট লিখেছিলাম যখন আমি কয়েকটিকে "লগ ফাইলটি সঙ্কুচিত করার জন্য এখানে রয়েছে" পোস্টগুলি বসন্তে দেখতে পেলাম

একটি ব্লগ পোস্ট ব্রেন্ট ওজার চার বছর আগে একটি এসকিউএল সার্ভার ম্যাগাজিন নিবন্ধ প্রকাশিত হওয়া উচিত ছিল না বলে প্রতিক্রিয়া জানিয়ে একাধিক সংস্থার দিকে ইঙ্গিত করে লিখেছিল

পল র্যান্ডালের একটি ব্লগ পোস্ট ব্যাখ্যা করছে যে টি-লগ রক্ষণাবেক্ষণ কেন গুরুত্বপূর্ণ এবং কেন আপনার ডেটা ফাইল সঙ্কুচিত করা উচিত নয়

মাইক ওয়ালশের একটি দুর্দান্ত উত্তর রয়েছে যার মধ্যে এই কয়েকটি দিকও রয়েছে যার সাথে আপনি নিজের লগ ফাইলটি তাত্ক্ষণিকভাবে সঙ্কুচিত করতে পারবেন না এমন কারণগুলিও অন্তর্ভুক্ত রয়েছে


5
পয়েন্ট-ইন-টাইম রিকভারি পুরো পুনরুদ্ধার মডেলটি ব্যবহার করার একমাত্র কারণ নয়। মূল কারণ হ'ল ডেটা ক্ষতি রোধ করা। আপনার ডেটা ক্ষতির সম্ভাবনা হ'ল ব্যাকআপগুলির মধ্যে দৈর্ঘ্য। আপনি যদি কেবল একটি দৈনিক ব্যাকআপ করেন তবে আপনার ডেটা ক্ষতির সম্ভাবনা 24 ঘন্টা। আপনি যদি প্রতি আধ ঘন্টা পরে লগ ব্যাকআপ যোগ করেন তবে আপনার ডেটা ক্ষতির সম্ভাবনা 30 মিনিট হয়ে যায়। অতিরিক্তভাবে, লগ ব্যাকআপগুলি কোনও ধরণের টুকরোয়াল পুনরুদ্ধার (দুর্নীতি থেকে পুনরুদ্ধার করা) সম্পাদন করা প্রয়োজন।
রবার্ট এল ডেভিস

9
একদিকে, এটি এই পৃষ্ঠায় প্রদত্ত সর্বাধিক সম্পূর্ণ এবং সঠিক উত্তর।
রবার্ট এল ডেভিস

11
আমি আরও যোগ করতে চাই যে লগটি ক্লিয়ারিং লগ ব্যাকআপ (সম্পূর্ণ বা বাল্ক-লগড পুনরুদ্ধারে) বা একটি চেকপয়েন্ট (সহজ পুনরুদ্ধারে) দ্বারা সম্পন্ন হয়। তবে, আপনি যদি এমন পরিস্থিতিতে থাকেন যে আপনার অবশ্যই লগ ফাইলটি সঙ্কুচিত করতে হবে, এটি পর্যাপ্ত নয়। আপনাকে বর্তমানে সক্রিয় ভিএলএফকে লগ ফাইলের শুরুতে ফিরে সাইকেল চালিয়ে যাওয়ার কারণ হতে হবে। আপনি এসকিউএল ২০০৮ এ এবং নতুন দুটি লগ ব্যাকআপ বা চেকপয়েন্টগুলি পিছনে পিছনে জারি করে জোর করতে পারেন। প্রথমটি এটি সাফ করে এবং দ্বিতীয়টি এটি ফাইলের শুরুতে ফিরে যায়।
রবার্ট এল ডেভিস

2
@ ডাওগ_আইভিসন কারণ যে কোনও মুহুর্তে লগ রেকর্ডগুলি শুদ্ধ হতে পারে। অসম্পূর্ণ একটি লগ ব্যাক আপ করার অনুমতি দেওয়ার বিন্দুটি কী হবে? সাধারণ পুনরুদ্ধারে, লগটি কেবল সত্যিকারের লেনদেনের রোলব্যাকের জন্য ব্যবহার করতে ব্যবহৃত হয়। একবার কোনও লেনদেন প্রতিশ্রুতিবদ্ধ বা ফিরে ঘুরিয়ে ফেলা হলে, পরের দ্বিতীয়টি এটি লগ থেকে চলে যেতে পারে।
অ্যারন বারট্র্যান্ড

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

201
-- DON'T FORGET TO BACKUP THE DB :D (Check [here][1]) 


USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO

থেকে: ডিবিসিসি শ্রিনকফিল (লেনদেন-এসকিউএল)

আপনি প্রথমে ব্যাকআপ নিতে চান।


মাইমোনাইডসকে ধন্যবাদ, এটি ডক্স থেকে, তাই আমি বলব এটি সেরা: পি বিশেষত কারণ আমার দ্বারা উদ্ভাবিত হয়নি :)
রুই লিমা

1
আমি এটি করার পরে, আমার লগের আকার কিছুটা বদলেনি। আমি কি কিছু ভুল করবেন?
চেস্টার 89

1
এই পদ্ধতির পুনরুদ্ধার প্রকারটি "সম্পূর্ণ" এ সেট করে, এমনকি পুনরুদ্ধারের
ধরণটি

1
ম্যাজিকের মতো কাজ করেছেন! নোট করুন যে লগ ফাইলটির নামটি আসলে এটির যৌক্তিক নাম (যা db-> বৈশিষ্ট্য-> ফাইলগুলিতে পাওয়া যায়)
বিজান

2
আমি এই স্ক্রিপ্টটিতে একটি ব্যাকআপ ডেটাবেস ক্লজটি অন্তর্ভুক্ত করব, তাই কেউ এই অংশটি ভুলে যায় না। আমি এটি বলি, কারণ কয়েক বছর আগে আমি একটি ডিস্কে একটি ডাটাবেস সঙ্কুচিত করেছি যেখানে এটির খুব কম জায়গা রয়েছে। সঙ্কুচিত প্রক্রিয়াতে, ফাইলগুলি বড় হচ্ছিল এবং আউট অফ স্পেস ত্রুটি নিক্ষেপ করা হয়েছিল। ফলাফল: আমি ডাটাবেস হারিয়েছি। ভাগ্যক্রমে একটি লগ ডাটাবেস যা সহনতা হারাতে হয়েছিল।
সিজার

185

অস্বীকৃতি: দয়া করে নীচে মন্তব্যগুলি সাবধানতার সাথে পড়ুন, এবং আমি ধরে নিয়েছি আপনি ইতিমধ্যে গৃহীত উত্তরটি পড়েছেন। আমি প্রায় 5 বছর আগে বলেছি:

যদি এটি পর্যাপ্ত বা অনুকূল সমাধান না হয় পরিস্থিতিগুলির জন্য যোগ করার জন্য যদি কোনও মন্তব্য থাকে তবে নীচে মন্তব্য করুন


  • ডাটাবেসের নামে ডান ক্লিক করুন।

  • কার্যগুলি r সঙ্কুচিত করুন → ডাটাবেস নির্বাচন করুন

  • তারপরে ক্লিক করুন OK!

আমি সাধারণত উইন্ডোজ এক্সপ্লোরার ডিরেক্টরিটি ডাটাবেস ফাইলগুলি সহ খোলি, তাই আমি তাত্ক্ষণিকভাবে এর প্রভাবটি দেখতে পারি।

আমি আসলে এই কাজ বেশ অবাক হয়েছিল! সাধারণত আমি আগে ডিবিসিসি ব্যবহার করেছি, তবে আমি কেবল এটি চেষ্টা করেছি এবং এটি কিছুই সঙ্কোচিত হয়নি, তাই আমি জিইউআই (2005) চেষ্টা করেছিলাম এবং এটি দুর্দান্ত কাজ করেছিল - 10 সেকেন্ডের মধ্যে 17 জিবি ছাড়িয়ে

সম্পূর্ণ পুনরুদ্ধার মোডে এটি কাজ নাও করতে পারে, তাই আপনাকে প্রথমে প্রথমে লগ ব্যাক আপ করতে হবে, বা সরল পুনরুদ্ধারে পরিবর্তন করতে হবে, তারপরে ফাইলটি সঙ্কুচিত করুন। [এটির জন্য @ ইউনডপ্যাটেকসকেড ধন্যবাদ]

-

পিএস: এর বিপদগুলি সম্পর্কে কেউ কেউ যা মন্তব্য করেছেন আমি তার প্রশংসা করি, তবে আমার পরিবেশে আমার নিজেই এটি করার কোনও সমস্যা হয়নি বিশেষত যেহেতু আমি সর্বদা প্রথমে একটি সম্পূর্ণ ব্যাকআপ করি। সুতরাং দয়া করে আপনার পরিবেশ কী তা বিবেচনা করুন এবং এটি কীভাবে চালিয়ে যাওয়ার আগে আপনার ব্যাকআপ কৌশল এবং কাজের সুরক্ষাকে প্রভাবিত করে। আমি যা করছিলাম তা হ'ল মাইক্রোসফ্ট দ্বারা সরবরাহিত কোনও বৈশিষ্ট্যের প্রতি লোককে ইশারা করা!


50
সম্পূর্ণ পুনরুদ্ধার মোডে এটি কাজ নাও করতে পারে, তাই আপনাকে প্রথমে প্রথমে লগ ব্যাক আপ করতে হবে, বা সরল পুনরুদ্ধারে পরিবর্তন করতে হবে, তারপরে ফাইলটি সঙ্কুচিত করুন।
onupdatecascade

7
@ ইউনুপডেটেকাসকেড - পূর্ণ পুনরুদ্ধারের কৌশলটিতে ভাল কল। বিশাল লগ সহ অন্য একটি ডাটাবেস ছিল: সাধারণটিতে স্যুইচ করা হয়েছে, তারপর ডাটাবেস সঙ্কুচিত করুন এবং পুরোপুরি ফিরে যেতে হবে। লগ ফাইল 500 কেবি নিচে!
সাইমন_উইভার

26
দুঃখিত। তবে এই উত্তরটি আরও বেশি ভুল হতে পারে না। ডাটাবেস সঙ্কুচিত করে আপনি লেনদেনের লগ ফাইলটি বাড়িয়ে তুলবেন। আপনি যখন কোনও এসকিউএল সার্ভার ডাটাবেসে ডেটা স্থানান্তর করেন, তখন আপনাকে লগিংয়ের প্রয়োজন হয় - লগ ফাইলটি ফোটানো। লগের আকার হ্রাস করতে, হয় ডিবিটিকে সাধারণ পুনরুদ্ধারের জন্য সেট করুন (যদি আপনার লগ করা ডেটার যত্ন / প্রয়োজন হয় - এবং আপনি প্রায়শই উত্পাদনে করেন) লগ ব্যাক আপ করুন। এই সরল, ফ্রি, ভিডিওগুলিতে আরও বিশদ: sqlservervideos.com/video/logging-essentials sqlservervideos.com/video/sql2528-log-files
মাইকেল কে। ক্যাম্পবেল

30
বাহ, এই উত্তরের জন্য 1300+ প্রতিনিধি পাওয়ার জন্য কুডোস, তবে এটি সত্যই ভয়ঙ্কর পরামর্শ।
অ্যারন বারট্র্যান্ড

8
এখানে কি ঘটছে তা বোঝানোর জন্য একটি অতিরঞ্জিতভাবে বলা হচ্ছে এবং পর্যায়ক্রমিক ভিত্তিতে সঙ্কুচিত হওয়া কেন একেবারে সমালোচিত: একটি ব্যাকআপ সম্পন্ন হওয়ার আগে 1 মিলিয়ন বার রেকর্ড এ পরিবর্তন করা হয়। লগতে কি আছে? 999,999 টুকরো তথ্য যা অপ্রাসঙ্গিক। লগগুলি যদি সঙ্কুচিত না হয় তবে আপনি কখনই জানতে পারবেন না যে ডাটাবেসের আসল অপারেটিং ব্যয়টি কী। এছাড়াও, আপনি কোনও সান-এর উপর মূল্যবান সংস্থান হোগিং করছেন most সঙ্কুচিত হওয়াই ভাল রক্ষণাবেক্ষণ এবং আপনার পরিবেশের সাথে আপনাকে যোগাযোগ রাখে। এমন কাউকে আমাকে দেখান যিনি ভাবেন যে আপনার কখনও সঙ্কোচিত হওয়া উচিত নয় এবং আমি আপনাকে দেখাব যে কেউ তাদের পরিবেশ উপেক্ষা করছে।
নিউক্লিক

54

নীচে লেনদেন লগ সঙ্কুচিত করার জন্য একটি স্ক্রিপ্ট দেওয়া আছে তবে আমি অবশ্যই লেনদেনের লগটিকে সঙ্কুচিত করার আগে ব্যাক আপ করার পরামর্শ দেব recommend

আপনি যদি ফাইলটি সঙ্কুচিত করেন তবে আপনি এমন এক টন ডেটা হারাতে যাচ্ছেন যা দুর্যোগের ক্ষেত্রে জীবনরক্ষক হিসাবে আসতে পারে। লেনদেন লগে প্রচুর দরকারী ডেটা থাকে যা তৃতীয় পক্ষের লেনদেনের লগ রিডার ব্যবহার করে পড়া যায় (এটি ম্যানুয়ালি পড়তে পারে তবে চূড়ান্ত প্রচেষ্টা সহ) with

সময় পুনরুদ্ধারে নির্দেশ করার সময় লেনদেন লগও আবশ্যক, তাই কেবল এটিকে ফেলে দেবেন না, তবে নিশ্চিত হয়ে নিন যে আপনি এটি পূর্বেই ব্যাক আপ করেছেন।

এখানে বেশ কয়েকটি পোস্ট রয়েছে যেখানে লোকেরা পুনরুদ্ধারটি সম্পন্ন করতে লেনদেনের লগতে সঞ্চিত ডেটা ব্যবহার করেছিল:

 

USE DATABASE_NAME;
GO

ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);

ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO

উপরের এক্সিকিউটিভ কমান্ডগুলি যখন দেখায় আপনি এমন একটি ত্রুটি দেখতে পান যা দেখতে পারা যায়

"লগ ফাইল (লগ ফাইলের নাম) সঙ্কুচিত করা যায় না কারণ ফাইলের শেষে অবস্থিত লজিক্যাল লগ ফাইলটি ব্যবহারের জন্য রয়েছে"

এর অর্থ হল যে টিএলওজি ব্যবহারে রয়েছে। এক্ষেত্রে একাধিকবার এটি সম্পাদন করার চেষ্টা করুন বা ডাটাবেসের ক্রিয়াকলাপ হ্রাস করার উপায় সন্ধান করুন।


30

এখানে একটি সহজ এবং খুব অকার্যকর এবং সম্ভাব্য বিপজ্জনক উপায়।

  1. ব্যাকআপ ডিবি
  2. ডিটিচ ডিবি
  3. লগ ফাইলটির নাম পরিবর্তন করুন
  4. ডিবি সংযুক্ত করুন
  5. নতুন লগ ফাইল পুনরায় তৈরি করা হবে
  6. পুনঃনামিত লগ ফাইল মুছুন।

আমি অনুমান করছি যে আপনি লগ ব্যাকআপ করছেন না। (যা লগ কেটে ফেলবে)। আমার পরামর্শ থেকে পুনরুদ্ধারের মডেল পরিবর্তন হয় পূর্ণ করার সহজ । এটি লগ ফোটা রোধ করবে।


15
সম্মানজনকভাবে, লগ মুছে ফেলা / নামকরণ / পুনর্নির্মাণ / প্রতিস্থাপন / খুব খারাপ ধারণা। সঙ্কুচিত হওয়া অবশ্যই কম ঝুঁকিপূর্ণ, এটি করা খুব সহজ।
onupdatecascade

12
+1 - অবৈধ বা না, এই পদ্ধতিটি বেশ কয়েকবার আমাকে গরম জল থেকে পুরো ডেস্কে ভরাট করে এমন ডেটাবেস লগ দিয়ে ফেলেছে, যেমন একটি সঙ্কুচিত কমান্ডও চালাতে পারে না।
শৌল বেহর

3
লগতে অদৃশ্যভাবে লেনদেনের ঝুঁকি নেই?
পল

এটি ছোট ডিবি'র জন্যও ঠিক হতে পারে তবে আপনার যদি 3 বা 4 টিবি ডিবি থাকে তবে এটি সেরা সমাধান নাও হতে পারে।
জাকস

আপনি যদি দীর্ঘ সময় ধরে একটি সিস্টেম বিকাশ করে থাকেন এবং দেব পিরিয়ডের সময় হাজার হাজার রেকর্ড লোড / মুছে ফেলেন তবে এটি ঠিক আছে বলে মনে হচ্ছে। তারপরে আপনি যখন এই ডেটাবেসটিকে লাইভ মোতায়েন করতে ব্যবহার করতে চান, তখন লগ করা টেস্টিং / ডেভেলপমেন্ট ডেডামেন্ট এবং তাই এটি যদি হারিয়ে যায় তবে কিছু যায় আসে না?
জেসন স্ট্যাথাম

28

যদি আপনি পুনঃস্থাপনের জন্য লেনদেন লগগুলি ব্যবহার না করেন (যেমন আপনি কেবল সর্বদা সম্পূর্ণ ব্যাকআপ করেন), আপনি পুনরুদ্ধার মোডটিকে "সাধারণ" এ সেট করতে পারেন এবং লেনদেন লগ খুব শীঘ্রই সঙ্কুচিত হয়ে যাবে এবং আর কখনও পূরণ হবে না।

আপনি যদি এসকিউএল 7 বা 2000 ব্যবহার করেন তবে আপনি ডাটাবেস বিকল্প ট্যাবে "চেকপয়েন্টে ট্র্যাঙ্কেট লগ অন ট্রান্সকেট" সক্ষম করতে পারবেন। এটি একই প্রভাব আছে।

এটি উত্পাদন পরিবেশে স্পষ্টতই পুনরুদ্ধার করা হয় না, যেহেতু আপনি সময়ে একটি বিন্দুতে পুনরুদ্ধার করতে সক্ষম হবেন না।


1
পুনরুদ্ধারের মোডটিকে সহজতে সেট করা, নিজেরাই, যাদুতে লেনদেনের লগটিকে সঙ্কুচিত করবে না।
অ্যারন বারট্র্যান্ড

@ অ্যারন এটি নিজস্ব নয়, না। আমি ধরে নিয়েছি যে ওপি তাদের পরীক্ষামূলক ডাটাবেসটি ব্যবহার করবে, এবং তাই "লেনদেনের লগ খুব শীঘ্রই সঙ্কুচিত হবে", তবে আপনি ঠিক বলেছেন যে এটির আরও বেশি পার্শ্ব প্রতিক্রিয়া রয়েছে: সাধারণের পুনরুদ্ধার মোড সম্ভবত আপনাকে সঙ্কুচিত করে শেষ করবে শীঘ্রই লেনদেন লগ
জোনাথন

" Simple... এবং আর কখনও পূরণ করবেন না" - সত্য নয়। আমি এটি ঘটতে দেখেছি (গত 48 ঘন্টার মধ্যে) একটি ডাটাবেসে যেখানে রিকভারি মডেলটি "সিম্প্লে" সেট করা হয়েছিল। লগফিলের ফাইলগ্রোথটি "সীমাবদ্ধ" এ সেট করা হয়েছিল এবং আমরা এটিতে কিছু বিশাল ক্রিয়াকলাপ করছিলাম ... আমি বুঝতে পারি যে এটি একটি অস্বাভাবিক পরিস্থিতি ছিল। (আমাদের পরিস্থিতিতে, যেখানে আমাদের প্রচুর ডিস্কের জায়গা ছিল, আমরা লগফিলের আকার বাড়িয়েছিলাম এবং লগ-ফাইলে ফাইলগ্রোথকে "সীমাহীন" করে দিয়েছি ... যা - ইনফেসফেস বাগ - পরিবর্তনের পরে - "সীমাবদ্ধ হিসাবে" দেখায় "সর্বোচ্চ 2,097,152 মেগাবাইটের সাথে।)
ডগ_ইভিজন

2
@ ডাওগ_আইভিসন হ্যাঁ, লেনদেনের লগে এতে প্রকাশ্য লেনদেন হবে তবে চেকপয়েন্ট হয়ে যাওয়ার পরে এগুলি সরল মোডে সরানো হবে। এই উত্তরটি কেবলমাত্র "আমার বিকাশ / পরীক্ষার বাক্সে একটি বড় লেনদেনের লগ রয়েছে হিসাবে তৈরি করা হয়েছে এবং আমি এটিটি চলে যেতে চাই তাই আমাকে প্রায়শই এটি নিয়ে উদ্বিগ্ন হওয়ার দরকার নেই", বরং প্রযোজনায় যাওয়ার ইচ্ছার চেয়ে। পরিবেশ। পুনরাবৃত্তি করতে: উত্পাদনে এটি করবেন না
জোনাথন

1
এটি সত্য, এবং আমি পেয়েছি যে এটি ছিল কেবলমাত্র উন্নয়নের এক দ্রুত পদ্ধতির। আমি কেন মন্তব্য করেছি: যতক্ষণ না এটি আমার কাছে ঘটেছিল, আমি আসলেই ভেবেছিলাম যে সহজ পুনরুদ্ধারের মডেলটি পূরণ করতে পারে না ... এবং আমি মনে করি যে এটি অস্বাভাবিকভাবে বড় লেনদেন করতে পারে তা বুঝতে পেরে আমাকে আরও বেশি সময় লেগেছে।
ডগ_ইভিসন

9

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


... তবে আমি ইস্যু না করে কয়েকবার এটি করে ফেলেছি। সম্ভবত আপনি ব্যাখ্যা করতে পারেন কেন ডিবি পুনরায় সংযুক্ত না করতে পারে।
জনো নোলান

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

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

2
খুব, খুব সত্য হারুন।
mrdenny

হ্যাঁ, এটা ঠিক আমাদের সাথে ঘটেছিল। আমরা লগ ফাইলটি 20G খনন করতে চেয়েছিলাম যেহেতু আমরা ডাটাবেস স্থানান্তরিত করার আগে কেবলমাত্র ডেটা ব্যাক আপ করতাম। এমএসএসকিউএল কোনওভাবেই আমাদের নতুন ডাটাবেসটিকে হুমং লগ ফাইল ছাড়াই পুনরায় সংযুক্ত করার অনুমতি দেয় না would
জর্জ এম পুনরায় ইনস্টল করুন মনিকা 23

9

এখানের বেশিরভাগ উত্তরগুলি ধরে নিচ্ছে যে আপনার আসলে লেনদেন লগ ফাইলের দরকার নেই, তবে যদি আপনার ডাটাবেসটি FULLপুনরুদ্ধার মডেলটি ব্যবহার করে এবং আপনার ডাটাবেসটি পুনরুদ্ধার করার প্রয়োজনে আপনার ব্যাকআপগুলি রাখতে চান, তবে এটি কাটা বা মুছবেন না এই উত্তরগুলির অনেকের পরামর্শ মতো লগ ফাইল করুন log

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

থেকে মাইক্রোসফট নিবন্ধBACKUP

আমরা আপনাকে সুপারিশ করি যে আপনি কখনই লেনদেনের লগকে ম্যানুয়ালি কাটাতে NO_LOG বা TRUNCATE_ONLY ব্যবহার করবেন না, কারণ এটি লগ চেইনটি ভেঙে দেয়। পরবর্তী সম্পূর্ণ বা ডিফারেনশিয়াল ডাটাবেস ব্যাকআপ না হওয়া পর্যন্ত ডাটাবেস মিডিয়া ব্যর্থতা থেকে সুরক্ষিত নয়। শুধুমাত্র খুব বিশেষ পরিস্থিতিতে ম্যানুয়াল লগ কাটা ব্যবহার করুন এবং তাত্ক্ষণিকভাবে ডেটার ব্যাকআপ তৈরি করুন।

এটি এড়াতে আপনার লগ ফাইলটি সঙ্কুচিত হওয়ার আগে ডিস্কে ব্যাকআপ করুন । বাক্য গঠনটি দেখতে এরকম কিছু দেখবে:

BACKUP LOG MyDatabaseName 
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'

DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)

3
আমি , 1)অংশটি ব্যতীত আপনার উত্তরের সাথে একমত । সমস্যাটি হ'ল আপনি যদি এটি 1 এমবি-তে সঙ্কুচিত করেন তবে সাধারণ লগ আকারের দিকে এগিয়ে যাওয়ার প্রবৃদ্ধি ইভেন্টগুলি বেশ ব্যয়বহুল হবে এবং বৃদ্ধির হার যদি 10% ডিফল্টে ছেড়ে যায় তবে তাদের মধ্যে অনেকগুলিই থাকবে ।
অ্যারন বারট্রান্ড

9

এসকিউএল সার্ভার লেনদেন লগটি এর অযাচিত বৃদ্ধি রোধ করার জন্য সঠিকভাবে বজায় রাখা দরকার। এর অর্থ লেনদেন লগ ব্যাকআপগুলি প্রায়শই চলমান। এটি না করে আপনি লেনদেনের লগকে পূর্ণ হয়ে ওঠার ঝুঁকিপূর্ণ করেন।

এই প্রশ্নের উত্তর ছাড়াও আমি লেনদেনের লৌকিক প্রচলিত গল্পগুলি পড়ার এবং বোঝার পরামর্শ দিই। এই রিডিংগুলি লেনদেনের লগ বুঝতে এবং এটি "পরিষ্কার" করার জন্য কোন কৌশলগুলি ব্যবহার করতে হবে তা সিদ্ধান্ত নিতে সহায়তা করতে পারে:

থেকে 10 সবচেয়ে গুরুত্বপূর্ণ SQL সার্ভার লেনদেন লগ কাল্পনিক :

মিথ: আমার এসকিউএল সার্ভারটি খুব ব্যস্ত। আমি এসকিউএল সার্ভার লেনদেন লগ ব্যাকআপ করতে চাই না

এসকিউএল সার্ভারের সবচেয়ে বড় পারফরম্যান্স নিবিড় ক্রিয়াকলাপগুলির মধ্যে একটি হ'ল অনলাইন লেনদেন লগ ফাইলের একটি অটো-গ্রোভ ইভেন্ট। লেনদেন লগ ব্যাকআপগুলি প্রায়শই পর্যাপ্ত পরিমাণে না করে অনলাইন লেনদেন লগ পূর্ণ হয়ে যায় এবং বাড়তে হবে। ডিফল্ট বৃদ্ধির আকার 10%। ডাটাবেসটি সবচেয়ে ব্যস্ত, লেনদেন লগ ব্যাকআপগুলি তৈরি না করা হলে অনলাইন লেনদেনের লগটি তত দ্রুত বৃদ্ধি পাবে এসকিউএল সার্ভার লেনদেন লগ ব্যাকআপ তৈরি করা অনলাইনে লেনদেন লগকে অবরুদ্ধ করে না, তবে একটি স্ব-বৃদ্ধি ইভেন্টটি করে। এটি অনলাইন লেনদেন লগের সমস্ত ক্রিয়াকলাপ অবরুদ্ধ করতে পারে

থেকে লেনদেন লগ কাল্পনিক :

মিথ: নিয়মিত লগ সঙ্কোচন একটি ভাল রক্ষণাবেক্ষণ অনুশীলন

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


5

প্রথমে ডাটাবেস পুনরুদ্ধারের মডেলটি পরীক্ষা করুন। ডিফল্টরূপে, এসকিউএল সার্ভার এক্সপ্রেস সংস্করণ সহজ পুনরুদ্ধারের মডেলটির জন্য একটি ডাটাবেস তৈরি করে (যদি আমি ভুল না করি)।

কেবলমাত্র ট্রান্সকেট_এই ব্যাকআপ লগ ডাটাবেসনাম:

DBCC ShrinkFile(yourLogical_LogFileName, 50)

SP_helpfile আপনাকে লজিকাল লগ ফাইলের নাম দেবে।

নির্দেশ করে:

একটি এসকিউএল সার্ভার ডাটাবেসে সম্পূর্ণ লেনদেনের লগ থেকে পুনরুদ্ধার করুন

যদি আপনার ডাটাবেস পূর্ণ পুনরুদ্ধার মডেলটিতে থাকে এবং আপনি যদি টিএল ব্যাকআপ না নিচ্ছেন তবে সিমপ্লেতে এটি পরিবর্তন করুন।


এইভাবে আমি আমার ডেভ বাক্সগুলিতে লগ ফাইলগুলি সাফ করি। সমস্ত সম্পর্কিত ব্যাকআপ কৌশল ইত্যাদির সাথে পরিবেশ পরিবেশগুলি আমি ডিবিএ'র :
জুন

TRUNCATE_ONLYএসকিউএল সার্ভারের বর্তমান সংস্করণগুলিতে আর বিকল্প নেই এবং এটি সমর্থন করে এমন সংস্করণগুলিতে এটি প্রস্তাবিত নয় ( রাহেলের উত্তর দেখুন )।
অ্যারন বারট্র্যান্ড

5

DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)কমান্ডটি ব্যবহার করুন । যদি এটি একটি পরীক্ষামূলক ডাটাবেস হয় এবং আপনি স্থান বাঁচাতে / পুনরায় দাবি করার চেষ্টা করছেন, এটি সাহায্য করবে।

মনে রাখবেন যে টিএক্স লগগুলির ন্যূনতম / অবিচলিত রাষ্ট্র আকারের এক ধরণের থাকে যা তারা বড় হবে। আপনার পুনরুদ্ধারের মডেলটির উপর নির্ভর করে আপনি লগটি সঙ্কুচিত করতে পারবেন না - যদি পুরোপুরি থাকে এবং আপনি টিএক্স লগ ব্যাকআপ জারি না করেন তবে লগটি সঙ্কুচিত করা যায় না - এটি চিরতরে বাড়বে। আপনার যদি টিএক্স লগ ব্যাকআপের প্রয়োজন না হয় তবে আপনার পুনরুদ্ধারের মডেলটিকে সিম্পল করুন

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

কখনই লেনদেনের লগ মুছবেন না - আপনি ডেটা হারাবেন! আপনার ডেটার অংশটি টিএক্স লগে রয়েছে (পুনরুদ্ধারের মডেল নির্বিশেষে) ... আপনি যদি টিএক্স লগ ফাইলটি আলাদা করে "নামকরণ" করেন যা কার্যকরভাবে আপনার ডাটাবেসের অংশ মুছে ফেলে

যাঁরা টিএক্স লগ মুছে ফেলেছেন তাদের জন্য আপনি আরও কিছু ডেটা হারানোর আগে কয়েকটি চেকডবি কমান্ড চালাতে এবং দুর্নীতির সমাধান করতে চাইতে পারেন।

পল রান্ডাল এর ব্লগ পোস্ট খুব ভাল বিষয়, খারাপ পরামর্শ দেখুন

এছাড়াও সাধারণত এমডিএফ ফাইলগুলিতে সঙ্কোচন ফাইল ব্যবহার করবেন না কারণ এটি আপনার ডেটা মারাত্মকভাবে খণ্ডিত করতে পারে। আরও তথ্যের জন্য তার খারাপ পরামর্শ বিভাগটি দেখুন ("কেন আপনি আপনার ডেটা ফাইলগুলি সঙ্কুচিত করবেন না")

পলের ওয়েবসাইট দেখুন - তিনি এই খুব প্রশ্ন কভার। গত মাসে তিনি তাঁর মিথ্যাল এ ডে সিরিজটিতে এর অনেকগুলি ইস্যুটি পেরিয়েছিলেন


+1 প্রথম উত্তর হওয়ার জন্য এটি উল্লেখ করা যে এটি ভাল ধারণা নাও হতে পারে! ওপি একটি পরীক্ষামূলক ডাটাবেস নির্দিষ্ট করে তবে আরও সাধারণ ক্ষেত্রে এটি বেশ মূল্যবান it
মার্টিন স্মিথ

আমার যোগ করা উচিত ছিল - আপনি যদি টিএক্স লগ মুছে ফেলেন - আপডেট পুনরায় শুরু করুন!
রিপভ্লান

4

লগ ফাইলটি কাটাতে:

  • ডাটাবেস ব্যাকআপ
  • ডাটাবেসটি আলাদা করুন, হয় এন্টারপ্রাইজ ম্যানেজার ব্যবহার করে বা সম্পাদন করে: Sp_DetachDB [DBName]
  • লেনদেনের লগ ফাইল মুছুন। (বা কেবল ফাইলের নাম পরিবর্তন করুন)
  • আবার ব্যবহার করে ডাটাবেসটি পুনরায় সংযুক্ত করুন: Sp_AttachDB [DBName]
  • ডাটাবেস সংযুক্ত করা হয়, একটি নতুন লেনদেন লগ ফাইল তৈরি করা হয়।

লগ ফাইল সঙ্কুচিত করতে:

  • No_Log সহ ব্যাকআপ লগ [DBName]
  • ডাটাবেসটি সঙ্কুচিত করুন:

    এন্টারপ্রাইজ ম্যানেজার ব্যবহার করে: - ডাটাবেসটিতে ডান ক্লিক করুন, সমস্ত কার্য, সংকুচিত ডাটাবেস, ফাইল, লগ ফাইল নির্বাচন করুন, ঠিক আছে।

    টি-এসকিউএল ব্যবহার করে: - ডিবিসিসি সঙ্কোচফিল ([লগ_লজিক্যাল_নাম])

আপনি sp_helpdb চালিয়ে বা এন্টারপ্রাইজ ম্যানেজারের ডাটাবেসের বৈশিষ্ট্যগুলি অনুসন্ধান করে লগ ফাইলটির যৌক্তিক নামটি সন্ধান করতে পারেন।


কখনও লেনদেনের লগ মুছবেন না। আপনার ডেটা অংশ লগ হয়। এটি মুছুন এবং ডাটাবেস দুর্নীতিগ্রস্থ হয়ে যাবে। আমার কাছে ভোটের প্রত্যাহার নেই।
রিপভ্লান

4

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

"টেম্পডিবি" ডাটাবেসটির একটি ব্যাকআপ কোনও অর্থবোধ করে না, তাই এই ডিবিটির পুনরুদ্ধার মডেলটি সর্বদা "সরল" হওয়া উচিত।


কেবলমাত্র ডাটাবেসটিকে সাধারণ হিসাবে সেট করা লগ ফাইলটিকে সঙ্কুচিত করবে না, বর্তমানে এটি যে অবস্থায় রয়েছে তা এটি আরও বাড়তে বাধা দিতে পারে (তবে এটি এখনও পারে)।
অ্যারন বারট্র্যান্ড

4
  1. এমডিবি ফাইলটির ব্যাকআপ নিন।
  2. এসকিউএল পরিষেবা বন্ধ করুন
  3. লগ ফাইলটির নতুন নাম দিন
  4. পরিষেবাটি শুরু করুন

(সিস্টেমটি একটি নতুন লগ ফাইল তৈরি করবে))

নাম পরিবর্তন করা লগ ফাইল মুছুন বা সরান।


3

এটি আমার সাথে ঘটেছিল যেখানে ডেটাবেস লগ ফাইলটি 28 জিবি ছিল।

এটি কমাতে আপনি কী করতে পারেন? আসলে, লগ ফাইলগুলি সেই ফাইল ডেটা যা এসকিউএল সার্ভার যখন কোনও লেনদেনের সময় ঘটে থাকে keeps এসকিউএল সার্ভার প্রক্রিয়া করার জন্য লেনদেনের জন্য একই জন্য পৃষ্ঠা বরাদ্দ করা হয়। তবে লেনদেন সমাপ্ত হওয়ার পরে হঠাৎ এইগুলি ছেড়ে দেওয়া হয় না এই আশায় যে একই রকম কোনও লেনদেন আসতে পারে। এটি স্থান ধরে রাখে।

পদক্ষেপ 1: প্রথমে ডাটাবেস ক্যোয়ারী অন্বেষণ করা চেকপয়েন্টে এই কমান্ডটি চালান

পদক্ষেপ 2: ডাটাবেসটিতে ডান ক্লিক করুন টাস্ক> ব্যাক আপ লেনদেন হিসাবে ব্যাক আপ টাইপ নির্বাচন করুন ব্যাকআপ ডেটা রাখার জন্য একটি গন্তব্য ঠিকানা এবং ফাইলের নাম যুক্ত করুন (.বাক)

এই পদক্ষেপটি পুনরাবৃত্তি করুন এবং এই সময়ে অন্য একটি ফাইলের নাম দিন

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 3: এখন ডাটাবেসে যান ডাটাবেসে ডান ক্লিক করুন

টাস্ক> সঙ্কুচিত> ফাইলগুলি ফাইলের প্রকারটি লগ হিসাবে বেছে নিন রিলিজ অব্যবহৃত স্থান হিসাবে ক্রিয়া সঙ্কুচিত করুন

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 4:

আপনার লগ ফাইলটি সাধারণত এসকিউএল ২০১৪-তে পরীক্ষা করুন এটি এটিতে পাওয়া যাবে

সি: \ প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট এসকিউএল সার্ভার \ এমএসএসকিউএল 12. এমএসএসকিউএল ২০১৪ এক্সপ্রেস \ এমএসএসকিউএল \ ডেটা

আমার ক্ষেত্রে এটি 28 জিবি থেকে 1 এমবিতে হ্রাস পেয়েছে


2

এটা চেষ্টা কর:

USE DatabaseName

GO

DBCC SHRINKFILE( TransactionLogName, 1)

BACKUP LOG DatabaseName WITH TRUNCATE_ONLY

DBCC SHRINKFILE( TransactionLogName, 1)

GO 

TRUNCATE_ONLYএসকিউএল সার্ভারের বর্তমান সংস্করণগুলিতে আর বিকল্প নেই এবং এটি সমর্থন করে এমন সংস্করণগুলিতে এটি প্রস্তাবিত নয় ( রাহেলের উত্তর দেখুন )।
অ্যারন বারট্রান্ড


2

ডাটাবেস → রাইটস প্রোপার্টি ক্লিক করুন → ফাইল → আলাদা নামের সাথে অন্য লগ ফাইল যুক্ত করুন এবং ভিন্ন ফাইলের নামের সাথে পুরানো লগ ফাইলের মতোই পথটি সেট করুন।

ডাটাবেস স্বয়ংক্রিয়ভাবে সদ্য নির্মিত লগ ফাইলটি আপ করে তোলে।


1
  1. ব্যাকআপ ডিবি
  2. ডিটিচ ডিবি
  3. লগ ফাইলটির নাম পরিবর্তন করুন
  4. ডিবি সংযুক্ত করুন (অপসারণের সময় পুনরায় নামকরণ .ldf (লগ ফাইল) সংযুক্ত করুন। এটি নির্বাচন করুন এবং সরান বোতাম টিপে মুছে ফেলুন)
  5. নতুন লগ ফাইল পুনরায় তৈরি করা হবে
  6. পুনঃনামিত লগ ফাইল মুছুন।

এটি কাজ করবে তবে প্রথমে আপনার ডাটাবেসের ব্যাকআপ নেওয়ার পরামর্শ দেওয়া হচ্ছে।


1

অন্যান্য উত্তরগুলির কিছু আমার পক্ষে কার্যকর হয়নি: ডিবি অনলাইনে থাকাকালীন চৌকিটি তৈরি করা সম্ভব ছিল না, কারণ লেনদেনের লগ পূর্ণ ছিল (কতটা বিড়ম্বনাপূর্ণ)। তবে, জরুরি মোডে ডাটাবেস সেট করার পরে আমি লগ ফাইলটি সঙ্কুচিত করতে সক্ষম হয়েছি:

alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);

0

উদাহরণ:

DBCC SQLPERF(LOGSPACE)

BACKUP LOG Comapny WITH TRUNCATE_ONLY

DBCC SHRINKFILE (Company_log, 500)

DBCC SQLPERF(LOGSPACE)

TRUNCATE_ONLYএসকিউএল সার্ভারের বর্তমান সংস্করণগুলিতে আর বিকল্প নেই এবং এটি সমর্থন করে এমন সংস্করণগুলিতে এটি প্রস্তাবিত নয় ( রাহেলের উত্তর দেখুন )।
অ্যারন বারট্র্যান্ড

সহায়তা কেন্দ্রে সংজ্ঞায়িত হিসাবে স্ট্যাক ওভারফ্লোর জন্য প্রশ্নটি বিষয়ভিত্তিক নয় । দয়া করে এই জাতীয় প্রশ্নের উত্তর দিবেন না; পরিবর্তে, আপনার মনোযোগের জন্য তাদের পতাকাঙ্কিত করা উচিত এবং সেগুলি বন্ধ বা যথাযথভাবে স্থানান্তরিত হবে।
টবি স্পিড

0

এমএসএসকিউএল 2017 এর জন্য এবং এসকিউএল সার্ভার পরিচালনার স্টুডিও ব্যবহার করে সামান্য আপডেট হওয়া উত্তর updated আমি বেশিরভাগ এই নির্দেশাবলী থেকে গিয়েছিলাম https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-rrink-operations/ এ

আমার সাম্প্রতিক ডিবি ব্যাকআপ ছিল তাই আমি লেনদেনের লগ ব্যাক আপ করেছিলাম। তারপরে আমি আবার ভাল ব্যয়ের জন্য এটি ব্যাক আপ করেছি। অবশেষে আমি লগ ফাইলটি সঙ্কুচিত করেছিলাম, এবং 20 জি থেকে 7 এমবিতে গিয়েছিলাম, আমার ডেটার আকারের সাথে অনেক বেশি line 2 বছর আগে এটি ইনস্টল হওয়ার পর থেকে লেনদেন লগগুলি কখনও ব্যাক আপ করা হয়েছে বলে আমি মনে করি না ... সুতরাং গৃহকর্মী ক্যালেন্ডারে সেই কাজটি রাখা।


-1

ডিবি লেনদেন লগ ন্যূনতম আকারে সঙ্কুচিত করুন :

  1. ব্যাকআপ: লেনদেন লগ
  2. ফাইল সঙ্কুচিত করুন: লেনদেন লগ
  3. ব্যাকআপ: লেনদেন লগ
  4. ফাইল সঙ্কুচিত করুন: লেনদেন লগ

আমি বেশ কয়েকটি সংখ্যক ডিবিতে পরীক্ষা করেছি: এই সিকোয়েন্সটি কাজ করে

এটি সাধারণত 2MB এ সঙ্কুচিত হয়

বা স্ক্রিপ্ট দ্বারা:

DECLARE @DB_Name nvarchar(255);
DECLARE @DB_LogFileName nvarchar(255);
SET @DB_Name = '<Database Name>';               --Input Variable
SET @DB_LogFileName = '<LogFileEntryName>';         --Input Variable
EXEC 
(
'USE ['+@DB_Name+']; '+
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2) ' +
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2)'
)
GO

1
TRUNCATE_ONLYএসকিউএল সার্ভারের বর্তমান সংস্করণগুলিতে আর বিকল্প নেই এবং এটি সমর্থন করে এমন সংস্করণগুলিতে এটি প্রস্তাবিত নয় ( রাহেলের উত্তর দেখুন )।
অ্যারন বার্ট্র্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.