การกู้คืนการสำรองข้อมูลส่วนต่างจะสร้างไฟล์บันทึก DEFUNCT หรือไม่


11

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

ข่าวสารเกี่ยวกับ 3127, ระดับ 16, สถานะ 1, บรรทัด 1 ไฟล์ 'Database_Log2' ของฐานข้อมูลที่ถูกกู้คืน 'DatabaseName' กำลังถูกปล่อยให้อยู่ในสถานะหมดอายุเนื่องจากฐานข้อมูลใช้รูปแบบการกู้คืนอย่างง่ายและไฟล์ถูกทำเครื่องหมายสำหรับการเข้าถึงเพื่ออ่าน - เขียน ดังนั้นสามารถกู้คืนไฟล์แบบอ่านอย่างเดียวเท่านั้นโดยการกู้คืนทีละน้อย

ฐานข้อมูลกู้คืนและพิจารณาออนไลน์ แต่การดำเนินการสำรองข้อมูลล้มเหลวเนื่องจากไฟล์ DEFUNCT นี้มีข้อผิดพลาดดังต่อไปนี้:

ข่าวสารเกี่ยวกับ 3636, ระดับ 16, สถานะ 2, บรรทัด 1 เกิดข้อผิดพลาดขณะประมวลผลข้อมูลเมตา 'BackupMetadata' สำหรับฐานข้อมูล id 10 ไฟล์ id 6. ข่าวสารเกี่ยวกับ 3046, ระดับ 16, สถานะ 2, บรรทัด 1 ข้อมูลเมตาที่ไม่สอดคล้องกัน การดำเนินการสำรองข้อมูลที่เป็นไปได้เพียงอย่างเดียวคือการสำรองข้อมูลหางโดยใช้ตัวเลือก WITH CONTINUE_AFTER_ERROR หรือ NO_TRUNCATE ข่าวสารเกี่ยวกับ 3013, ระดับ 16, สถานะ 1, ฐานข้อมูลการสำรองข้อมูล 1 บรรทัดจะสิ้นสุดลงอย่างผิดปกติ

ถ้าฉันทำ RESTORE FILELISTONLY บน full และดิฟเฟอเรนเชียลทั้งคู่ก็ให้ผลลัพธ์เดียวกันซึ่งตรงกับสิ่งที่ฉันเห็นจาก sys.database_files บนฐานข้อมูลต้นทาง เซิร์ฟเวอร์คือ SQL2012 SP1 ในรุ่นนักพัฒนา

ฉันสามารถสำรองข้อมูลเต็มรูปแบบและหลังจากนั้นก็ทำดิฟเฟอเรนเชียลและกู้คืนไฟล์เหล่านี้ไปยังฐานข้อมูลอื่นบนเซิร์ฟเวอร์เดียวกันและดูปัญหาเดียวกันดังนั้นจึงมีบางสิ่งที่สร้างความแตกต่างที่ทำให้เกิดสิ่งนี้ ถ้าฉันกู้คืนการสำรองข้อมูลเต็มรูปแบบด้วยการกู้คืนไม่มีปัญหา ฉันไม่ทราบว่าไฟล์นี้เคยมีอยู่ในฐานข้อมูลนี้หรือไม่ แต่อาจเป็นไปได้ว่าไฟล์นี้เคยมีอยู่และถูกลบไปนานแล้ว ถ้าฉันเคียวรี sys.database_files บนฐานข้อมูลที่เรียกคืนไฟล์ DEFUNCT มีค่าสำหรับ drop_lsn ซึ่งดูเหมือนจะยืนยันสิ่งนี้ ขณะนี้อยู่ในฐานข้อมูลต้นทางมีไฟล์กลุ่มเดียว (ไฟล์หลัก) ไฟล์ข้อมูล 4 ไฟล์และไฟล์บันทึกหนึ่งไฟล์

ความคิดใด ๆ


คุณช่วยแสดงงบที่คุณใช้ในการสำรองและเรียกคืนได้หรือไม่
Jon Seigel

ไม่มีอะไรที่ไม่ธรรมดา กู้คืนฐานข้อมูลฐานข้อมูลจาก DISK = 'D: \ Full.bak' ด้วยการแทนที่ NORECOVERY จากนั้นเรียกคืนฐานข้อมูลฐานข้อมูลจาก DISK = 'D: \ Diff.bak' พร้อมการกู้คืน
FilamentUnities

คำตอบ:


5

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

ALTER DATABASE [model] SET RECOVERY SIMPLE
GO
CREATE DATABASE [DefunctTest]
GO
ALTER DATABASE [DefunctTest] ADD LOG FILE ( NAME = N'DefunctTest_log2', FILENAME = N'D:\DefunctTest_log2.ldf' , SIZE = 25600KB , FILEGROWTH = 10%)
GO
BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestPostLogFile.bak' WITH INIT
GO
ALTER DATABASE [DefunctTest]  REMOVE FILE [DefunctTest_log2]
GO

BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestFull.bak' WITH INIT
GO
BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestDiff.bak' WITH DIFFERENTIAL, INIT
GO
--Show that the backups only have the one log file.
RESTORE FILELISTONLY FROM DISK = 'D:\DefunctTestFull.bak'
RESTORE FILELISTONLY FROM DISK = 'D:\DefunctTestDiff.bak'
GO
RESTORE DATABASE [DefunctTest2] FROM DISK = 'D:\DefunctTestFull.bak' WITH 
MOVE 'DefunctTest' TO 'D:\DefunctTest2.mdf',
MOVE 'DefunctTest_log' TO 'D:\DefunctTest2_log.ldf', REPLACE, NORECOVERY
GO
--This restore will have the error.
RESTORE DATABASE [DefunctTest2] FROM DISK = 'D:\DefunctTestDiff.bak' WITH RECOVERY
GO

USE [DefunctTest2]
SELECT * FROM sys.database_files
GO

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

UPDATE: ข้อผิดพลาดที่สร้างสถานการณ์นี้ในสคริปต์ Repro ของฉันดูเหมือนว่าจะได้รับการแก้ไขโดย KB นี้: https://support.microsoft.com/en-us/kb/2830400 จากความคิดเห็นที่ปรากฏการแก้ไขเพิ่มเติมพร้อมใช้งานสำหรับ SQL2012 / 2014 สถานการณ์ดูเหมือนจะคล้ายกันมาก: https://support.microsoft.com/en-us/kb/3009576


ฉันจะรวมสคริปต์ของคุณในความคิดเห็นที่เชื่อมต่อเพื่อช่วยให้ผู้คนทำซ้ำ
Kenneth Fisher

1
ฉันไม่ได้รับข้อผิดพลาดในการเรียกใช้สคริปต์ของคุณใน SQL Server 2012 Enterprise Edition, 11.0.3412 (CU9 สำหรับ SP1)

สคริปต์ที่ซ้ำกันอยู่ในรายการเชื่อมต่อหากคุณคลิกปุ่มรายละเอียด
FilamentUnities

1
Shawn มองผ่านการแก้ไขใน CU ผมคิดว่าสิ่งนี้อาจแก้ไขพฤติกรรมนี้ได้: support.microsoft.com/kb/2830400
FilamentUnities

2
ฉันได้ต่อสู้กับสัปดาห์ที่แล้วและหัวข้อนี้ช่วยฉันจัดการออกขอบคุณมาก ดูเหมือนว่าการแก้ไขจะอยู่ใน SQL 2012 SP2 CU3: support.microsoft.com/en-us/kb/3009576
Richard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.