কম্পিউটার টিউটোরিয়াল

বড় SQL Server ডাটাবেস দক্ষতার সাথে বিভাজন: MDF থেকে NDF মাইগ্রেশন একই ফাইল গ্রুপের মধ্যে

সমস্যা: TestDB ডাটাবেসের জন্য ডাটাবেস ইন্টিগ্রিটি জব IOPS ইস্যু miatt ফেল হচ্ছে যেটি ২ TB-র বেশি আকারে। বড় ফাইল আকারের কারণে, ডাটাবেস ম্যানেজ করা কঠিন হচ্ছে।

অ্যাপ্রোচ: এটি ট্রাবলশুট করার জন্য, আমরা ডেটাকে ২টি ডেটা ফাইলে বিভক্ত করার সিদ্ধান্ত নিয়েছি। তাই ড্রাইভ স্পেস এবং ডেটা ফাইলের বর্তমান অবস্থা নিচের মতো:

আমাদের ডেটা ফাইল N:\ ড্রাইভে হোস্ট করা আছে এবং আমরা একই লোকেশনে অন্য একটি ফাইল তৈরি করব। আমাদের পদ্ধতি হলো emptyfile কমান্ড ব্যবহার করে ডেটা ট্রান্সফার শুরু করা এবং ম্যানুয়ালি কোয়েরিটি মাঝপথে বন্ধ করা ডেটা মুভমেন্ট জবের জন্য বাধ্য করার জন্য। দ্রষ্টব্য: ম্যানুয়ালি কোয়েরিটি মাঝপথে বন্ধ করলে ডাটাবেসের (ইন্টিগ্রিটি/কনসিস্টেন্সি) ওপর কোনো প্রভাব পড়বে না। তারপর আমরা mdf ফাইলটি শ্রিংক করব ফ্রি স্পেস রিক্লেইম করার জন্য।

সমাধান: SQL Server ডেটা ফাইলগুলোর মধ্যে ডেটা বিভক্ত করার জন্য নিচের ধাপগুলো অনুসরণ করুন। প্রথমে, আমাদের একটি সেকেন্ডারি ডেটা ফাইল যোগ করতে হবে যেখানে আমরা আমাদের ডেটা ইনসার্ট করব। এটি ndf (নেক্সট ডেটা ফাইল) হিসেবে যোগ করা হবে। TestDB ডাটাবেসে অতিরিক্ত ডেটা ফাইল যোগ করার জন্য নিচের স্ক্রিপ্ট চালান

 USE [master] GO ALTER DATABASE [TestDB] ADD FILE ( NAME = N'TestDB_1', FILENAME = N'N:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDB_1.ndf' , SIZE = 209715200KB , FILEGROWTH = 5242880KB ) TO FILEGROUP [PRIMARY]GO 

এই স্ক্রিপ্ট এক্সিকিউট করলে, এটি N:\ ড্রাইভে TestDB_1 নামে একটি নতুন ডেটা ফাইল যোগ করবে এবং আকার হবে 200 GB (আমরা আমাদের ডাটাবেসের প্রেক্ষাপটে এটি নিয়েছি)। আমরা 5 GB ফাইল গ্রোথ সেট করেছি এবং ডেটাফাইলটি প্রাইমারি ফাইল গ্রুপে যোগ করা হবে।

এখন, ডেটা ফাইল যোগ করার পর TestDB ডাটাবেসে DBCC emptyfile অপারেশন শুরু করুন। সিনট্যাক্স হবে:

use YOURDATABASE go dbcc shrinkfile(‘mdfFileName’,emptyfile)

আমাদের কেসে এটি হবে:

USE [TestDB] go DBCC shrinkfile ('TestDB',emptyfile)

এখানে TestDB হলো ফাইলটির লজিক্যাল নাম যেখান থেকে আমরা ডেটা সরাতে চাই অর্থাৎ আমাদের mdf ফাইল। এখন একবার এই অপারেশন শুরু করলে, আমাদের ট্র্যাক রাখতে হবে, mdf থেকে ndf-এ কত ডেটা সরানো হয়েছে। নিচের কোয়েরিটি ব্যবহার করে এটি ট্র্যাক রাখা যাবে:

USE [TestDB] GO SELECT [TYPE] = A.TYPE_DESC ,[FILE_Name] = A.name ,[FILEGROUP_NAME] = fg.name ,[File_Location] = A.PHYSICAL_NAME ,[FILESIZE_MB] = CONVERT(DECIMAL(10,2),A.SIZE/128.0) ,[USEDSPACE_MB] = CONVERT(DECIMAL(10,2),A.SIZE/128.0 - ((SIZE/128.0) - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0)) ,[USEDSPACE_%] = CAST((CAST(FILEPROPERTY(A.name, 'SpaceUsed')/128.0 AS DECIMAL(10,2))/CAST(A.size/128.0 AS DECIMAL(10,2)))*100 AS DECIMAL(10,2)) ,[FREESPACE_MB] = CONVERT(DECIMAL(10,2),A.SIZE/128.0 - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0) ,[FREESPACE_%] = CONVERT(DECIMAL(10,2),((A.SIZE/128.0 - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0)/(A.SIZE/128.0))*100) ,[AutoGrow] = 'By ' + CASE is_percent_growth WHEN 0 THEN CAST(growth/128 AS VARCHAR(10)) + ' MB -' WHEN 1 THEN CAST(growth AS VARCHAR(10)) + '% -' ELSE '' END + CASE max_size WHEN 0 THEN 'DISABLED' WHEN -1 THEN ' Unrestricted' ELSE ' Restricted to ' + CAST(max_size/(128*1024) AS VARCHAR(10)) + ' GB' END + CASE is_percent_growth WHEN 1 THEN ' [autogrowth by percent, BAD setting!]' ELSE '' END FROM sys.database_files A LEFT JOIN sys.filegroups fg ON A.data_space_id = fg.data_space_id order by A.TYPE desc, A.NAME;

আমাদের পদ্ধতির জন্য, আমরা ndf-কে প্রায় 500 GB-এ চাই, তাই একবার ndf এই আকারে পৌঁছালে, আমরা emptyfile অপারেশন বন্ধ করতে পারি। একবার emptyfile অপারেশন বন্ধ হলে, আমাদের mdf-এ ফ্রি স্পেস ম্যানুয়ালি রিক্লেইম করতে হবে নিচের কোয়েরিটি ব্যবহার করে:

DBCC Shrinkfile('TestDB', 1500000) -- 

আমাদের ছোট ছোট চাঙ্কে আকার পরিবর্তন করতে হবে

এখন আমাদের mdf ছিল 2 TB, আমরা 500 GB ndf-এ সরিয়েছি, তাই 500 GB mdf থেকে রিক্লেইমযোগ্য, যা আমরা উপরের কোয়েরিটি ব্যবহার করে রিক্লেইম করেছি।

এই ধাপটি আমরা একাধিকবার রিপিট করতে পারি ডেটাফাইলগুলোর মধ্যে ডেটা সরানোর জন্য, ম্যানুয়ালি অপারেশন মাঝপথে বন্ধ করে আমাদের স্টোরেজ অনুযায়ী এবং তারপর আবার স্পেস রিক্লেইম করে।

mdf-এ emptyfile ব্যবহার করার সময় একটা কথা নোট করুন যে আপনি প্রাইমারি ডেটা ফাইল যার ফাইল আইডি ১, তার কন্টেন্ট পুরোপুরি খালি করতে পারবেন না। ফাইল আইডি নম্বর পেতে, এই স্ক্রিপ্ট চালান।

select file_id, name,physical_name from sys.database_files

এখানে, এই উদাহরণে, ফাইলনেম হলো "mo" এবং file_id ১। আপনি যেন ফাইল mo খালি করার চেষ্টা করবেন যার file_id ১, আপনি এই এরর মেসেজ পাবেন।

এটি হলো কারণ অরিজিনাল ফাইলে সিস্টেম ইনফরমেশন রয়েছে, যা খালি করা যাবে না। কিন্তু, আপনি যদি একই কমান্ডটি অন্য ডেটা ফাইল "mo2data"-এ ট্রাই করেন, empty file কমান্ড সাকসেসফুল হবে।

উপসংহার

এই ডেটা মুভমেন্ট এক্টিভিটি কমপ্লিট হলে, দয়া করে ডাটাবেস মেইনটেনেন্স জবগুলো চালান: – ইনডেক্স অপ্টিমাইজ জব – ইন্টিগ্রিটি চেক জব – ফুল ডাটাবেস ব্যাকআপ জব।

ফিডব্যাক ট্যাব ব্যবহার করে যেকোনো মন্তব্য বা প্রশ্ন করুন। আপনি আমাদের সাথে কথা বলতে পারেন।

ত্রিভুজ No
  1. সহজ মাইগ্রেশন: MS Access ডেটা SQL Server 2014-এ স্থানান্তর করুন

  2. টেক্সট ফাইল ডেটা এক্সেলে ইম্পোর্ট: ৩টি প্রমাণিত পদ্ধতি সঠিক ফলাফলের জন্য

  3. দ্রুত গাইড: XML থেকে এক্সেলে ডেটা আনার ২টি সহজ ধাপ

  4. HDD থেকে SSD-এ OS মাইগ্রেশন: সব ডেটা রক্ষা করে পারফরম্যান্স বাড়ান