আমি কোনও এসকিউএল বিশেষজ্ঞ নই, এবং প্রতিবারের মৌলিক বিষয়গুলি ছাড়িয়ে কিছু করার দরকার পড়ার বিষয়টি আমি মনে করিয়ে দিচ্ছি। আমার কাছে একটি পরীক্ষামূলক ডাটাবেস রয়েছে যা আকারে বড় নয় তবে লেনদেনের লগ অবশ্যই হয়। আমি কীভাবে লেনদেনের লগ পরিষ্কার করব?
আমি কোনও এসকিউএল বিশেষজ্ঞ নই, এবং প্রতিবারের মৌলিক বিষয়গুলি ছাড়িয়ে কিছু করার দরকার পড়ার বিষয়টি আমি মনে করিয়ে দিচ্ছি। আমার কাছে একটি পরীক্ষামূলক ডাটাবেস রয়েছে যা আকারে বড় নয় তবে লেনদেনের লগ অবশ্যই হয়। আমি কীভাবে লেনদেনের লগ পরিষ্কার করব?
উত্তর:
একটি লগ ফাইল ছোট করা সত্যিই এমন পরিস্থিতিতে জন্য সংরক্ষিত করা উচিত যেখানে এটি অপ্রত্যাশিত বৃদ্ধির মুখোমুখি হয় যা আপনি আবার ঘটবে বলে আশা করেন না। যদি লগ ফাইলটি আবার একই আকারে বাড়তে থাকে তবে অস্থায়ীভাবে সঙ্কুচিত করে খুব বেশি কার্যকর করা হয় না। এখন, আপনার ডাটাবেসের পুনরুদ্ধারের লক্ষ্যগুলির উপর নির্ভর করে, এটি আপনার করা উচিত।
কোনও কিছু ভুল হয়ে যাওয়ার পরে আপনি এটি পুনরুদ্ধার করতে পারবেন না তা নিশ্চিত করে কখনও আপনার ডাটাবেসে কোনও পরিবর্তন করবেন না।
(এবং পয়েন্ট-ইন-টাইম পুনরুদ্ধারের দ্বারা, আমি বলতে চাইছি আপনি সম্পূর্ণ বা ডিফারেনশিয়াল ব্যাকআপ ব্যতীত অন্য কোনও কিছুতে পুনরুদ্ধার করতে সক্ষম হওয়া সম্পর্কে যত্নশীল।)
সম্ভবত আপনার ডাটাবেস 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, বিশ্বাস করুন, আপনি সত্যিই এই বক্ররেখা লক্ষ্য করবেন)।
দয়া করে এখানে থামবেন না; সঙ্কুচিত লগ ফাইলগুলি সম্পর্কে আপনি যে পরামর্শটি দেখতে পান সেখানে বেশিরভাগই সহজাতভাবে খারাপ এবং এমনকি সম্ভাব্য বিপর্যয়কর হলেও, এমন কিছু লোক আছেন যারা ডিস্কের স্থান মুক্ত করার চেয়ে ডেটা অখণ্ডতার বিষয়ে বেশি যত্নশীল।
পল র্যান্ডালের একটি ব্লগ পোস্ট ব্যাখ্যা করছে যে টি-লগ রক্ষণাবেক্ষণ কেন গুরুত্বপূর্ণ এবং কেন আপনার ডেটা ফাইল সঙ্কুচিত করা উচিত নয় ।
-- 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
থেকে: ডিবিসিসি শ্রিনকফিল (লেনদেন-এসকিউএল)
আপনি প্রথমে ব্যাকআপ নিতে চান।
অস্বীকৃতি: দয়া করে নীচে মন্তব্যগুলি সাবধানতার সাথে পড়ুন, এবং আমি ধরে নিয়েছি আপনি ইতিমধ্যে গৃহীত উত্তরটি পড়েছেন। আমি প্রায় 5 বছর আগে বলেছি:
যদি এটি পর্যাপ্ত বা অনুকূল সমাধান না হয় পরিস্থিতিগুলির জন্য যোগ করার জন্য যদি কোনও মন্তব্য থাকে তবে নীচে মন্তব্য করুন
ডাটাবেসের নামে ডান ক্লিক করুন।
কার্যগুলি r সঙ্কুচিত করুন → ডাটাবেস নির্বাচন করুন
তারপরে ক্লিক করুন OK!
আমি সাধারণত উইন্ডোজ এক্সপ্লোরার ডিরেক্টরিটি ডাটাবেস ফাইলগুলি সহ খোলি, তাই আমি তাত্ক্ষণিকভাবে এর প্রভাবটি দেখতে পারি।
আমি আসলে এই কাজ বেশ অবাক হয়েছিল! সাধারণত আমি আগে ডিবিসিসি ব্যবহার করেছি, তবে আমি কেবল এটি চেষ্টা করেছি এবং এটি কিছুই সঙ্কোচিত হয়নি, তাই আমি জিইউআই (2005) চেষ্টা করেছিলাম এবং এটি দুর্দান্ত কাজ করেছিল - 10 সেকেন্ডের মধ্যে 17 জিবি ছাড়িয়ে
সম্পূর্ণ পুনরুদ্ধার মোডে এটি কাজ নাও করতে পারে, তাই আপনাকে প্রথমে প্রথমে লগ ব্যাক আপ করতে হবে, বা সরল পুনরুদ্ধারে পরিবর্তন করতে হবে, তারপরে ফাইলটি সঙ্কুচিত করুন। [এটির জন্য @ ইউনডপ্যাটেকসকেড ধন্যবাদ]
-
পিএস: এর বিপদগুলি সম্পর্কে কেউ কেউ যা মন্তব্য করেছেন আমি তার প্রশংসা করি, তবে আমার পরিবেশে আমার নিজেই এটি করার কোনও সমস্যা হয়নি বিশেষত যেহেতু আমি সর্বদা প্রথমে একটি সম্পূর্ণ ব্যাকআপ করি। সুতরাং দয়া করে আপনার পরিবেশ কী তা বিবেচনা করুন এবং এটি কীভাবে চালিয়ে যাওয়ার আগে আপনার ব্যাকআপ কৌশল এবং কাজের সুরক্ষাকে প্রভাবিত করে। আমি যা করছিলাম তা হ'ল মাইক্রোসফ্ট দ্বারা সরবরাহিত কোনও বৈশিষ্ট্যের প্রতি লোককে ইশারা করা!
নীচে লেনদেন লগ সঙ্কুচিত করার জন্য একটি স্ক্রিপ্ট দেওয়া আছে তবে আমি অবশ্যই লেনদেনের লগটিকে সঙ্কুচিত করার আগে ব্যাক আপ করার পরামর্শ দেব 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
উপরের এক্সিকিউটিভ কমান্ডগুলি যখন দেখায় আপনি এমন একটি ত্রুটি দেখতে পান যা দেখতে পারা যায়
"লগ ফাইল (লগ ফাইলের নাম) সঙ্কুচিত করা যায় না কারণ ফাইলের শেষে অবস্থিত লজিক্যাল লগ ফাইলটি ব্যবহারের জন্য রয়েছে"
এর অর্থ হল যে টিএলওজি ব্যবহারে রয়েছে। এক্ষেত্রে একাধিকবার এটি সম্পাদন করার চেষ্টা করুন বা ডাটাবেসের ক্রিয়াকলাপ হ্রাস করার উপায় সন্ধান করুন।
এখানে একটি সহজ এবং খুব অকার্যকর এবং সম্ভাব্য বিপজ্জনক উপায়।
আমি অনুমান করছি যে আপনি লগ ব্যাকআপ করছেন না। (যা লগ কেটে ফেলবে)। আমার পরামর্শ থেকে পুনরুদ্ধারের মডেল পরিবর্তন হয় পূর্ণ করার সহজ । এটি লগ ফোটা রোধ করবে।
যদি আপনি পুনঃস্থাপনের জন্য লেনদেন লগগুলি ব্যবহার না করেন (যেমন আপনি কেবল সর্বদা সম্পূর্ণ ব্যাকআপ করেন), আপনি পুনরুদ্ধার মোডটিকে "সাধারণ" এ সেট করতে পারেন এবং লেনদেন লগ খুব শীঘ্রই সঙ্কুচিত হয়ে যাবে এবং আর কখনও পূরণ হবে না।
আপনি যদি এসকিউএল 7 বা 2000 ব্যবহার করেন তবে আপনি ডাটাবেস বিকল্প ট্যাবে "চেকপয়েন্টে ট্র্যাঙ্কেট লগ অন ট্রান্সকেট" সক্ষম করতে পারবেন। এটি একই প্রভাব আছে।
এটি উত্পাদন পরিবেশে স্পষ্টতই পুনরুদ্ধার করা হয় না, যেহেতু আপনি সময়ে একটি বিন্দুতে পুনরুদ্ধার করতে সক্ষম হবেন না।
Simple
... এবং আর কখনও পূরণ করবেন না" - সত্য নয়। আমি এটি ঘটতে দেখেছি (গত 48 ঘন্টার মধ্যে) একটি ডাটাবেসে যেখানে রিকভারি মডেলটি "সিম্প্লে" সেট করা হয়েছিল। লগফিলের ফাইলগ্রোথটি "সীমাবদ্ধ" এ সেট করা হয়েছিল এবং আমরা এটিতে কিছু বিশাল ক্রিয়াকলাপ করছিলাম ... আমি বুঝতে পারি যে এটি একটি অস্বাভাবিক পরিস্থিতি ছিল। (আমাদের পরিস্থিতিতে, যেখানে আমাদের প্রচুর ডিস্কের জায়গা ছিল, আমরা লগফিলের আকার বাড়িয়েছিলাম এবং লগ-ফাইলে ফাইলগ্রোথকে "সীমাহীন" করে দিয়েছি ... যা - ইনফেসফেস বাগ - পরিবর্তনের পরে - "সীমাবদ্ধ হিসাবে" দেখায় "সর্বোচ্চ 2,097,152 মেগাবাইটের সাথে।)
জন এই পরামর্শের জন্য সুপারিশ করেন না কারণ লগ ফাইল ছাড়াই ডাটাবেস সংযুক্ত হওয়ার কোনও গ্যারান্টি নেই। সম্পূর্ণ থেকে সহজ থেকে ডাটাবেস পরিবর্তন করুন, একটি চেকপয়েন্ট জোর করে এবং কয়েক মিনিট অপেক্ষা করুন। এসকিউএল সার্ভার লগটি সাফ করবে, যা আপনি তখন ডিবিসিসি শ্রিনফিল ব্যবহার করে সঙ্কুচিত করতে পারবেন।
এখানের বেশিরভাগ উত্তরগুলি ধরে নিচ্ছে যে আপনার আসলে লেনদেন লগ ফাইলের দরকার নেই, তবে যদি আপনার ডাটাবেসটি FULL
পুনরুদ্ধার মডেলটি ব্যবহার করে এবং আপনার ডাটাবেসটি পুনরুদ্ধার করার প্রয়োজনে আপনার ব্যাকআপগুলি রাখতে চান, তবে এটি কাটা বা মুছবেন না এই উত্তরগুলির অনেকের পরামর্শ মতো লগ ফাইল করুন log
লগ ফাইলটি মুছে ফেলা (এটি কেটে ফেলা, এটি মুছে ফেলা, এটি মুছে ফেলা ইত্যাদির মাধ্যমে) আপনার ব্যাকআপ চেইনটি ভেঙে ফেলবে এবং আপনার শেষ, সম্পূর্ণ ডিফারেনশিয়াল, বা লেনদেন লগ ব্যাকআপের পরের পুরো অবধি অবধি কোনও স্থানে পুনরুদ্ধার থেকে বিরত রাখবে বা ডিফারেনশিয়াল ব্যাকআপ তৈরি করা হয়।
আমরা আপনাকে সুপারিশ করি যে আপনি কখনই লেনদেনের লগকে ম্যানুয়ালি কাটাতে 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)
, 1)
অংশটি ব্যতীত আপনার উত্তরের সাথে একমত । সমস্যাটি হ'ল আপনি যদি এটি 1 এমবি-তে সঙ্কুচিত করেন তবে সাধারণ লগ আকারের দিকে এগিয়ে যাওয়ার প্রবৃদ্ধি ইভেন্টগুলি বেশ ব্যয়বহুল হবে এবং বৃদ্ধির হার যদি 10% ডিফল্টে ছেড়ে যায় তবে তাদের মধ্যে অনেকগুলিই থাকবে ।
এসকিউএল সার্ভার লেনদেন লগটি এর অযাচিত বৃদ্ধি রোধ করার জন্য সঠিকভাবে বজায় রাখা দরকার। এর অর্থ লেনদেন লগ ব্যাকআপগুলি প্রায়শই চলমান। এটি না করে আপনি লেনদেনের লগকে পূর্ণ হয়ে ওঠার ঝুঁকিপূর্ণ করেন।
এই প্রশ্নের উত্তর ছাড়াও আমি লেনদেনের লৌকিক প্রচলিত গল্পগুলি পড়ার এবং বোঝার পরামর্শ দিই। এই রিডিংগুলি লেনদেনের লগ বুঝতে এবং এটি "পরিষ্কার" করার জন্য কোন কৌশলগুলি ব্যবহার করতে হবে তা সিদ্ধান্ত নিতে সহায়তা করতে পারে:
থেকে 10 সবচেয়ে গুরুত্বপূর্ণ SQL সার্ভার লেনদেন লগ কাল্পনিক :
মিথ: আমার এসকিউএল সার্ভারটি খুব ব্যস্ত। আমি এসকিউএল সার্ভার লেনদেন লগ ব্যাকআপ করতে চাই না
এসকিউএল সার্ভারের সবচেয়ে বড় পারফরম্যান্স নিবিড় ক্রিয়াকলাপগুলির মধ্যে একটি হ'ল অনলাইন লেনদেন লগ ফাইলের একটি অটো-গ্রোভ ইভেন্ট। লেনদেন লগ ব্যাকআপগুলি প্রায়শই পর্যাপ্ত পরিমাণে না করে অনলাইন লেনদেন লগ পূর্ণ হয়ে যায় এবং বাড়তে হবে। ডিফল্ট বৃদ্ধির আকার 10%। ডাটাবেসটি সবচেয়ে ব্যস্ত, লেনদেন লগ ব্যাকআপগুলি তৈরি না করা হলে অনলাইন লেনদেনের লগটি তত দ্রুত বৃদ্ধি পাবে এসকিউএল সার্ভার লেনদেন লগ ব্যাকআপ তৈরি করা অনলাইনে লেনদেন লগকে অবরুদ্ধ করে না, তবে একটি স্ব-বৃদ্ধি ইভেন্টটি করে। এটি অনলাইন লেনদেন লগের সমস্ত ক্রিয়াকলাপ অবরুদ্ধ করতে পারে
থেকে লেনদেন লগ কাল্পনিক :
মিথ: নিয়মিত লগ সঙ্কোচন একটি ভাল রক্ষণাবেক্ষণ অনুশীলন
মিথ্যা। লগের বৃদ্ধি খুব ব্যয়বহুল কারণ নতুন অংশটি অবশ্যই শূন্যপুষ্ট হতে হবে। শূণ্যকরণ শেষ না হওয়া অবধি সমস্ত লেখার ক্রিয়াকলাপ সেই ডাটাবেসে থেমে যায় এবং যদি আপনার ডিস্ক রাইটিংটি ধীর হয় বা অটোগ্রোথের আকার বড় হয়, তবে এই বিরতি বিশাল হতে পারে এবং ব্যবহারকারীরা লক্ষ্য করবেন। আপনি বৃদ্ধি এড়াতে চান এটির একটি কারণ। যদি আপনি লগটি সঙ্কুচিত করেন তবে এটি আবার বেড়ে উঠবে এবং আপনি কেবল অকারণে সঙ্কুচিত হওয়া এবং পুনরায় গেমের উপর ডিস্ক অপারেশন নষ্ট করছেন
প্রথমে ডাটাবেস পুনরুদ্ধারের মডেলটি পরীক্ষা করুন। ডিফল্টরূপে, এসকিউএল সার্ভার এক্সপ্রেস সংস্করণ সহজ পুনরুদ্ধারের মডেলটির জন্য একটি ডাটাবেস তৈরি করে (যদি আমি ভুল না করি)।
কেবলমাত্র ট্রান্সকেট_এই ব্যাকআপ লগ ডাটাবেসনাম:
DBCC ShrinkFile(yourLogical_LogFileName, 50)
SP_helpfile আপনাকে লজিকাল লগ ফাইলের নাম দেবে।
নির্দেশ করে:
একটি এসকিউএল সার্ভার ডাটাবেসে সম্পূর্ণ লেনদেনের লগ থেকে পুনরুদ্ধার করুন
যদি আপনার ডাটাবেস পূর্ণ পুনরুদ্ধার মডেলটিতে থাকে এবং আপনি যদি টিএল ব্যাকআপ না নিচ্ছেন তবে সিমপ্লেতে এটি পরিবর্তন করুন।
TRUNCATE_ONLY
এসকিউএল সার্ভারের বর্তমান সংস্করণগুলিতে আর বিকল্প নেই এবং এটি সমর্থন করে এমন সংস্করণগুলিতে এটি প্রস্তাবিত নয় ( রাহেলের উত্তর দেখুন )।
DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)
কমান্ডটি ব্যবহার করুন । যদি এটি একটি পরীক্ষামূলক ডাটাবেস হয় এবং আপনি স্থান বাঁচাতে / পুনরায় দাবি করার চেষ্টা করছেন, এটি সাহায্য করবে।
মনে রাখবেন যে টিএক্স লগগুলির ন্যূনতম / অবিচলিত রাষ্ট্র আকারের এক ধরণের থাকে যা তারা বড় হবে। আপনার পুনরুদ্ধারের মডেলটির উপর নির্ভর করে আপনি লগটি সঙ্কুচিত করতে পারবেন না - যদি পুরোপুরি থাকে এবং আপনি টিএক্স লগ ব্যাকআপ জারি না করেন তবে লগটি সঙ্কুচিত করা যায় না - এটি চিরতরে বাড়বে। আপনার যদি টিএক্স লগ ব্যাকআপের প্রয়োজন না হয় তবে আপনার পুনরুদ্ধারের মডেলটিকে সিম্পল করুন ।
এবং মনে রাখবেন, কখনও কোনও পরিস্থিতিতে লগ (এলডিএফ) ফাইলটি মুছবেন না! আপনার কাছে তাত্ক্ষণিক ডেটাবেস দুর্নীতি হবে। সিদ্ধ! সম্পন্ন! হারানো তথ্য! যদি "অপরিশোধিত" না থাকে তবে মূল এমডিএফ ফাইল স্থায়ীভাবে দুর্নীতিগ্রস্থ হতে পারে।
কখনই লেনদেনের লগ মুছবেন না - আপনি ডেটা হারাবেন! আপনার ডেটার অংশটি টিএক্স লগে রয়েছে (পুনরুদ্ধারের মডেল নির্বিশেষে) ... আপনি যদি টিএক্স লগ ফাইলটি আলাদা করে "নামকরণ" করেন যা কার্যকরভাবে আপনার ডাটাবেসের অংশ মুছে ফেলে ।
যাঁরা টিএক্স লগ মুছে ফেলেছেন তাদের জন্য আপনি আরও কিছু ডেটা হারানোর আগে কয়েকটি চেকডবি কমান্ড চালাতে এবং দুর্নীতির সমাধান করতে চাইতে পারেন।
পল রান্ডাল এর ব্লগ পোস্ট খুব ভাল বিষয়, খারাপ পরামর্শ দেখুন ।
এছাড়াও সাধারণত এমডিএফ ফাইলগুলিতে সঙ্কোচন ফাইল ব্যবহার করবেন না কারণ এটি আপনার ডেটা মারাত্মকভাবে খণ্ডিত করতে পারে। আরও তথ্যের জন্য তার খারাপ পরামর্শ বিভাগটি দেখুন ("কেন আপনি আপনার ডেটা ফাইলগুলি সঙ্কুচিত করবেন না")
পলের ওয়েবসাইট দেখুন - তিনি এই খুব প্রশ্ন কভার। গত মাসে তিনি তাঁর মিথ্যাল এ ডে সিরিজটিতে এর অনেকগুলি ইস্যুটি পেরিয়েছিলেন ।
লগ ফাইলটি কাটাতে:
লগ ফাইল সঙ্কুচিত করতে:
ডাটাবেসটি সঙ্কুচিত করুন:
এন্টারপ্রাইজ ম্যানেজার ব্যবহার করে: - ডাটাবেসটিতে ডান ক্লিক করুন, সমস্ত কার্য, সংকুচিত ডাটাবেস, ফাইল, লগ ফাইল নির্বাচন করুন, ঠিক আছে।
টি-এসকিউএল ব্যবহার করে: - ডিবিসিসি সঙ্কোচফিল ([লগ_লজিক্যাল_নাম])
আপনি sp_helpdb চালিয়ে বা এন্টারপ্রাইজ ম্যানেজারের ডাটাবেসের বৈশিষ্ট্যগুলি অনুসন্ধান করে লগ ফাইলটির যৌক্তিক নামটি সন্ধান করতে পারেন।
বেশিরভাগ এসকিউএল সার্ভারে আমার অভিজ্ঞতার জন্য লেনদেন লগের কোনও ব্যাকআপ নেই। সম্পূর্ণ ব্যাকআপ বা ডিফারেনশিয়াল ব্যাকআপগুলি সাধারণ অনুশীলন, তবে লেনদেনের লগ ব্যাকআপগুলি খুব কমই হয়। সুতরাং লেনদেনের লগ ফাইল চিরতরে বৃদ্ধি পায় (ডিস্ক পূর্ণ না হওয়া পর্যন্ত)। এই ক্ষেত্রে পুনরুদ্ধারের মডেলটি " সাধারণ " হিসাবে সেট করা উচিত " । সিস্টেমের ডাটাবেসগুলি "মডেল" এবং "টেম্পিডবি "ও পরিবর্তন করতে ভুলবেন না।
"টেম্পডিবি" ডাটাবেসটির একটি ব্যাকআপ কোনও অর্থবোধ করে না, তাই এই ডিবিটির পুনরুদ্ধার মডেলটি সর্বদা "সরল" হওয়া উচিত।
এটি আমার সাথে ঘটেছিল যেখানে ডেটাবেস লগ ফাইলটি 28 জিবি ছিল।
এটি কমাতে আপনি কী করতে পারেন? আসলে, লগ ফাইলগুলি সেই ফাইল ডেটা যা এসকিউএল সার্ভার যখন কোনও লেনদেনের সময় ঘটে থাকে keeps এসকিউএল সার্ভার প্রক্রিয়া করার জন্য লেনদেনের জন্য একই জন্য পৃষ্ঠা বরাদ্দ করা হয়। তবে লেনদেন সমাপ্ত হওয়ার পরে হঠাৎ এইগুলি ছেড়ে দেওয়া হয় না এই আশায় যে একই রকম কোনও লেনদেন আসতে পারে। এটি স্থান ধরে রাখে।
পদক্ষেপ 1: প্রথমে ডাটাবেস ক্যোয়ারী অন্বেষণ করা চেকপয়েন্টে এই কমান্ডটি চালান
পদক্ষেপ 2: ডাটাবেসটিতে ডান ক্লিক করুন টাস্ক> ব্যাক আপ লেনদেন হিসাবে ব্যাক আপ টাইপ নির্বাচন করুন ব্যাকআপ ডেটা রাখার জন্য একটি গন্তব্য ঠিকানা এবং ফাইলের নাম যুক্ত করুন (.বাক)
এই পদক্ষেপটি পুনরাবৃত্তি করুন এবং এই সময়ে অন্য একটি ফাইলের নাম দিন
পদক্ষেপ 3: এখন ডাটাবেসে যান ডাটাবেসে ডান ক্লিক করুন
টাস্ক> সঙ্কুচিত> ফাইলগুলি ফাইলের প্রকারটি লগ হিসাবে বেছে নিন রিলিজ অব্যবহৃত স্থান হিসাবে ক্রিয়া সঙ্কুচিত করুন
পদক্ষেপ 4:
আপনার লগ ফাইলটি সাধারণত এসকিউএল ২০১৪-তে পরীক্ষা করুন এটি এটিতে পাওয়া যাবে
সি: \ প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট এসকিউএল সার্ভার \ এমএসএসকিউএল 12. এমএসএসকিউএল ২০১৪ এক্সপ্রেস \ এমএসএসকিউএল \ ডেটা
আমার ক্ষেত্রে এটি 28 জিবি থেকে 1 এমবিতে হ্রাস পেয়েছে
এটা চেষ্টা কর:
USE DatabaseName
GO
DBCC SHRINKFILE( TransactionLogName, 1)
BACKUP LOG DatabaseName WITH TRUNCATE_ONLY
DBCC SHRINKFILE( TransactionLogName, 1)
GO
TRUNCATE_ONLY
এসকিউএল সার্ভারের বর্তমান সংস্করণগুলিতে আর বিকল্প নেই এবং এটি সমর্থন করে এমন সংস্করণগুলিতে এটি প্রস্তাবিত নয় ( রাহেলের উত্তর দেখুন )।
ডাটাবেস → রাইটস প্রোপার্টি ক্লিক করুন → ফাইল → আলাদা নামের সাথে অন্য লগ ফাইল যুক্ত করুন এবং ভিন্ন ফাইলের নামের সাথে পুরানো লগ ফাইলের মতোই পথটি সেট করুন।
ডাটাবেস স্বয়ংক্রিয়ভাবে সদ্য নির্মিত লগ ফাইলটি আপ করে তোলে।
এটি কাজ করবে তবে প্রথমে আপনার ডাটাবেসের ব্যাকআপ নেওয়ার পরামর্শ দেওয়া হচ্ছে।
অন্যান্য উত্তরগুলির কিছু আমার পক্ষে কার্যকর হয়নি: ডিবি অনলাইনে থাকাকালীন চৌকিটি তৈরি করা সম্ভব ছিল না, কারণ লেনদেনের লগ পূর্ণ ছিল (কতটা বিড়ম্বনাপূর্ণ)। তবে, জরুরি মোডে ডাটাবেস সেট করার পরে আমি লগ ফাইলটি সঙ্কুচিত করতে সক্ষম হয়েছি:
alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);
DBCC SQLPERF(LOGSPACE)
BACKUP LOG Comapny WITH TRUNCATE_ONLY
DBCC SHRINKFILE (Company_log, 500)
DBCC SQLPERF(LOGSPACE)
TRUNCATE_ONLY
এসকিউএল সার্ভারের বর্তমান সংস্করণগুলিতে আর বিকল্প নেই এবং এটি সমর্থন করে এমন সংস্করণগুলিতে এটি প্রস্তাবিত নয় ( রাহেলের উত্তর দেখুন )।
এমএসএসকিউএল 2017 এর জন্য এবং এসকিউএল সার্ভার পরিচালনার স্টুডিও ব্যবহার করে সামান্য আপডেট হওয়া উত্তর updated আমি বেশিরভাগ এই নির্দেশাবলী থেকে গিয়েছিলাম https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-rrink-operations/ এ
আমার সাম্প্রতিক ডিবি ব্যাকআপ ছিল তাই আমি লেনদেনের লগ ব্যাক আপ করেছিলাম। তারপরে আমি আবার ভাল ব্যয়ের জন্য এটি ব্যাক আপ করেছি। অবশেষে আমি লগ ফাইলটি সঙ্কুচিত করেছিলাম, এবং 20 জি থেকে 7 এমবিতে গিয়েছিলাম, আমার ডেটার আকারের সাথে অনেক বেশি line 2 বছর আগে এটি ইনস্টল হওয়ার পর থেকে লেনদেন লগগুলি কখনও ব্যাক আপ করা হয়েছে বলে আমি মনে করি না ... সুতরাং গৃহকর্মী ক্যালেন্ডারে সেই কাজটি রাখা।
ডিবি লেনদেন লগ ন্যূনতম আকারে সঙ্কুচিত করুন :
আমি বেশ কয়েকটি সংখ্যক ডিবিতে পরীক্ষা করেছি: এই সিকোয়েন্সটি কাজ করে ।
এটি সাধারণত 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
TRUNCATE_ONLY
এসকিউএল সার্ভারের বর্তমান সংস্করণগুলিতে আর বিকল্প নেই এবং এটি সমর্থন করে এমন সংস্করণগুলিতে এটি প্রস্তাবিত নয় ( রাহেলের উত্তর দেখুন )।