আমার আমার ডাটাবেস সঙ্কুচিত করা দরকার - আমি কেবলমাত্র অনেকগুলি জায়গা মুক্ত করেছিলাম


35

এই প্রশ্নটি এখানে বিভিন্ন রূপে জিজ্ঞাসা করা হয় তবে প্রশ্নটি এখানে ফোটে:

আমি জানি একটি ডাটাবেস সঙ্কুচিত করা ঝুঁকিপূর্ণ। এই ক্ষেত্রে, আমি এত বেশি ডেটা সরিয়েছি এবং আমি এটি আর কখনও ব্যবহার করব না।

  • আমি কীভাবে আমার ডাটাবেস সঙ্কুচিত করতে পারি? আমি কোন ফাইলগুলি সঙ্কুচিত করব?
  • এটি করার সময় আমার বিবেচনাগুলি কী হওয়া উচিত?
  • আমার কি পরে কিছু করা উচিত?
  • যদি এটি একটি বৃহত ডাটাবেস হয়? আমি কি আরও ছোট ইনক্রিমেন্টে সঙ্কুচিত করতে পারি?

2
আমি এর সাথে কিছুক্ষণ আগে লড়াই করেছি : dba.stackexchange.com/questions/47310/… আমি আমার উত্তরে আমার অভিজ্ঞতা সংক্ষিপ্ত করার চেষ্টা করেছি
Csaba Toth

উত্তর:


30

কিছু প্রাথমিক ক্যাভেটস:

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

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

এখানে দুটি প্রধান পদ্ধতির দুটি বিবেচনা করা হয়:

১) সঙ্কুচিত হ্যাঁ, আসল সঙ্কুচিত করুন - DBCC SHRINKFILEপরিবর্তে ব্যবহারের কথা বিবেচনা করুন DBCC SHRINKDATABASE, কী সঙ্কুচিত হয় এবং কীভাবে আপনার আরও নিয়ন্ত্রণ have এই হবে নিশ্চিত কিছু কর্মক্ষমতা অবনতি হতে - এটা একটি বৃহৎ আই অনেকটা করছেন অপারেশন। আপনি করতে পারেন সম্ভাব্য লক্ষ্য আকার যে কার্যক্রমে ছোট পায় পুনরাবৃত্তি পর্যন্ত সঙ্কুচিত দিয়ে পার পেতে।

উপরের DBCC SHRINKFILEলিঙ্কটিতে এটি "এ)" উদাহরণ ..এ উদাহরণে একটি ডেটাফাইলটি 7MB টার্গেট আকারে সঙ্কুচিত করা হচ্ছে। আপনার ডাউনটাইম উইন্ডোটি মঞ্জুরি দেয়ায় এই ফর্ম্যাটটি বার বার সঙ্কুচিত হওয়ার একটি ভাল উপায়। পারফরম্যান্স কেমন দেখায় এবং আপনি কতটা নিম্নোক্ত / উচ্চতর হয়ে উঠতে পারেন এবং উত্পাদনের প্রত্যাশিত সময় নির্ধারণ করতে এটি উন্নয়নের পরীক্ষায় আমি এটি করব। এটি একটি অনলাইন অপারেশন - আপনি এটি ব্যবহারকারী সিস্টেমে ডাটাবেস সঙ্কুচিত হওয়ার সাথে ব্যবহার করে চালাতে পারেন, তবে কার্যক্ষমতা হ্রাস হবে, প্রায় নিশ্চিত। সুতরাং নিরীক্ষণ করুন এবং দেখুন এবং দেখুন আপনি সার্ভারের সাথে কী করছেন, ডাউনটাইম উইন্ডো বা হালকা ক্রিয়াকলাপের আদর্শ চয়ন করুন।

USE YourDatabase;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO

সর্বদা মনে রাখবেন: - আপনি যখন সঙ্কুচিত হবেন প্রতিটি সময় আপনার সূচিগুলিকে টুকরো টুকরো করে ফেলেন এবং যদি আপনি দীর্ঘায়িত সময়ের মধ্যে খণ্ডগুলিতে সঙ্কুচিত হয়ে যাচ্ছেন তবে পুনরায় বিল্ডিংয়ের একটি সূচি করা উচিত। আপনি যদি এখন এক উইন্ডোতে এটি সম্পন্ন করতে না পারেন তবে আপনি এখন প্রতিবার সেই ব্যয়টি বহন করছেন।

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

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


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

কেউ কি নোট্রেনকেট এবং সত্যিকার অর্থে ব্যাখ্যা করতে পারে, স্পষ্টতই পরবর্তীকালে পৃষ্ঠাগুলি পুনরায় সাজানো যায় না এবং তাই সূচী বিভাজন ঘটায় না?
ডেভিড গার্সিয়া

4
  1. আমি কীভাবে আমার ডাটাবেস সঙ্কুচিত করতে পারি? আমি কোন ফাইলগুলি সঙ্কুচিত করব? : আপনি যে DBCC SHRINKFILEআদেশটি উল্লেখ করেছেন তাতে আপনি পৃথকভাবে ফাইলগুলি সঙ্কুচিত করতে পারেন । এটি আপনার সার্ভারের উপর নির্ভর করে যে আপনার ডাটাবেসটিতে কতগুলি ফাইল রয়েছে। একটি সাধারণ ডাটাবেসে একটি ডাটাবেস ফাইল এবং একটি লেনদেন লগ ফাইল থাকে।
  2. এটি করার সময় আমার বিবেচনাগুলি কী হওয়া উচিত?: সঙ্কুচিত করা আপনার সূচক খণ্ডকে প্রভাবিত করে, তৃতীয় পয়েন্টটি দেখুন। এছাড়াও নোট করুন যে আপনি ডাটাবেস ফাইলটি এমন আকারে সঙ্কুচিত করতে চান না যা সম্ভবতম ন্যূনতম, কারণ একটি বাস্তব-বিশ্বের পরিবেশে এটি যেভাবেই বাড়বে। সুতরাং আমি আকারটি টিউন করব (উদাহরণস্বরূপ আপনি 7 মেগাবাইট দিয়েছেন) আপনি ডাটাবেস ফাইলের মধ্যে 10% -20% ফ্রি স্পেস রেখে যাবেন, কারণ এটি উত্পাদন পরিবেশে যে কোনও উপায়ে পূরণ করা হবে এবং আপনি কিছু স্বতঃবৃদ্ধি চক্র সেভাবে সংরক্ষণ করুন। সুতরাং প্রকৃত সংখ্যাটি যত্ন সহকারে গণনা করা দরকার। এছাড়াও মনে রাখবেন যে "বিগ স্পেস ফ্রিআপ" আপনি করেছেন তা ডিবি ফাইলের মধ্যে স্থান অর্জনের চেয়ে আরও বেশি পরিমাণে লেনদেনের লগ ফাইলটি সজ্জিত করবে। এছাড়াও, আপনি যে প্রকৃত স্থান লাভ করতে পারেন তা গাণিতিকভাবে প্রত্যাশার চেয়ে কম হবে! সুতরাং আসুন আপনি গণিতগতভাবে 12 টি জিগ মুক্ত করেছেন,
  3. আমার কি পরে কিছু করা উচিত? : যেমনটি আমি আগেই বলেছি, আপনি সেই সূচিগুলি পুনরায় তালিকাবদ্ধ করতে চান যা SHRINK এর পরিবর্তনের ফলে টুকরো টুকরো টুকরো টুকরো টুকরো হয়ে গেছে। আপনার যদি ক্যোয়ারের পরিসংখ্যান সম্পর্কে বিশেষ কিছু করার দরকার হয় তবে আমি যথেষ্ট পরীক্ষা-নিরীক্ষা করি নি।
  4. যদি এটি একটি বৃহত ডাটাবেস হয়? আমি কি এটি ছোট ইনক্রিমেন্টে সঙ্কুচিত করতে পারি? SHRINK অপারেশন যে কোনও সময় বাধাগ্রস্ত হতে পারে এবং আপনি পরে চালিয়ে যেতে পারেন। সম্ভব হলে অফ-লাইন ডাটাবেসে এটি সম্পাদন করার পরামর্শ দেব। বাধা এবং সংক্ষেপে এটি একই সঙ্কুচিত আকারটি এগিয়ে যেতে চাই though তাত্ত্বিকভাবে আপনি 7 মেগাবাইটের পরিবর্তে কম শক্ত টার্গেট আকার নির্দিষ্ট করে ছোট বর্ধনে সঙ্কুচিত হতে পারেন, তবে আমি বলব যে আপনি যদি এটির উত্পাদন চালিয়ে যাচ্ছেন তবে কেবল একবারে যান। আপনি দেখতে পাচ্ছেন যে সূচি বিভাজন এবং সম্ভাব্য লেনদেনের লগ বৃদ্ধিতে সমস্যা রয়েছে। সুতরাং আমি এই এক সময় যেতে হবে।

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

বোনাস: প্রতিলিপি পরিবেশে আপনি যদি প্রকাশক ডাটাবেসে এটি সম্পাদন করেন তবে এটি গ্রাহক ডাটাবেসগুলি সঙ্কুচিত করবে না (যার আকারের সমস্যা হতে পারে কারণ সেগুলি এক্সপ্রেস সংস্করণ)।

অবশেষে, আমার রিইন্ডেক্স স্ক্রিপ্ট:

USE YourDBName

DECLARE @TbName VARCHAR(255)
DECLARE @FullTbName VARCHAR(255)
DECLARE @IxName VARCHAR(255)
DECLARE myCursor CURSOR FOR
    SELECT OBJECT_NAME(dmi.object_id) AS TableName,i.name AS IndexName
    FROM sys.dm_db_index_physical_stats(14, NULL, NULL, NULL , 'LIMITED') dmi
    JOIN  sys.indexes i on dmi.object_id = i.object_id and dmi.index_id = i.index_id
    WHERE avg_fragmentation_in_percent > 30
    ORDER BY avg_fragmentation_in_percent
OPEN myCursor
FETCH NEXT FROM myCursor INTO @TbName, @ixName
WHILE @@FETCH_STATUS = 0
BEGIN
    IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_SCHEMA = 'dba' AND TABLE_NAME = @TbName)
BEGIN
        SET @FullTbName = 'dba.' + @TbName
        IF (@ixName IS NULL)
        BEGIN
            PRINT 'Reindexing Table ' + @FullTbName
            DBCC DBREINDEX(@FullTbName, '', 0)
        END
        ELSE
        BEGIN
             PRINT 'Reindexing Table ' + @FullTbName + ', Index ' + @IxName
             DBCC DBREINDEX(@FullTbName, @IxName, 0)
        END
    END
    FETCH NEXT FROM myCursor INTO @TbName, @ixName
END
CLOSE myCursor
DEALLOCATE myCursor

এর মধ্যে কেবলমাত্র পরিবর্তনশীল 14, যা সিলেক্ট জারি করে প্রাপ্ত করা যেতে পারে DB_ID('YourDBName')এবং স্ক্রিপ্টটি ধরে নিয়েছে যে আপনি কেবল ডিবিএর টেবিলগুলিতেই আগ্রহী * * স্কিমা।


2
সূচী পুনর্নির্মাণের জন্য লক্ষ্য করুন যে এসবিএল 2005-এ ডিবিআরআইএনডিএক্স অবচিত করা হয়েছিল curs
KISS

2

সঙ্কুচিত ডাটাবেস সম্পর্কে আপনি সমস্ত সতর্কতা শুনেছেন এবং সেগুলি সত্য। এটি আপনার সূচিগুলিকে টুকরো টুকরো করবে এবং সাধারণভাবে, আপনার ডাটাবেসকে উপভোগ করবে এবং কোনও প্রোডাকশন সিস্টেমে করা উচিত নয়।

কিন্তু, আমি সাধারণত আমার সাপ্তাহিক ভিত্তিতে এটি করি যখন আমি আমার এসএসডি ড্রাইভে জায়গার কারণে আমার ওয়ার্কস্টেশনে একটি ব্যাকআপ পুনরুদ্ধার করি। মনে মনে, আমি এই স্ক্রিপ্টটি লিখিনি তবে কয়েক বছর আগে এটি খুঁজে পেয়েছি। অন্যান্য ডাটাবেসগুলিতে [250 গিগাবাইট], আমি একটি এসআইএসআই প্যাকেজ তৈরি করেছি যা আমার প্রয়োজনীয় টেবিলগুলি স্থানান্তর করবে এবং তারপরে ওহকে ততোধিক সূচী অনুভূতির জন্য সূচিগুলি পুনরায় তৈরি করবে।

DECLARE @DBFileName SYSNAME

DECLARE @TargetFreeMB INT

DECLARE @ShrinkIncrementMB INT

SET @DBFileName = 'Set Name of Database file to shrink'

-- Set Desired file free space in MB after shrink

SET @TargetFreeMB = 500
-- Set Increment to shrink file by in MB
SET @ShrinkIncrementMB = 100

SELECT [FileSizeMB] = convert(NUMERIC(10, 2),
round(a.size / 128., 2)),

[UsedSpaceMB] = convert(NUMERIC(10, 2),

round(fileproperty(a.NAME, 'SpaceUsed') / 128., 2)),

[UnusedSpaceMB] = convert(NUMERIC(10, 2),

round((a.size - fileproperty(a.NAME, 'SpaceUsed')) / 128., 2)),

[DBFileName] = a.NAME

FROM sysfiles a

DECLARE @sql VARCHAR(8000)
DECLARE @SizeMB INT
DECLARE @UsedMB INT

SELECT @SizeMB = size / 128.
FROM sysfiles
WHERE NAME = @DBFileName

SELECT @UsedMB = fileproperty(@DBFileName, 'SpaceUsed') / 128.

SELECT [StartFileSize] = @SizeMB
    ,[StartUsedSpace] = @UsedMB
    ,[DBFileName] = @DBFileName

WHILE @SizeMB > @UsedMB + @TargetFreeMB + @ShrinkIncrementMB

BEGIN
    SET @sql = 'dbcc shrinkfile ( ' + @DBFileName + ', ' + convert(VARCHAR(20), @SizeMB - @ShrinkIncrementMB) + ' ) '

    PRINT 'Start ' + @sql
    PRINT 'at ' + convert(VARCHAR(30), getdate(), 121)

    EXEC (@sql)

    PRINT 'Done ' + @sql
    PRINT 'at ' + convert(VARCHAR(30), getdate(), 121)

    SELECT @SizeMB = size / 128.
    FROM sysfiles
    WHERE NAME = @DBFileName

    SELECT @UsedMB = fileproperty(@DBFileName, 'SpaceUsed') / 128.

    SELECT [FileSize] = @SizeMB
        ,[UsedSpace] = @UsedMB
        ,[DBFileName] = @DBFileName
END

SELECT [EndFileSize] = @SizeMB
    ,[EndUsedSpace] = @UsedMB
    ,[DBFileName] = @DBFileName

SELECT [FileSizeMB] = convert(NUMERIC(10, 2), round(a.size / 128., 2))

    ,[UsedSpaceMB] = convert(NUMERIC(10, 2), round(fileproperty a.NAME, 'SpaceUsed') / 128., 2))

,[UnusedSpaceMB] = convert(NUMERIC(10, 2), round((a.size - fileproperty(a.NAME, 'SpaceUsed')) / 128., 2))

,[DBFileName] = a.NAME

FROM sysfiles a

1

নীচের এই উদ্ধৃতিটি সরাসরি মাইক্রোসফ্ট থেকে এসেছে (সংস্করণগুলিতে 2008-2016 প্রযোজ্য) এবং আপনাকে / কখন এবং কীভাবে DBCC SHRINKFILEকমান্ডটি ব্যবহার করা উচিত সে সম্পর্কে দিকনির্দেশনা দেয় gives

https://msdn.microsoft.com/en-us/library/ms189493.aspx

সেরা অনুশীলন

আপনি কোনও ফাইল সঙ্কুচিত করার পরিকল্পনা করার সময় নিম্নলিখিত তথ্যগুলি বিবেচনা করুন:

  • একটি সঙ্কোচন অপারেশন একটি অপারেশনের পরে সবচেয়ে কার্যকর হয় যা প্রচুর অব্যবহৃত স্থান তৈরি করে, যেমন একটি কাটা টেবিল বা একটি ড্রপ টেবিল অপারেশন।
  • বেশিরভাগ ডাটাবেসগুলিতে নিয়মিত প্রতিদিন কাজকর্মের জন্য কিছু মুক্ত স্থানের প্রয়োজন। যদি আপনি বারবার একটি ডাটাবেস সঙ্কুচিত করেন এবং লক্ষ্য করেন যে ডাটাবেসের আকার আবার বেড়েছে, এটি নির্দেশ করে যে সঙ্কুচিত হওয়া স্থানটি নিয়মিত ক্রিয়াকলাপের জন্য প্রয়োজন। এই ক্ষেত্রে, বারবার ডাটাবেস সঙ্কুচিত করা একটি নষ্ট অপারেশন।
  • একটি সঙ্কুচিত ক্রিয়াকলাপ ডাটাবেসে সূচকের খণ্ডিত অবস্থা সংরক্ষণ করে না এবং সাধারণত বিভাজনকে একটি ডিগ্রীতে বৃদ্ধি করে। এটি বারবার ডাটাবেস সঙ্কুচিত না করার আরেকটি কারণ।
  • একযোগে পরিবর্তে একই ডাটাবেসে একাধিক ফাইল সঙ্কুচিত করুন। সিস্টেম টেবিলগুলিতে বিতর্ক অবরুদ্ধ হওয়ার কারণে বিলম্ব ঘটাতে পারে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.