Apakah saya boleh menghapus MSDB?


9

Saya bukan DBA, saya hanya meneliti Google apa yang dilakukan MSDB itu pada dasarnya adalah DB SQL Agent untuk Pekerjaan dan Sejarahnya, Sekarang saya kehabisan ruang di server cloud saya dan saya memiliki MSDB senilai 1 tahun di tahun 2017 , Apakah saya tetap bisa menghapus ini atau saya menyimpannya untuk cadangan?

MSDB saya 93GB dalam HDD 250GB.

Jawaban:


14

Anda tidak dapat menjatuhkan msdbbasis data seperti yang dinyatakan dalam dokumen (penekanan saya):

Batasan

Operasi berikut tidak dapat dilakukan pada database msdb:

  • Mengubah susunan. Susunan standar adalah susunan server.

  • Menjatuhkan basis data.

  • Menjatuhkan pengguna tamu dari basis data.

  • Mengaktifkan perubahan pengambilan data.

  • Berpartisipasi dalam mirroring basis data.

  • Menghapus filegroup primer, file data primer, atau file log.

  • Mengganti nama database atau filegroup utama.

  • Mengatur basis data ke OFFLINE.

  • Mengatur filegroup utama menjadi READ_ONLY.

Merusak dengan database sistem biasanya bukan ide yang baik. Anda harus memeriksa di mana masalah ruang Anda dan mempertimbangkan memperluas drive Anda.


Untuk memeriksa di mana masalah ukuran Anda:

  • Periksa tabel dan ukuran indeks di dalam msdbdatabase menggunakan kueri ini:

    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

    Jika sysjobhistorymuncul di luar angkasa maka tinjau kebijakan sewa pekerjaan riwayat Anda saat ini dan pastikan bahwa jadwal pekerjaan Anda sudah di periksa dan tidak memicu lebih sering daripada yang mereka butuhkan.

  • Periksa data database dan ukuran file log dengan kueri ini:

    ;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'

    Jika ukuran file log tinggi, Anda perlu mencari tahu operasi mana yang membuatnya meningkatkan ukurannya dan memecahkannya. Mengecilkan file akan mengosongkan ruang tetapi tidak akan menyelesaikan masalah yang mendasarinya.


MSDB saya 93GB dalam 250GB HDD, mungkin saya akan mempertimbangkan untuk memperluas HDD saya, tetapi untuk sekarang sakit Bersihkan catatan lama Terima kasih.
Terrence McGinnis

5

Seperti yang tercakup dalam jawaban lain di sini, jangan mencoba menghapus seluruh database msdb.

Anda mungkin ingin menghapus catatan riwayat tertentu yang disimpan dalam database msdb, dan kemudian mengecilkan database jika Anda perlu menghemat ruang. Sadarilah, saya tidak menyarankan Anda melakukan ini karena database pasti akan perlu tumbuh lagi kecuali Anda mengelola ruang yang digunakan oleh msdb secara berkelanjutan.

Anda dapat menghapus histori dari database msdb menggunakan prosedur tersimpan ini:

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';

Untuk mengecilkan msdb, Anda dapat menggunakan ini:

USE msdb;

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

Operasi di atas akan berusaha untuk mengecilkan data msdb dan mencatat file ke ukuran sekecil mungkin. Untuk file log, "ukuran terkecil mungkin" dibatasi oleh file log virtual yang terakhir dialokasikan.

FYI, Anda dapat melihat berapa banyak ruang yang dikonsumsi dalam database dengan menjalankan kode berikut:

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

Per dokumentasi blog microsoft di sini MSDB adalah basis data sistem yang penting dalam Microsoft SQL server. Basis data msdb digunakan terutama oleh Agen SQL Server untuk menyimpan aktivitas sistem seperti pekerjaan server sql, surat, broker layanan, rencana pemeliharaan, riwayat cadangan database sistem dan pengguna, dll. Ini juga digunakan oleh mesin basis data dan studio manajemen.

Ada DMLDan DDLOperasi tertentu yang tidak dapat dilakukan dalam MSDBDatabase seperti:

  1. Kami tidak dapat menjatuhkan tabel dari database ini.
  2. We cannot drop this database.
  3. Kami tidak dapat membuat basis data sistem ini untuk digunakan off-line.
  4. Kami tidak dapat melakukan database mirroringpada database ini.
  5. Kami tidak dapat renamenama database ini. dll ...
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.