সমস্ত ডাটাবেসের জন্য আমি কীভাবে সমস্ত ফাইলগুলি সঙ্কুচিত করব?


47

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

আমি কিছু "ডাটাবেস তৈরি করুন" স্ক্রিপ্টগুলি স্ক্রিপ্ট করেছি এবং ভুলে গিয়েছিলাম যে তারা ডিফল্টর জন্য আকারগুলি বেলুন করেছিল এবং এই প্রকল্পের জন্য এই ফাইলগুলির জন্য যথেষ্ট পরিমাণে স্থানের প্রয়োজন নেই।

উত্তর:


55

আপনি যখন জিইউআই থেকে "টাস্ক -> সঙ্কুচিত" করেন তখন এটি DBCC SHRINKDATABASEপর্দার আড়ালে একটি আদেশ জারি করে। চেষ্টা করে দেখুন ডায়ালগ বাক্সটি উপস্থিত হলে, "ঠিক আছে" বোতামটি ক্লিক করবেন না। পরিবর্তে, "স্ক্রিপ্ট" বোতামটি ক্লিক করুন। আপনি একটি প্রশ্নের উইন্ডোতে কমান্ডটি দেখতে পাবেন। Sys.databases- এ একটি কোয়েরির সাথে এটি সংযুক্ত করুন (মাস্টার এবং এমএসডিবি ছেড়ে দিন) এবং আপনি সমস্ত ডাটাবেস সঙ্কুচিত করার জন্য একটি স্ক্রিপ্ট তৈরি করতে পারেন।

উদাহরণস্বরূপ (jcolebrand এর মন্তব্য থেকে নেওয়া):

SELECT 
      'USE [' + d.name + N']' + CHAR(13) + CHAR(10) 
    + 'DBCC SHRINKFILE (N''' + mf.name + N''' , 0, TRUNCATEONLY)' 
    + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) 
FROM 
         sys.master_files mf 
    JOIN sys.databases d 
        ON mf.database_id = d.database_id 
WHERE d.database_id > 4;

এই ক্যোয়ারির আউটপুট অনুলিপি করুন এবং আপনার সমস্ত ফাইল সঙ্কুচিত করতে এটি চালান।


1
ঠিক আছে, আমি আমি কি চাই (অরুপ কিন্তু আছে আছে মনে শুধু কি আমি এটি প্রয়োজন) SELECT 'USE [' + d.name + N']' + CHAR(13) + CHAR(10) + 'DBCC SHRINKFILE (N''' + mf.name + N''' , 0, TRUNCATEONLY)' + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) FROM sys.master_files mf JOIN sys.databases d ON mf.database_id = d.database_id WHERE d.database_id > 4কিন্তু যে figuring আউট আমাকে একটি নতুন সমস্যা দিলেন। অন্য একটি প্রশ্ন পোস্ট বন্ধ।
jcolebrand

সিরিয়াসলি। @ স্যান্ডির উত্তরটি দেখুন। sp_MSForEachDB (এছাড়াও একটি "টেবিল"
স্প্রোকও রয়েছে

3
এবং যারা এটি পড়ছেন তাদের প্রত্যেককে বাধ্যতামূলক অনুস্মারকটি দেওয়া হচ্ছে: আপনার ডাটাবেস সঙ্কুচিত করা বিপজ্জনক।
নিক চাম্মাস

1
অফলাইন ডিবি ফিল্টার আউট এটি আরও ভাল করে তুলবে। :-)
টিলোবন্ট

1
@ টিলোবন্টের সাথে একমত, পুরো অবস্থা WHERE d.datedia_id> 4 এবং d.state_desc = 'অনলাইন' হিসাবে ভাল;
মাউরো

23

স্কেল স্টেটমেন্টের এক লাইনের কীভাবে?

নিম্নলিখিত sql বিবৃতি কার্যকর করার আগে দয়া করে এই খুব আকর্ষণীয় ব্লগ পোস্ট পড়ুন।

EXEC sp_MSForEachDB 'DBCC SHRINKDATABASE (''?'' , 0)'

6
কোডের একটি একক লাইন প্রয়োজনীয়ভাবে ভাল না হয় যদি এটি সঠিকভাবে কাজ না করে। দয়া করে এই পোস্টগুলি পড়ুন, যেহেতু sp_msforeachdb ডাটাবেসগুলি এড়িয়ে যেতে পারে এবং আপনাকে সতর্ক করতে পারে না: sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/… এবং mssqltips.com/sqlservertip/2201/…
অ্যারন

15

ডিবিসিসি শ্রিনকিডিবি (এবং এর কাজিন শ্রিনকফিল) অত্যন্ত ধীর, কারণ সেই কোডটিতে প্রচুর একক থ্রেডযুক্ত কার্যকর রয়েছে।

একটি ডাটাবেস ফাইল সঙ্কুচিত করার খুব দ্রুত উপায় হ'ল:

  • ডাটাবেসে একটি নতুন ফাইলগ্রুপ বরাদ্দ করুন
  • এই ফাইলগ্রুপটিকে যতটা বড় করা উচিত তত বড় করুন ( sp_spaceusedঠিক কত বড় তা নির্ধারণ করতে ব্যবহার করুন )
  • এই নতুন ফাইলগ্রুপে সমস্ত সূচি পুনর্নির্মাণ করুন
  • পুরানো ফাইলগোষ্ঠীটি ফেলে দিন

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

প্রক্রিয়াটিতে আপনার সূচিগুলিকে ডিফ্রেগমেন্ট করার অতিরিক্ত কৌশলটিও এই কৌশলটির রয়েছে।


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

এবং এগুলি আপনার যত্ন নেওয়া উচিত এমন কোনও জায়গা নেয় না। তারা প্রাইমারি ফাইলগ্রুপেও থাকতে চায়, আপনি তাদের সত্যিই স্থানান্তর করতে পারবেন না (এবং
আপনারও

13

অনুরোধ করা হওয়ায় কেবলমাত্র এলওজি সঙ্কুচিত করার জন্য আমি কিছুটা ক্যোয়ারী টিউন করেছি:

set nocount on  
SELECT 
      'USE [' + d.name + N']' + CHAR(13) + CHAR(10) 
    + 'DBCC SHRINKFILE (N''' + mf.name + N''' , 0, TRUNCATEONLY)' 
    + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) 
FROM 
         sys.master_files mf 
    JOIN sys.databases d 
        ON mf.database_id = d.database_id 
WHERE d.database_id > 4 and mf.type_desc = 'LOG'

"দ্রুত সব ফাইল, উভয় লগ এবং তথ্য সঙ্কুচিত"
dezso

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

2

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

declare @db varchar(255)
declare c cursor for
select name from sys.databases where is_read_only=0 and state=0
  and name not in ('master','model','tempdb','msdb')
open c
fetch c into @db
while @@fetch_status=0
begin
  exec SP_dboption @db,'trunc. log on chkpt.','true' 
  DBCC shrinkdatabase (@db)
  fetch next from c into @db
end
close c
deallocate c

0

মাস্টার, মডেল, এমএসডিবি বাদে সমস্ত লগ ফাইল সঙ্কুচিত করুন:

EXEC sp_MSforeachdb '
DECLARE @sqlcommand nvarchar (500)
IF ''?'' NOT IN (''master'', ''model'', ''msdb'')
BEGIN
USE [?]
SELECT @sqlcommand = ''DBCC SHRINKFILE (N'''''' + 
name
FROM [sys].[database_files]
WHERE type_desc = ''LOG''
SELECT @sqlcommand = @sqlcommand + '''''' , 0)''
EXEC sp_executesql @sqlcommand
END'

0

এটি একের পরে এসকিউএল স্টেটমেন্টগুলির মাধ্যমে পুনরাবৃত্তি করতে একটি কার্সার ব্যবহার করে উপরের উত্তরটি প্রসারিত করে। এটি এমরাহর উত্তরের মতো সংক্ষিপ্ত নয় তবে কার্সারের মধ্যে লুপের মধ্যে অতিরিক্ত যুক্তি যুক্ত করার অনুমতি দেয় ..

SELECT 
    'USE [' 
    + databases.name + N']' 
    + CHAR(13) 
    + CHAR(10) 
    + 'DBCC SHRINKFILE (N''' 
    + masterFiles.name 
    + N''' , 0, TRUNCATEONLY)' 
    + CHAR(13) 
    + CHAR(10) 
    + CHAR(13) 
    + CHAR(10)                                                                  AS sqlCommand
INTO
    #shrinkCommands
FROM 
    [sys].[master_files] masterFiles 
    INNER JOIN [sys].[databases] databases ON masterFiles.database_id = databases.database_id 
WHERE 
    databases.database_id > 4; -- Exclude system DBs


DECLARE iterationCursor CURSOR

FOR
    SELECT 
        sqlCommand 
    FROM 
        #shrinkCommands

OPEN iterationCursor

DECLARE @sqlStatement varchar(max)

FETCH NEXT FROM iterationCursor INTO @sqlStatement

WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXEC(@sqlStatement)
    FETCH NEXT FROM iterationCursor INTO @sqlStatement
END

-- Clean up
CLOSE iterationCursor
DEALLOCATE iterationCursor
DROP TABLE #shrinkCommands

0

আমরা পুনরাবৃত্তি করতে পারি SHRINKDBএবং SHRINKFILEসমস্ত ডাটাবেসের জন্য গতিশীল:

while @DBID<=@MaxDBID
begin
  -- Used Dynamic SQL for all databases.
  Set @SQL ='Use '+@DBName+ ' '+Char(10)
  Set @SQL += 'DBCC SHRINKFILE('+@Filename+',5)' +Char(10)
  Set @SQL += 'DBCC SHRINKDATABASE('+@DBName+')'+Char(10)

  --#6 Increment DBid for looping over all databases
  Set @DBID = @DBID+1
  Select @DBName = DBName, @Filename=DBFileName from #DBNames where [dbid] = @DBID and type_Desc = 'LOG'
  Print (@SQL)
  Exec (@SQL)
end

আপনি এই নিবন্ধে বিশদ জানতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.