it-swarm.asia

كيف أقوم بتقليص جميع الملفات بسرعة لجميع قواعد البيانات؟

في SQL Server (2008 في هذه الحالة) كيف يمكنني تقليص جميع الملفات بسرعة ، كل من السجل والبيانات ، لجميع قواعد البيانات على مثيل؟ يمكنني تصفح SSMS والنقر بزر الماوس الأيمن على كل منها واختيار المهام -> تقليص ، لكني أبحث عن شيء أسرع.

لقد قمت بكتابة بعض سكريبتات "إنشاء قاعدة بيانات" ونسيت أنها تحتوي على أحجام ضخمة للإعدادات الافتراضية ، ولا أحتاج إلى مساحة كبيرة مخصصة لهذه الملفات في هذا المشروع.

47
jcolebrand

عندما تقوم بـ "المهام -> تقليص" من واجهة المستخدم الرسومية ، فإنها تُصدر بالفعل DBCC SHRINKDATABASE الأمر خلف الكواليس. جربها. عند ظهور مربع الحوار ، لا تنقر فوق الزر "موافق". بدلاً من ذلك ، انقر فوق الزر "Script". سترى الأمر في نافذة استعلام. قم بدمج ذلك مع استعلام على sys.databases (استبعد Master و msdb) ، ويمكنك إنشاء برنامج نصي لتقليص جميع قواعد البيانات.

على سبيل المثال (مأخوذ من تعليق 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;

انسخ مخرجات هذا الاستعلام وشغّله لتقليص جميع ملفاتك.

59
Larry Coleman

ماذا عن سطر واحد من بيان SQL؟

يرجى قراءة هذه مشاركة مدونة شيقة جدًا قبل تنفيذ عبارة SQL التالية.

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

إن برنامج DBCC SHRINKDB (وابن عمه SHRINKFILE) بطيء للغاية ، لأن هناك الكثير من عمليات التنفيذ المترابطة في هذا الرمز.

طريقة أسرع بكثير لتقليص ملف قاعدة البيانات هي:

  • تخصيص مجموعة ملفات جديدة لقاعدة البيانات
  • اجعل مجموعة الملفات كبيرة كما يجب أن تكون (استخدم sp_spaceused لتحديد الحجم)
  • إعادة إنشاء كافة الفهارس إلى مجموعة الملفات الجديدة هذه
  • إسقاط مجموعة الملفات القديمة

نظرًا لأن عمليات إعادة بناء الفهرس متوازية بشكل كبير ، غالبًا ما تؤدي هذه التقنية إلى تقليص قاعدة البيانات بشكل أسرع. بالطبع ، يتطلب منك الحصول على القليل من المساحة الإضافية لمجموعة الملفات الجديدة أثناء سير العملية. ومع ذلك ، تحتاج فقط إلى مساحة كافية في مجموعة الملفات الجديدة لاستيعاب أكبر مجموعة ملفات في المثال (حيث ستسترد مساحة أثناء تقدمك).

هذه التقنية لها أيضًا فائدة إضافية تتمثل في إلغاء تجزئة الفهارس الخاصة بك في هذه العملية.

15
Thomas Kejser

قمت بضبط الاستعلام قليلاً لتقليص LOG فقط كما هو مطلوب:

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'
13
Frankachela

الكود أدناه ، احصل على قائمة بقواعد البيانات غير النظام ، قم بتعيين قاعدة البيانات للقراءة فقط ثم تقليص الملف. لقد احتفظت بهذا الرمز في عدد قليل من مربعات SQL Server باستخدام مهمة عامل SQL ، حيث تكون المساحة دائمًا مشكلة. في ليلة السبت/الأحد كل أسبوع ، يبدأ تشغيله وتقليص جميع قواعد البيانات في غضون ساعات قليلة (اعتمادًا على حجم قواعد البيانات).

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
2
Muhammad Sharjeel Ahsan

هذا واحد يوسع الإجابة أعلاه ، باستخدام مؤشر لتكرار من خلال عبارات SQL واحدا تلو الآخر. إنها ليست قصيرة مثل إجابة عمرة ولكنها تسمح بمنطق إضافي ضمن حلقة الوقت داخل المؤشر ..

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
Alistair

تقليص جميع ملفات السجل باستثناء الرئيسية ، والطراز ، msdb:

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
Emrah Saglam

يمكننا تكرار SHRINKDB و SHRINKFILE لجميع قواعد البيانات ديناميكيًا:

while @DBID<[email protected]
begin
  -- Used Dynamic SQL for all databases.
  Set @SQL ='Use '[email protected]+ ' '+Char(10)
  Set @SQL += 'DBCC SHRINKFILE('[email protected]+',5)' +Char(10)
  Set @SQL += 'DBCC SHRINKDATABASE('[email protected]+')'+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

يمكنك العثور على التفاصيل في هذه المقالة .

0
Anup Kulkarni