Triệu chứng
Hãy xem xét tình huống sau:
-
Bạn cài đặt một phiên bản của Microsoft SQL Server 2005, Microsoft SQL Server 2008 hoặc Microsoft SQL Server 2008 R2.
-
Phiên bản SQL Server được đặt tên là INST1 và chủ cơ sở dữ liệu được đặt tên là Test_RO_FG_DB.
-
Cơ sở dữ liệu có chứa các nhóm tệp sau đây:
-
Tiểu
-
RO_FG
-
RW_FG
-
-
Nhóm fileđược đặt tên là RO_FG được đánh dấu là READ_ONLY.
-
Bạn cài đặt một phiên bản mới của Microsoft SQL Server 2012. Phiên bản SQL Server 2012 này được đặt tên là INST2.
-
Bạn đã tách cơ sở dữ liệu Test_RO_FG_DB từ INST1.
-
Bạn tìm cách đính kèm cơ sở dữ liệu Test_RO_FG_DB thành INST2.
-
Bạn nhận được một thông báo lỗi tương tự như sau:
Msg 3415, Level 16, State 2, dòng 1Cơ sở dữ liệu ' Test_RO_FG_DB ' không thể nâng cấp vì nó là chỉ đọc, có 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ể thu hồi và khôi phục lại.
-
Bạn tìm cách đính kèm lại cơ sở dữ liệu Test_RO_FG_DB vào INST1.
Trong trường hợp này, bạn không thể đính kèm cơ sở dữ liệu vào INST1. Và, bạn nhận được thông báo lỗi sau đây trong Nhật ký lỗi SQL Server:
Lưu ý Sự cố này chỉ xảy ra khi bạn thử đính kèm một cơ sở dữ liệu có chứa một nhóm fileđược đánh dấu là READ_ONLY. Vấn đề này không xảy ra khi bạn tìm cách di chuyển cơ sở dữ liệu READ_ONLY trong đó tất cả dữ liệu được đánh dấu là 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 filechonly 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 viết các mục nhập vào Nhật ký giao dịch. Các phiên bản cũ hơn không thể đọc các mục nhập Nhật ký giao dịch 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 Cumulative Update 2 cho SQL Server 2012. Để biết thêm thông tin về gói Cập Nhật lũy tích này, hãy bấm 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 cho SQL Server 2012Lưu ý Vì bản dựng được tích lũy, mỗi bản phát hành khắc phục sự cố mới chứa tất cả các hotfix và tất cả các bản sửa lỗi bảo mật đã được đưa vào bản phát hành khắc phục SQL Server 2012 trước đó. Microsoft khuyên bạn nên cân nhắc việc áp dụng bản phát hành khắc phục gần đây nhất có chứa các 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 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 một hotfix SQL Server 2012 vào một bản cài đặt của SQL Server 2012.
Cách giải quyết
Để giải quyết vấn đề 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ơ sở dữ liệu từ INST1 trên INST2.Lưu ý Vấn đề được mô tả trong phần "các 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 SQL Server cũ hơn cho SQL Server 2012.Phương thức 3Di chuyển một cơ sở dữ liệu có chứa một nhóm fileno chỉ đọc vào một phiên bản của 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 4 đến 11 trên máy chủ đang chạy SQL Server 2012. Ví dụ, thực hiện các bước từ 4 đến 11 trên INST2.
-
Trên INST1, hãy tách cơ sở dữ liệu. Ví dụ: việc tách cơ sở dữ liệu Test_RO_FG_DB.
-
Di chuyển các tệp cơ sở dữ liệu đến máy chủ lưu trữ ví dụ INST2.
-
Tìm cách đính kèm cơ sở dữ liệu vào INST2. Mã mẫu sau đây cho biết cách thực hiện như sau:
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 "các triệu chứng".
-
Tại dấu nhắc lệnh, hãy đổi tên tệp cơ sở dữ liệu. Lệnh mẫu sau đây cho biết cách thực hiện như sau:
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 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 biết cách thực hiện như sau:
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 sang ngoại tuyến. Để thực hiện thao tác 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 tệp trong cơ sở dữ liệu mới. Lệnh mẫu sau đây cho biết cách thực hiện như sau:
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 tệp trong cơ sở dữ liệu mà bạn đã di chuyển trong bước 2. Đổi tên tệp để khớp với cơ sở dữ liệu mà bạn đã tạo trong bước 4. Lệnh mẫu sau đây cho biết cách thực hiện như sau:
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 thao tác 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 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 biết cách thực hiện như sau:
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 thức 4Gắn lại một cơ sở dữ liệu có chứa một nhóm fileno chỉ đọc vào phiên bản trước của SQL Server. Để thực hiện việc này, hãy làm theo những bước sau.Lưu ý́
-
Cơ sở dữ liệu cũng có chứa các mục nhập Nhật ký giao dịch mới từ bản 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 SQL Server cũ hơn. 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 của SQL Server đang lưu trữ INST1.
-
Tìm cách đính kèm cơ sở dữ liệu vào INST1. Mã mẫu sau đây cho biết cách thực hiện như sau:
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 "các 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 biết cách thực hiện như sau:
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 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 biết cách thực hiện như sau:
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 sang ngoại tuyến. Để thực hiện thao tác 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 tệp trong cơ sở dữ liệu mới. Lệnh mẫu sau đây cho biết cách thực hiện như sau:
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 tệp trong cơ sở dữ liệu mà bạn đã di chuyển trong bước 2. Đổi tên tệp để khớp với cơ sở dữ liệu mà bạn đã tạo trong bước 4. Lệnh mẫu sau đây cho biết cách thực hiện như sau:
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 sang chế độ khẩn cấp và thực hiện sửa chữa. Để thực hiện thao tác này, hãy chạy lệnh sau đây.Lưu ý Các 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 việc mất dữ liệu. Do đó, 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 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 biết cách thực hiện như sau:
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 vài bước xảy ra khi một cơ sở dữ liệu được đính kèm vào một phiên bản của 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 các tệp từ các phiên bản cũ hơn của SQL Server. Trong vấn đề được mô tả trong phần "các triệu chứng", SQL Server 2012 bắt đầu quá trình nâng cấp trước khi các tệp chỉ đọc trong cơ sở dữ liệu được phát hiện. Các bước nâng cấp bao gồm bắt đầu một giao dịch để xóa một chút "dọn sạch tắt" trong trang khởi động của cơ sở dữ liệu. Các phiên bản SQL Server cũ hơn không thể đọc bản ghi bắt đầu giao dịch. Do đó, cơ sở dữ liệu không thể sử dụng được trong các phiên bản SQL Server cũ hơn và SQL Server sẽ tạo ra lỗi 3624.Nâng cấp tại chỗ khi một cơ sở dữ liệu được đánh dấu là chỉ đọcKhi bạn thực hiện nâng cấp tại chỗ của một phiên bản của SQL Server có chứa một cơ sở dữ liệu chỉ đọc được đặt tên là Test_RO_DB vào SQL Server 2012, bạn có thể nhận được thông báo lỗi giống như sau đây trong Nhật ký lỗi SQL Server:
Ở phần cuối của quy trình nâng cấp, cơ sở dữ liệu Test_RO_DB sẽ nằm trong trạng thái RECOVERY_PENDING. Bạn phải dùng lệnh sửa đổi cơ sở dữ liệu để đặt cơ sở dữ liệu để READ_WRITE. Sau đó, hãy dùng lệnh Alter Database để đặt cơ sở dữ liệu READ_ONLY. Điều này cho phép máy chủ SQL nâng cấp cơ sở dữ liệu sang phiên bản chính xác.Nâng cấp tại chỗ khi một cơ sở dữ liệu đọc/ghi chứa các nhóm tệp được đánh dấu là chỉ đọcKhi 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 các thư 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 là READ_ONLY. Tuy nhiên, quá trình nâng cấp sẽ 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: