কম্পিউটার

একই ফাইল গ্রুপে mdf ফাইল থেকে ndf ফাইলে ডেটা স্থানান্তর করুন

সমস্যা: টেস্টডিবি ডাটাবেসের জন্য আইওপিএস সমস্যার কারণে ডেটাবেস ইন্টিগ্রিটি কাজ ব্যর্থ হয়েছে যার আকার 2 টিবি-এর বেশি। বড় ফাইলের আকারের কারণে, ডাটাবেস পরিচালনা করা কঠিন হয়ে উঠছে।

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

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

সমাধান :একাধিক SQL সার্ভার ডেটা ফাইলের মধ্যে ডেটা বিভক্ত করতে নীচের পদক্ষেপগুলি অনুসরণ করুন৷ প্রথমে, আমাদের একটি সেকেন্ডারি ডেটা ফাইল যুক্ত করতে হবে যেখানে আমরা ডেটা সন্নিবেশ করব৷ এটি 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 জিবি ফাইলের বৃদ্ধি সেট করেছি এবং ডেটাফাইলটি প্রাথমিক ফাইল গ্রুপে যোগ করা হবে।

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

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 এই আকারে পৌঁছালে, আমরা খালি ফাইল অপারেশন বন্ধ করতে পারি৷ একবার খালি ফাইল অপারেশন বন্ধ হয়ে গেলে, নীচের ক্যোয়ারী ব্যবহার করে আমাদের ম্যানুয়ালি mdf-এ মুক্ত স্থান পুনরুদ্ধার করতে হবে :

DBCC Shrinkfile('TestDB', 1500000) --  

আমাদের ছোট অংশে আকার পরিবর্তন করতে হবে

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

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

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

select file_id, name,physical_name from sys.database_files

এখানে, এই উদাহরণে, ফাইলের নাম হল “mo” এবং file_id হল 1। আপনি যখন mo ফাইলটি খালি করার চেষ্টা করবেন যার file_id 1 আছে, আপনি এই ত্রুটির বার্তার সম্মুখীন হবেন।

এর কারণ হল মূল ফাইলের মধ্যে সিস্টেম তথ্য রয়েছে, যা খালি করা যাবে না। কিন্তু, আপনি যদি অন্য ডেটা ফাইল “mo2data”-তে একই কমান্ড চেষ্টা করেন, তাহলে খালি ফাইল কমান্ড সফল হবে।

উপসংহার

একবার এই ডেটা মুভমেন্ট অ্যাক্টিভিটি সম্পূর্ণ হলে, অনুগ্রহ করে ডাটাবেস রক্ষণাবেক্ষণের কাজগুলি চালান:- ইন্ডেক্স অপ্টিমাইজ জব- ইন্টিগ্রিটি চেক জব- সম্পূর্ণ ডাটাবেস ব্যাকআপ কাজ৷

কোনো মন্তব্য করতে বা প্রশ্ন জিজ্ঞাসা করতে প্রতিক্রিয়া ট্যাব ব্যবহার করুন। আপনি আমাদের সাথে একটি কথোপকথনও শুরু করতে পারেন৷


No
  1. এমএস অ্যাক্সেস থেকে SQL সার্ভার ডেটাবেসে ডেটা স্থানান্তর করুন

  2. কিভাবে টেক্সট ফাইল থেকে এক্সেলে ডেটা আমদানি করবেন (3টি পদ্ধতি)

  3. কিভাবে এক্সএমএল ফাইল থেকে এক্সেলে ডেটা এক্সট্র্যাক্ট করবেন (2টি সহজ উপায়)

  4. ডাটা না হারিয়ে কিভাবে HDD থেকে SSD তে OS মাইগ্রেট করবেন