Triệu chứng
Hãy xem xét tình huống sau:
-
Bạn cài đặt phiên bản Microsoft SQL Server 2005, Microsoft SQL Server 2008 hoặc Microsoft SQL Server 2008 R2.
-
Phiên bản của SQL Server được đặt tên là INST1 và lưu trữ một cơ sở dữ liệu được đặt tên Test_RO_FG_DB.
-
Cơ sở dữ liệu chứa các nhóm tệp sau đây:
-
Chính
-
RO_FG
-
RW_FG
-
-
Nhóm tệp được đặt tên là RO_FG được đánh dấu là READ_ONLY.
-
Bạn cài đặt phiên bản mới của Microsoft SQL Server 2012. Trường hợp này của SQL Server 2012 được đặt tên là INST2.
-
Bạn tách cơ sở Test_RO_FG_DB liệu khỏi INST1.
-
Bạn cố gắng đính kèm cơ sở Test_RO_FG_DB liệu vào INST2.
-
Bạn nhận được thông báo lỗi tương tự như sau:
Không thể nâng cấp msg 3415, Mức 16, Tiểu bang 2, Cơ sở dữ liệu dòng 1'Test_RO_FG_DB' vì tệp ở dạng chỉ đọc, có tệp chỉ đọc hoặc người dùng không có quyền sửa đổi một số tệp. Làm cho cơ sở dữ liệu hoặc tệp có thể ghi được và chạy lại phục hồi.
-
Bạn cố gắng để reattach cơ sở dữ Test_RO_FG_DB liệu inst1.
Trong trường hợp này, bạn không thể reattach cơ sở dữ liệu INST1. Và bạn nhận được thông báo lỗi sau trong nhật ký SQL Server báo lỗi:
Lưu ý Vấn đề này chỉ xảy ra khi bạn cố gắng đính kèm một cơ sở dữ liệu có chứa một tập tin được đánh dấu READ_ONLY. Sự cố này không xảy ra khi bạn cố gắng di chuyển một cơ sở dữ READ_ONLY dữ liệu trong đó tất cả các dữ liệu được đánh dấu READ_ONLY.
Nguyên nhân
Sự cố này xảy ra vì SQL Server 2012 không phát hiện nhóm tệp chỉ đọc trước khi bắt đầu nâng cấp cơ sở dữ liệu. Sau khi nâng cấp đã bắt đầu, SQL Server 2012 ghi các mục nhập vào nhật ký giao dịch. Các phiên bản trước không thể đọc mục nhật ký giao tác mới.
Trạng thái
Microsoft đã xác nhận đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong phần "Áp dụng cho".
Giải pháp
Thông tin cập nhật tích lũy
SQL Server 2012
Bản sửa lỗi cho sự cố này lần đầu tiên được phát hành trong Bản cập nhật Tích lũy 2 SQL Server 2012. Để biết thêm thông tin về gói cập nhật tích lũy này, hãy bấm vào số bài viết sau để xem bài viết trong Cơ sở Kiến thức Microsoft:
2703275 Gói cập nhật tích lũy 2 dành cho SQL Server 2012Note Vì các bản dựng được tích lũy nên mỗi bản phát hành bản sửa lỗi mới đều chứa tất cả các cập nhật nóng và tất cả các bản sửa lỗi bảo mật đi kèm với bản phát hành sửa lỗi SQL Server 2012 trước đó. Microsoft khuyên bạn nên cân nhắc áp dụng bản phát hành sửa lỗi mới nhất có chứa hotfix này. Để biết thêm thông tin, hãy bấm vào số bài viết sau đây để xem bài viết trong Cơ sở Kiến thức Microsoft:
2692828 Các bản dựng SQL Server 2012 được phát hành sau khi SQL Server 2012 được phát hành Bạn phải áp dụng cập nhật nóng SQL Server 2012 cho bản cài đặt SQL Server 2012.
Cách giải quyết
Để khắc phục sự cố này, hãy sử dụng một trong các phương pháp sau đây.Phương pháp 1Khôi phục bản sao lưu của cơ sở dữ liệu từ INST1 trên INST2.Lưu ý Sự cố được mô tả trong phần "Triệu chứng" không xảy ra trong SQL Server 2012 khi bạn khôi phục bản sao lưu từ phiên bản trước đó.Phương pháp 2Thực hiện nâng cấp tại chỗ của phiên bản cũ SQL Server lên SQL Server 2012.Phương pháp 3Di chuyển cơ sở dữ liệu có chứa một nhóm tệp chỉ đọc đến một phiên bản SQL Server 2012. Để thực hiện việc này, hãy làm theo những bước sau.Lưu ý Thực hiện các bước từ 4 đến 11 trên máy chủ đang SQL Server 2012. Ví dụ: thực hiện các bước từ 4 đến 11 trên INST2.
-
Trên INST1, tháo rời cơ sở dữ liệu. Ví dụ: tháo rời cơ sở dữ Test_RO_FG_DB liệu.
-
Di chuyển các tệp cơ sở dữ liệu vào máy chủ lưu trữ phiên bản INST2.
-
Cố gắng đính kèm cơ sở dữ liệu vào INST2. Mã mẫu sau đây cho thấy cách thực hiện điều này:
CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG.mdf' ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_File1.ndf' ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RW_FG_File1.ndf' )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_log.ldf' )FOR ATTACH;GO
Lưu ý Bạn sẽ nhận được thông báo lỗi 3425 được đề cập trong phần "Triệu chứng".
-
Tại dấu nhắc lệnh, hãy đổi tên các tệp cơ sở dữ liệu. Lệnh mẫu sau đây cho thấy cách thực hiện điều này:
rename Test_RO_FG.mdf original_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf original_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf original_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf original_Test_RO_FG_log.ldf
-
Trong SQL Server Management Studio, hãy tạo một cơ sở dữ liệu có cùng tên và cấu trúc vật lý với cơ sở dữ liệu mà bạn muốn đính kèm. Mã mẫu sau đây cho thấy cách thực hiện điều này:
CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_DB.mdf' , SIZE = 4072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RW_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO
-
Đặt cơ sở dữ liệu thành ngoại tuyến. Để thực hiện điều này, hãy chạy lệnh sau đây:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
Tại dấu nhắc lệnh, hãy đổi tên các tệp trong cơ sở dữ liệu mới. Lệnh mẫu sau đây cho thấy cách thực hiện điều này:
rename Test_RO_FG.mdf new_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf new_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf new_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf new_Test_RO_FG_log.ldf
-
Tại dấu nhắc lệnh, hãy đổi tên các tệp trong cơ sở dữ liệu mà bạn đã di chuyển ở bước 2. Đổi tên tệp để khớp với cơ sở dữ liệu bạn đã tạo trong bước 4. Lệnh mẫu sau đây cho thấy cách thực hiện điều này:
rename original_Test_RO_FG.mdf Test_RO_FG.mdf rename original_Test_RO_FG_File1.ndf Test_RO_FG_File1.ndf rename original_Test_RW_FG_File1.ndf Test_RW_FG_File1.ndf rename original_Test_RO_FG_log.ldf Test_RO_FG_log.ldf
-
Đặt cơ sở dữ liệu thành TRỰC TUYẾN. Để thực hiện điều này, hãy chạy lệnh sau đây:
ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO
-
Xác minh rằng cơ sở dữ liệu đang trực tuyến và thiết lập lại chức năng Trình môi giới Dịch vụ.
-
Xóa các tệp cơ sở dữ liệu không cần thiết. Lệnh mẫu sau đây cho thấy cách thực hiện điều này:
del /P new_Test_RO_FG.mdfdel /P new_Test_RO_FG_File1.ndfdel /P new_Test_RW_FG_File1.ndfdel /P new_Test_RO_FG_log.ldf
Phương pháp 4Reattach một cơ sở dữ liệu có chứa một filegroup chỉ đọc phiên bản trước đó của một SQL Server. Để thực hiện việc này, hãy làm theo những bước sau.Ghi chú
-
Cơ sở dữ liệu này cũng chứa các mục nhật ký giao dịch mới từ quá trình nâng cấp không thành công.
-
Thực hiện các bước từ 3 đến 10 trên máy chủ đang chạy phiên bản trước của SQL Server. Ví dụ: thực hiện các bước từ 3 đến 10 trên INST1.
-
Di chuyển các tệp cơ sở dữ liệu đến phiên bản SQL Server đang lưu trữ INST1.
-
Cố gắng đính kèm cơ sở dữ liệu vào INST1. Mã mẫu sau đây cho thấy cách thực hiện điều này:
CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_DB.mdf' ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_File1.ndf' ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RW_FG_File1.ndf' )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_log.ldf' )FOR ATTACHGO
Lưu ý Bạn sẽ nhận được thông báo lỗi 3624 được đề cập trong phần "Triệu chứng". Bạn cũng sẽ nhận được thông báo lỗi 1813.
-
Tại dấu nhắc lệnh, hãy đổi tên tệp cơ sở dữ liệu trên INST1. Lệnh mẫu sau đây cho thấy cách thực hiện điều này:
rename Test_RO_FG.mdf original_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf original_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf original_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf original_Test_RO_FG_log.ldf
-
Trong SQL Server Management Studio, hãy tạo một cơ sở dữ liệu có cùng tên và cấu trúc vật lý với cơ sở dữ liệu mà bạn muốn đính kèm. Mã mẫu sau đây cho thấy cách thực hiện điều này:
CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_DB.mdf' , SIZE = 4072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RW_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO
-
Đặt cơ sở dữ liệu thành ngoại tuyến. Để thực hiện điều này, hãy chạy lệnh sau đây:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
Tại dấu nhắc lệnh, hãy đổi tên các tệp trong cơ sở dữ liệu mới. Lệnh mẫu sau đây cho thấy cách thực hiện điều này:
rename Test_RO_FG.mdf new_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf new_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf new_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf new_Test_RO_FG_log.ldf
-
Tại dấu nhắc lệnh, hãy đổi tên các tệp trong cơ sở dữ liệu mà bạn đã di chuyển ở bước 2. Đổi tên tệp để khớp với cơ sở dữ liệu bạn đã tạo trong bước 4. Lệnh mẫu sau đây cho thấy cách thực hiện điều này:
rename original_Test_RO_FG.mdf Test_RO_FG.mdf rename original_Test_RO_FG_File1.ndf Test_RO_FG_File1.ndf rename original_Test_RW_FG_File1.ndf Test_RW_FG_File1.ndf rename original_Test_RO_FG_log.ldf Test_RO_FG_log.ldf
-
Đặt cơ sở dữ liệu ở chế độ KHẨN CẤP và thực hiện sửa chữa. Để thực hiện điều này, hãy chạy lệnh sau đây.Lưu ý Nhật ký giao dịch cơ sở dữ liệu được xây dựng lại trong bước này. Điều này có thể dẫn đến mất dữ liệu. Vì vậy, chúng tôi khuyên bạn nên sao lưu cơ sở dữ liệu trước khi thực hiện bước này.
ALTER DATABASE Test_RO_FG_DB SET EMERGENCYGOALTER DATABASE Test_RO_FG_DB SET SINGLE_USERGODBCC CHECKDB (Test_RO_FG_DB, repair_allow_data_loss) WITH ALL_ERRORMSGSGOALTER DATABASE Test_RO_FG_DB SET MULTI_USERGO
-
Xác minh rằng cơ sở dữ liệu đang trực tuyến và thiết lập lại chức năng Trình môi giới Dịch vụ.
-
Xóa các tệp cơ sở dữ liệu không cần thiết. Lệnh mẫu sau đây cho thấy cách thực hiện điều này:
del /P new_Test_RO_FG.mdfdel /P new_Test_RO_FG_File1.ndfdel /P new_Test_RW_FG_File1.ndfdel /P new_Test_RO_FG_log.ldf
Thông tin Bổ sung
Có một số bước xảy ra khi một cơ sở dữ liệu được đính kèm với một phiên bản SQL Server. Các bước này bao gồm khôi phục cơ sở dữ liệu và nâng cấp tệp từ các phiên bản trước của SQL Server. Trong sự cố được mô tả trong phần "Triệu chứng", SQL Server 2012 bắt đầu quá trình nâng cấp trước khi phát hiện tệp chỉ đọc trong cơ sở dữ liệu. Các bước nâng cấp bao gồm bắt đầu một giao dịch để xóa bit "sạch sẽ tắt" trong trang khởi động của cơ sở dữ liệu. Các phiên bản trước của SQL Server thể đọc bản ghi giao dịch bắt đầu. Vì vậy, cơ sở dữ liệu là không có thể sử dụng trong các phiên bản trước của SQL Server, và SQL Server tạo ra các lỗi 3624.Nâng cấp tại chỗ khi cơ sở dữ liệu được đánh dấu là chỉ đọc Khi bạn thực hiện nâng cấp tại chỗ một phiên bản của SQL Server có chứa cơ sở dữ liệu chỉ đọc có tên là Test_RO_DB lên SQL Server 2012, bạn có thể nhận được thông báo lỗi giống như sau trong nhật ký lỗi SQL Server:
Khi kết thúc quá trình nâng cấp, cơ sở dữ Test_RO_DB sẽ ở trạng thái RECOVERY_PENDING của bạn. Bạn phải sử dụng lệnh ALTER DATABASE để đặt cơ sở dữ liệu thành cơ sở dữ READ_WRITE. Sau đó, sử dụng lệnh ALTER DATABASE để đặt cơ sở dữ liệu thành READ_ONLY. Điều này cho phép SQL Server cơ sở dữ liệu nâng cấp cơ sở dữ liệu lên phiên bản chính xác.Nâng cấp tại chỗ khi cơ sở dữ liệu đọc/ghi chứa các nhóm tệp được đánh dấu là chỉ đọc Khi bạn thực hiện nâng cấp tại chỗ lên SQL Server 2012, bạn có thể nhận được thông báo giống như sau trong nhật ký lỗi SQL Server. Sự cố này xảy ra khi phiên bản trước đó của SQL Server lưu trữ cơ sở dữ liệu đọc/ghi và chứa các nhóm tệp được đánh dấu READ_ONLY. Tuy nhiên, quá trình nâng cấp kết thúc như mong đợi và cơ sở dữ liệu bắt đầu trực tuyến.Lưu ý Trong thông báo lỗi sau đây, cơ sở dữ liệu được đặt tên là Test_RO_FG: