วิธีแก้ไขปัญหาพื้นที่เกิดจาก SQL Server

แบ่งปันเลย:

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

ของคุณ SQL Server ต้องการพื้นที่

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

งานล้างข้อมูลไม่ทำงาน

หากคุณใช้แผนการบำรุงรักษาดั้งเดิมของ SQL เพื่อสำรองข้อมูลของคุณ SQL server ฐานข้อมูล อาจมีโอกาสที่โมดูลการล้างข้อมูลในแผนการบำรุงรักษาเหล่านั้นไม่ทำงาน เมื่อพื้นที่ว่างในดิสก์หมด คุณจะรู้ว่าไฟล์สำรองข้อมูลเก่าไม่ได้รับการทำความสะอาดอย่างเหมาะสม คุณจะต้องรวมโมดูลการล้างข้อมูลไว้ในแผนการบำรุงรักษา ทั้งๆที่ทั้งหมดนี้คุณสงสัยว่าทำไมมันไม่ทำงาน?

ตรวจสอบว่าคุณระบุโฟลเดอร์ที่ถูกต้องในการลบไฟล์สำรองหรือไม่ ตรวจสอบว่าคุณระบุนามสกุลไฟล์ที่ถูกต้องเพื่อลบไฟล์สำรองหรือไม่ ลองด้วยจุด “.” และไม่มีจุดในนามสกุลไฟล์

ไฟล์บันทึกมีขนาดใหญ่กว่าไฟล์ฐานข้อมูล

SQL Server ฐานข้อมูลMost สาเหตุทั่วไปของปัญหาพื้นที่บน SQL Server เป็นไฟล์บันทึกที่ไม่ต้องใส่ข้อมูลและไฟล์ tempdb แม้ว่า tempdb จะลดขนาดลงเป็นขนาดดั้งเดิมเมื่อใดก็ตามที่ SQL Service restarts เป็นแนวทางปฏิบัติที่ดีในการตรวจสอบการเติบโตของ tempdb และลดขนาดเมื่อกำลังจะกินพื้นที่ดิสก์ทั้งหมด เช่นเดียวกับ tempdb ไฟล์บันทึกควรอยู่ภายใต้การตรวจสอบเสมอ ตรวจสอบให้แน่ใจว่าคุณมีการสำรองข้อมูลบันทึกเพื่อเก็บไฟล์บันทึกในขนาดที่เล็กที่สุดเสมอ

ไฟล์ฐานข้อมูลที่ไม่ได้ใช้

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

DECLARE @dpth NVARCHAR(512)

EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE'
    ,N'Software\Microsoft\MSSQLServer\MSSQLServer'
    ,N'DefaultData'
    ,@dpth OUTPUT

DECLARE @lpth NVARCHAR(512)

EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE'
    ,N'Software\Microsoft\MSSQLServer\MSSQLServer'
    ,N'DefaultLog'
    ,@lpth OUTPUT

DECLARE @bk NVARCHAR(512)

EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE'
    ,N'Software\Microsoft\MSSQLServer\MSSQLServer'
    ,N'BackupDirectory'
    ,@bk OUTPUT

DECLARE @md NVARCHAR(512)

EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE'
    ,N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters'
    ,N'SqlArg0'
    ,@md OUTPUT

SELECT @md = substring(@md, 3, 255)

SELECT @md = substring(@md, 1, len(@md) - charindex('\', reverse(@md)))

DECLARE @ml NVARCHAR(512)

EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE'
    ,N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters'
    ,N'SqlArg2'
    ,@ml OUTPUT

SELECT @ml = substring(@ml, 3, 255)

SELECT @ml = substring(@ml, 1, len(@ml) - charindex('\', reverse(@ml)))

SET @dpth = isnull(@dpth, @md)
SET @lpth = isnull(@lpth, @ml)

PRINT @dpth
PRINT @lpth

EXEC sp_configure 'show advanced'
    ,1

RECONFIGURE

EXEC sp_configure 'xp_cmdshell'
    ,1

RECONFIGURE

IF object_id('tempdb.dbo.#table1') IS NOT NULL
    DROP TABLE #table1

CREATE TABLE #table1 (
    [filename] VARCHAR(2000)
    ,depth INT
    ,isFile INT
    )

SET @dpth = 'DIR ' + @dpth + '\*.mdf /b /s'
SET @lpth = 'DIR ' + @lpth + '\*.ldf /b /s'

INSERT INTO #table1
EXEC xp_DirTree @dpth
    ,1
    ,1

INSERT INTO #table1
EXEC xp_DirTree @lpth
    ,1
    ,1

DELETE
FROM #table1
WHERE isFile <> 1

UPDATE #table1
SET filename = rtrim(filename)

CREATE TABLE t_list (
    filepath VARCHAR(2000)
    ,sizeinmb DECIMAL(18, 2)
    )

INSERT INTO t_list (filepath)
SELECT otable.filename AS orphaned_files
FROM #table1 otable
LEFT OUTER JOIN master.dbo.sysaltfiles db ON rtrim(db.filename) = otable.filename
WHERE db.dbid IS NULL
ORDER BY 1

DECLARE @sizeingb AS DECIMAL(18, 2)
DECLARE @filepath AS VARCHAR(2000)

DECLARE db_cursor CURSOR
FOR
SELECT filepath
FROM t_list

OPEN db_cursor

FETCH NEXT
FROM db_cursor
INTO @filepath

WHILE @@FETCH_STATUS = 0
BEGIN
    CREATE TABLE t_temp (c1 VARCHAR(2000))

    DECLARE @cmd AS VARCHAR(3000)

    SET @cmd = 'dir ' + @filepath

    PRINT @cmd

    INSERT INTO t_temp
    EXEC master.dbo.xp_cmdshell @cmd

    DELETE
    FROM t_temp
    WHERE c1 NOT LIKE '%1 File(s)%bytes'

    DECLARE @size AS DECIMAL(18, 2)

    SET @size = (
            SELECT TOP 1 replace(replace(replace(c1, '               1 File(s)    ', ''), ',', ''), ' bytes', '')
            FROM t_temp
            WHERE c1 IS NOT NULL
            )
    SET @size = cast((@size / (1024 * 1024)) AS DECIMAL(18, 2))

    DROP TABLE t_temp

    UPDATE t_list
    SET sizeinmb = @size
    WHERE filepath = @filepath

    FETCH NEXT
    FROM db_cursor
    INTO @filepath
END

CLOSE db_cursor

DEALLOCATE db_cursor

SELECT *
FROM t_list

DROP TABLE t_list

EXEC sp_configure 'show advanced'
    ,1

RECONFIGURE

EXEC sp_configure 'xp_cmdshell'
    ,0

RECONFIGURE

SQL Server ฐานข้อมูลเสียหาย

นอกจากการตรวจสอบและรักษาพื้นที่ดิสก์ของคุณแล้ว ยังตรวจสอบสภาพของดิสก์ของคุณด้วย ดิสก์ที่ไม่แข็งแรงอาจทำให้คุณเสียหายได้ SQL Server ฐานข้อมูล หากสิ่งนี้เกิดขึ้น โปรดใช้เครื่องมือกู้คืนฐานข้อมูล เช่น DataNumen SQL Recovery ไปยัง แก้ไขความเสียหาย SQL Server.

บทนำผู้เขียน:

Neil Varley เป็นผู้เชี่ยวชาญด้านการกู้คืนข้อมูลใน DataNumen, Inc. ซึ่งเป็นผู้นำระดับโลกด้านเทคโนโลยีการกู้คืนข้อมูล ได้แก่ ซ่อมแซมความเสียหายของอีเมล Outlook และผลิตภัณฑ์ซอฟต์แวร์กู้คืน excel ดูข้อมูลเพิ่มเติมได้ที่ wwwdatanumenด้วย.

แบ่งปันเลย:

ความเห็นถูกปิด