Khôi phục sao lưu vi sai tạo tệp nhật ký DEFUNCT?


11

Đây là vấn đề của tôi. Tôi đang cố gắng di chuyển cơ sở dữ liệu sang một máy chủ mới thông qua khôi phục hoàn toàn, sau đó chuyển đổi với một bản sao lưu / khôi phục vi sai nhanh chóng. Tôi có thể thực hiện khôi phục hoàn toàn mà không gặp sự cố, nhưng khi khôi phục bản sao lưu vi sai, tôi nhận được cảnh báo sau:

Msg 3127, Cấp 16, Trạng thái 1, Dòng 1 Tệp 'Database_Log2' của cơ sở dữ liệu được khôi phục 'DatabaseName' đang bị bỏ lại ở trạng thái không còn tồn tại vì cơ sở dữ liệu đang sử dụng mô hình khôi phục đơn giản và tệp được đánh dấu để truy cập đọc-ghi. Do đó, chỉ các tệp chỉ đọc có thể được phục hồi bằng cách khôi phục từng phần.

Cơ sở dữ liệu khôi phục và được coi là trực tuyến, nhưng mọi thao tác sao lưu đều thất bại do tệp DEFUNCT này có lỗi sau:

Msg 3636, Cấp 16, Trạng thái 2, Dòng 1 Đã xảy ra lỗi khi xử lý siêu dữ liệu 'BackupMetadata' cho cơ sở dữ liệu id tệp 10 id 6. Msg 3046, Cấp 16, Trạng thái 2, Dòng 1 Siêu dữ liệu không nhất quán đã gặp phải. Hoạt động sao lưu duy nhất có thể là sao lưu nhật ký đuôi bằng cách sử dụng tùy chọn VỚI CONTINUE_AFTER_ERROR hoặc NO_TRUNCATE. Msg 3013, Cấp 16, Tiểu bang 1, Dòng 1 BACKUP DATABASE đang chấm dứt bất thường.

Nếu tôi thực hiện RESTORE FILELISTONLY trên toàn bộ và vi sai, cả hai đều cho tôi cùng một đầu ra, khớp với những gì tôi thấy từ sys.database_files trên cơ sở dữ liệu nguồn. Máy chủ là SQL2012 SP1, trên phiên bản Nhà phát triển.

Tôi có thể thực hiện sao lưu toàn bộ và ngay lập tức sau đó thực hiện một vi sai và khôi phục các tệp này vào một cơ sở dữ liệu khác trên cùng một máy chủ và xem cùng một vấn đề chính xác, do đó, có một cái gì đó với cách tạo ra vi sai gây ra điều này. Nếu tôi khôi phục lại bản sao lưu đầy đủ VỚI THU HỒI thì không có vấn đề gì. Tôi không biết liệu tệp này đã từng tồn tại trên cơ sở dữ liệu này hay chưa, nhưng hoàn toàn có thể tệp này đã từng tồn tại và đã bị xóa từ lâu. Nếu tôi truy vấn sys.database_files trên cơ sở dữ liệu được khôi phục, tệp DEFUNCT có giá trị cho drop_lsn, dường như xác nhận điều này. Hiện tại trong cơ sở dữ liệu nguồn chỉ có một tệp filegroup (PRIMARY), 4 tệp dữ liệu và một tệp nhật ký.

Có ý kiến ​​gì không?


Bạn có thể vui lòng chỉ cho chúng tôi các báo cáo bạn đang sử dụng để thực hiện sao lưu và khôi phục không?
Jon Seigel

Không có gì khác thường. RESTORE DATABASE DatabaseName FROM DISK = 'D: \ Full.bak' VỚI REPLACE, NORECOVERY Sau đó RESTORE DATABASE DatabaseName FROM DISK = 'D: \ Diff.bak' VỚI PHỤC HỒI
FilamentUnities

Câu trả lời:


5

Dưới đây là các bước để tạo lại điều này, đã được thử nghiệm trên SQL 2012 SP1 Developer Edition. Điều này không xảy ra trên SQL 2008. Tóm lại, cơ sở dữ liệu được tạo trong SQL 2012 trong khi cơ sở dữ liệu mô hình đang trong quá trình khôi phục SIMPLE, có bản sao lưu đầy đủ trong khi tồn tại tệp nhật ký bổ sung, không thể tạo bản sao lưu vi sai có thể sử dụng được nếu tệp nhật ký bổ sung đó là từng bị xóa.

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

Tôi đã gửi một mục Connect cho lỗi này ở đây . Cách duy nhất tôi có thể xóa tệp không còn tồn tại này là tách cơ sở dữ liệu và đính kèm lại với ATTACH_REBUILD_LOG.

CẬP NHẬT: Lỗi tạo kịch bản này trong tập lệnh repro của tôi dường như đã được sửa bởi KB này: https://support.microsoft.com/en-us/kb/2830400 . Từ các bình luận, có vẻ như một bản sửa lỗi bổ sung có sẵn cho SQL2012 / 2014, các tình huống có vẻ rất giống nhau: https://support.microsoft.com/en-us/kb/3009576


Tôi sẽ bao gồm tập lệnh của bạn trong các bình luận kết nối để giúp mọi người tái tạo.
Kenneth Fisher

1
Tôi không gặp bất kỳ lỗi nào khi chạy tập lệnh của bạn trên SQL Server 2012 Enterprise Edition, 11.0.3412 (CU9 cho SP1)

Tập lệnh repro nằm trong mục Kết nối, nếu bạn bấm vào nút Chi tiết.
FilamentUnities

1
Shawn, xem qua các bản sửa lỗi trong CU's, tôi nghĩ rằng cái này có lẽ đã sửa hành vi này: support.microsoft.com/kb/2830400
FilamentUnities

2
Tôi đã có một trận chiến với tuần này và chủ đề này giúp tôi sắp xếp nó rất cảm ơn bạn. Có vẻ như bản sửa lỗi nằm trong SQL 2012 SP2 CU3: support.microsoft.com/en-us/kb/3009576
Richard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.