MSDB'yi silmek uygun mudur?


9

Ben bir DBA değilim, sadece MSDB ne yaptığını googled Temelde İş ve Tarihinin bir SQL Agent DB'si, Şimdi bulut sunucumdaki alanım tükeniyor ve 1 yıllık MSDB yıl 2017 var , Bunu silmek doğru mu yoksa yedekleme amacıyla mı saklıyorum?

MSDB'm 250GB HDD'de 93GB.

Yanıtlar:


14

msdbVeritabanını dokümanlarda belirtildiği gibi bırakamazsınız (benimkini vurgulayın):

Kısıtlamalar

Aşağıdaki işlemler msdb veritabanında gerçekleştirilemez:

  • Harmanlamayı değiştirme. Varsayılan harmanlama sunucu harmanlamasıdır.

  • Veritabanını bırakma.

  • Konuk kullanıcıyı veritabanından çıkarma.

  • Değişiklik verileri yakalamayı etkinleştirme.

  • Veritabanı aynalamaya katılmak.

  • Birincil dosya grubunu, birincil veri dosyasını veya günlük dosyasını kaldırma.

  • Veritabanını veya birincil dosya grubunu yeniden adlandırma.

  • Veritabanını ÇEVRİMDIŞI olarak ayarlama.

  • Birincil dosya grubunu READ_ONLY olarak ayarlayın.

Sistem veritabanlarını kurcalamak genellikle iyi bir fikir değildir. Alan probleminizin nerede olduğunu kontrol etmeli ve sürücülerinizi genişletmeyi düşünmelisiniz.


Boyut probleminizin nerede olduğunu kontrol etmek için:

  • msdbBu sorguyu kullanarak veritabanı içindeki tablo ve dizin boyutlarını kontrol edin :

    USE msdb
    GO
    
    SELECT 
        t.NAME AS TableName,
        s.Name AS SchemaName,
        p.rows AS RowCounts,
        SUM(a.total_pages) * 8 AS TotalSpaceKB, 
        CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
        SUM(a.used_pages) * 8 AS UsedSpaceKB, 
        CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
        (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
        CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
    FROM 
        sys.tables t
    INNER JOIN      
        sys.indexes i ON t.OBJECT_ID = i.object_id
    INNER JOIN 
        sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
    INNER JOIN 
        sys.allocation_units a ON p.partition_id = a.container_id
    LEFT OUTER JOIN 
        sys.schemas s ON t.schema_id = s.schema_id
    GROUP BY 
        t.Name, s.Name, p.Rows
    ORDER BY 
        TotalSpaceMB DESC

    sysjobhistoryUzayda açılırsa , mevcut iş geçmişi kiralama politikanızı gözden geçirin ve işlerinizin programlarının kontrol altında olduğundan ve ihtiyaç duyduklarından daha sık tetiklenmediğinden emin olun.

  • Bu sorgu ile veritabanı verilerini ve günlük dosyası boyutlarını kontrol edin:

    ;with fs
    as
    (
        select database_id, type, size * 8.0 / 1024 size
        from sys.master_files
    )
    select
        name,
        (select sum(size) from fs where type = 0 and fs.database_id = db.database_id) DataFileSizeInMB,
        (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) LogFileSizeInMB
    from 
        sys.databases db
    where
        db.name = 'msdb'

    Günlük dosyası boyutu yüksekse, hangi işlemin boyutunu artırdığını ve sorun gidermesini sağladığını bulmanız gerekir. Dosyayı küçültmek biraz yer açacaktır, ancak altta yatan sorunu çözmeyecektir.


Benim MSDB bir 250GB HDD 93GB olduğunu, muhtemelen muhtemelen HDD genişletmeyi düşünün ama şimdilik hasta Eski kayıtları temizleme Teşekkürler.
Terrence McGinnis

5

Buradaki diğer yanıtlarda belirtildiği gibi, msdb veritabanının tamamını silmeye çalışmayın.

Msdb veritabanında depolanan belirli geçmiş kayıtlarını bırakmak ve alandan tasarruf etmeniz gerekiyorsa veritabanını küçültmek isteyebilirsiniz. Dikkat edin, ben ediyorum değil veritabanı kesinlikle yakından sürekli olarak msdb tarafından kullanılan alanını yönetmek sürece tekrar büyümek için ihtiyaç duydukları çünkü danışmanlık Bunu.

Bu saklı yordamları kullanarak geçmişi msdb veritabanından kaldırabilirsiniz:

USE msdb;
EXEC dbo.sp_delete_backuphistory @oldest_date = '2018-01-01T00:00:00';
EXEC dbo.sp_purge_jobhistory @job_name = NULL
    , @job_id = NULL
    , @oldest_date = '2018-01-01T00:00:00';

Msdb'yi küçültmek için bunu kullanabilirsiniz:

USE msdb;

DBCC SHRINKFILE (MSDBData, 0);
DBCC SHRINKFILE (MSDBLog, 0);

Yukarıdaki işlemler msdb verilerini ve günlük dosyalarını mümkün olan en küçük boyuta küçültmeye çalışacaktır. Günlük dosyası için, "mümkün olan en küçük boyut" en son ayrılmış sanal günlük dosyasıyla sınırlıdır.

Bilginize, aşağıdaki kodu çalıştırarak bir veritabanında ne kadar alan tüketildiğini görebilirsiniz:

USE <database_name>;

DECLARE @Schema sysname;
DECLARE @Table sysname;
DECLARE @DSName sysname;

--if you're interested in a subset of the objects in a database,
--specify that subset by modifying these variables.  @DSName is
--the name of a filegroup, or possibly a partition.
SET @Schema = NULL;
SET @Table = NULL;
SET @DSName = NULL;

SELECT DataSpace = ds.name
    , ObjectName = QUOTENAME(s.name) + '.' + QUOTENAME(o.name)
    , IndexName = i.name
    , IndexType = i.type_desc
    --, total_pages
    --, used_pages
    --, data_pages
    , TotalMB = CONVERT(INT, total_pages * 8192E0 / 1048576)
    , UsedMB = CONVERT(INT, used_pages * 8192E0 / 1048576)
    , DataMB = CONVERT(INT, data_pages * 8192E0 / 1048576)
    , [rows]
    --, i.*
FROM sys.allocation_units au
    INNER JOIN sys.data_spaces ds ON au.data_space_id = ds.data_space_id
    INNER JOIN sys.partitions p ON (au.container_id = p.hobt_id AND (au.type = 1 OR au.type = 3)) OR (au.container_id = p.partition_id AND au.type = 2)
    INNER JOIN sys.indexes i ON p.index_id = i.index_id AND p.object_id = i.object_id
    INNER JOIN sys.objects o ON p.object_id = o.object_id
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE /*o.is_ms_shipped = 0
    AND total_pages > 128
    AND */(ds.name = @DSName OR @DSName IS NULL)
    AND (s.name = @Schema OR @Schema IS NULL)
    AND (o.name = @Table OR @Table IS NULL)
ORDER BY ds.name, o.name, i.name

1

Microsoft blog belgelerine göre burada MSDB Microsoft SQL sunucusunda önemli bir sistem veritabanı. Msdb veritabanı, sql server işleri, posta, hizmet komisyoncusu, bakım planları, kullanıcı ve sistem veritabanı yedekleme geçmişi vb. Gibi sistem etkinliklerini depolamak için SQL Server Agent tarafından kullanılır.

Belirli vardır DMLVe DDLde gerçekleştirilemez Operasyon MSDBVeritabanı gibi:

  1. Bu veritabanından tablo bırakamayız.
  2. We cannot drop this database.
  3. Bu sistem veritabanını kullanamayız off-line.
  4. mirroringBu veritabanında veritabanı yapamayız .
  5. renameBu veritabanı adını kullanamayız . vb…
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.