การลบ MSDB เป็นเรื่องปกติไหม


9

ฉันไม่ได้เป็น DBA ฉันได้ทำสิ่งที่ MSDB ทำเท่านั้นโดยเป็นฐานข้อมูลตัวแทน SQL ของงานและประวัติตอนนี้ฉันหมดพื้นที่ในคลาวด์เซิร์ฟเวอร์ของฉันและฉันมี MSDB ปี 1 ปี 2560 ฉันไม่สามารถลบมันได้หรือฉันจะเก็บไว้เพื่อการสำรอง?

MSDB ของฉันคือ 93GB ใน HDD 250GB

คำตอบ:


14

คุณไม่สามารถวางmsdbฐานข้อมูลตามที่ระบุในเอกสาร (เน้นที่เหมือง):

ข้อ จำกัด

ไม่สามารถทำการดำเนินการต่อไปนี้บนฐานข้อมูล msdb:

  • การเปลี่ยนการเรียงหน้า การเปรียบเทียบค่าเริ่มต้นคือการเปรียบเทียบเซิร์ฟเวอร์

  • วางฐานข้อมูล

  • ปล่อยผู้ใช้เกสต์จากฐานข้อมูล

  • เปิดใช้งานการดักจับข้อมูลการเปลี่ยนแปลง

  • การมีส่วนร่วมในการทำมิเรอร์ฐานข้อมูล

  • การลบกลุ่มไฟล์หลักไฟล์ข้อมูลหลักหรือไฟล์บันทึก

  • การเปลี่ยนชื่อฐานข้อมูลหรือกลุ่มไฟล์หลัก

  • การตั้งค่าฐานข้อมูลเป็นออฟไลน์

  • การตั้งค่ากลุ่มไฟล์หลักเป็น READ_ONLY

การเจาะฐานข้อมูลระบบไม่ใช่ความคิดที่ดี คุณควรตรวจสอบว่าปัญหาเรื่องพื้นที่ว่างของคุณอยู่ที่ใดและพิจารณาขยายไดรฟ์ของคุณ


ในการตรวจสอบว่าปัญหาขนาดของคุณอยู่ที่ใด:

  • ตรวจสอบขนาดตารางและดัชนีภายในmsdbฐานข้อมูลโดยใช้แบบสอบถามนี้:

    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

    หากsysjobhistoryปรากฏขึ้นในพื้นที่ให้ตรวจสอบนโยบายการเช่าประวัติงานปัจจุบันของคุณและตรวจสอบให้แน่ใจว่าตารางงานของคุณอยู่ในการตรวจสอบและไม่เรียกบ่อยกว่าที่พวกเขาต้องการ

  • ตรวจสอบข้อมูลฐานข้อมูลและขนาดไฟล์บันทึกด้วยแบบสอบถามนี้:

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

    หากขนาดไฟล์บันทึกสูงคุณต้องหาว่าการดำเนินการใดทำให้เพิ่มขนาดของไฟล์และแก้ไขปัญหา การย่อขนาดไฟล์จะเพิ่มพื้นที่ว่าง แต่จะไม่แก้ปัญหาพื้นฐาน


MSDB ของฉันคือ 93GB ใน 250GB HDD ไม่ดีอาจพิจารณาขยาย HDD ของฉัน แต่ตอนนี้ป่วยกำจัดระเบียนเก่าขอบคุณ
Terrence McGinnis

5

ดังที่กล่าวไว้ในคำตอบอื่น ๆ ที่นี่อย่าพยายามลบฐานข้อมูล msdb ทั้งหมด

คุณอาจต้องการที่จะลดลงบันทึกประวัติศาสตร์บางอย่างที่เก็บไว้ในฐานข้อมูล msdb แล้วลดขนาดฐานข้อมูลถ้าคุณต้องการที่จะประหยัดพื้นที่ โปรดระวังฉันไม่แนะนำให้คุณทำเช่นนี้เพราะฐานข้อมูลจะต้องเติบโตอีกครั้งอย่างแน่นอนเว้นแต่คุณจะจัดการพื้นที่ที่ msdb ใช้อย่างต่อเนื่อง

คุณสามารถลบประวัติออกจากฐานข้อมูล msdb โดยใช้กระบวนงานที่เก็บไว้เหล่านี้:

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 คุณสามารถใช้สิ่งนี้:

USE msdb;

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

การดำเนินการด้านบนจะพยายามย่อขนาดข้อมูล msdb และล็อกไฟล์ให้มีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ สำหรับล็อกไฟล์ "ขนาดที่เล็กที่สุดที่เป็นไปได้" ถูก จำกัด โดยไฟล์บันทึกเสมือนที่จัดสรรล่าสุด

FYI คุณสามารถดูปริมาณการใช้พื้นที่ในฐานข้อมูลได้โดยการเรียกใช้รหัสต่อไปนี้:

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 ที่นี่ MSDBเป็นฐานข้อมูลระบบที่สำคัญในเซิร์ฟเวอร์ Microsoft SQL ฐานข้อมูล msdb ส่วนใหญ่จะถูกใช้โดย SQL Server Agent เพื่อเก็บกิจกรรมของระบบเช่นงานเซิร์ฟเวอร์ sql, เมล, นายหน้าบริการ, แผนการบำรุงรักษา, ประวัติการสำรองฐานข้อมูลผู้ใช้และระบบเป็นต้นนอกจากนี้ยังใช้โดยเอ็นจิ้นฐานข้อมูลและสตูดิโอการจัดการ

มีบางอย่างDMLและDDLการดำเนินงานที่ไม่สามารถดำเนินการในMSDBฐานข้อมูลเช่น:

  1. เราไม่สามารถวางตารางจากฐานข้อมูลนี้
  2. We cannot drop this database.
  3. เราไม่สามารถทำให้ฐานข้อมูลระบบนี้ทำงานoff-lineได้
  4. เราไม่สามารถทำฐานข้อมูลmirroringในฐานข้อมูลนี้
  5. เราไม่สามารถrenameชื่อฐานข้อมูลนี้ ฯลฯ ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.