อาการ
พิจารณาสถานการณ์ต่อไปนี้:
-
คุณติดตั้งอินสแตนซ์ของ Microsoft SQL Server ๒๐๐๕, Microsoft SQL Server ๒๐๐๘หรือของ Microsoft SQL Server ๒๐๐๘ R2
-
อินสแตนซ์ของ SQL Server มีชื่อ INST1 และโฮสต์ฐานข้อมูลที่ชื่อ Test_RO_FG_DB
-
ฐานข้อมูลประกอบด้วยกลุ่มไฟล์ต่อไปนี้:
-
หลัก
-
RO_FG
-
RW_FG
-
-
กลุ่มแฟ้มที่ชื่อ RO_FG ถูกทำเครื่องหมายเป็น READ_ONLY
-
คุณติดตั้งอินสแตนซ์ใหม่ของ Microsoft SQL Server ๒๐๑๒ อินสแตนซ์ของ SQL Server ๒๐๑๒นี้มีชื่อ INST2
-
คุณแยกฐานข้อมูล Test_RO_FG_DB ออกจาก INST1
-
คุณพยายามแนบฐานข้อมูล Test_RO_FG_DB ไปยัง INST2
-
คุณได้รับข้อความแสดงข้อผิดพลาดที่คล้ายกับต่อไปนี้:
Msg ๓๔๑๕ระดับ16สถานะ2เส้น 1Database ' Test_RO_FG_DB ' ไม่สามารถอัปเกรดได้เนื่องจากเป็นแบบอ่านอย่างเดียวมีไฟล์แบบอ่านอย่างเดียวหรือผู้ใช้ไม่มีสิทธิ์ในการปรับเปลี่ยนไฟล์บางส่วน ทำให้ฐานข้อมูลหรือไฟล์สามารถเขียนได้และเรียกใช้การกู้คืนอีกครั้ง
-
คุณพยายามที่จะแนบฐานข้อมูล Test_RO_FG_DB ไปยัง INST1
ในสถานการณ์สมมตินี้คุณไม่สามารถแนบฐานข้อมูลกับ INST1 และคุณได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้ในบันทึกข้อผิดพลาด SQL Server:
หมายเหตุ ปัญหานี้เกิดขึ้นเฉพาะเมื่อคุณพยายามแนบฐานข้อมูลที่มีกลุ่มไฟล์ที่ถูกทำเครื่องหมาย READ_ONLY ปัญหานี้เกิดขึ้นเมื่อคุณพยายามย้ายฐานข้อมูล READ_ONLY ที่ข้อมูลทั้งหมดถูกทำเครื่องหมาย READ_ONLY
สาเหตุ
ปัญหานี้เกิดขึ้นเนื่องจาก SQL Server ๒๐๑๒ไม่พบกลุ่มไฟล์แบบอ่านอย่างเดียวก่อนที่จะเริ่มการอัปเกรดฐานข้อมูล หลังจากการอัปเกรดเริ่มต้นแล้ว SQL Server ๒๐๑๒จะเขียนรายการไปยังบันทึกทรานแซคชัน เวอร์ชันก่อนหน้าไม่สามารถอ่านรายการบันทึกทรานแซคชันใหม่ได้
สถานะ
Microsoft ยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งมีการระบุไว้ในส่วน "นำไปใช้กับ"
การแก้ไข
ข้อมูลโปรแกรมอัปเดตสะสม
SQL Server 2012
การแก้ไขสำหรับปัญหานี้ถูกนำออกใช้ครั้งแรกใน2การปรับปรุงที่สะสมสำหรับ SQL Server ๒๐๑๒ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับแพคเกจโปรแกรมปรับปรุงที่สะสมนี้ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
๒๗๐๓๒๗๕ แพคเกจโปรแกรมปรับปรุงที่สะสม2สำหรับ SQL Server ๒๐๑๒หมายเหตุ เนื่องจาก builds สะสมแต่ละรุ่นของการแก้ไขใหม่มีโปรแกรมแก้ไขด่วนทั้งหมดและการแก้ไขการรักษาความปลอดภัยทั้งหมดที่รวมอยู่ใน SQL Server ๒๐๑๒รุ่นก่อนหน้านี้ Microsoft ขอแนะนำให้คุณพิจารณาใช้การแก้ไขการแก้ไขล่าสุดที่มีโปรแกรมแก้ไขด่วนนี้ สำหรับข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base:
๒๖๙๒๘๒๘ SQL Server ๒๐๑๒รุ่นที่เผยแพร่หลังจากที่มีการเผยแพร่ SQL Server ๒๐๑๒ คุณต้องนำโปรแกรมแก้ไขด่วนของ SQL Server ๒๐๑๒ไปใช้กับการติดตั้ง SQL Server ๒๐๑๒
วิธีแก้ไขปัญหาชั่วคราว
เมื่อต้องการแก้ไขปัญหานี้ให้ใช้วิธีการใดวิธีการหนึ่งต่อไปนี้วิธีที่ 1คืนค่าสำเนาสำรองของฐานข้อมูลจาก INST1 บน INST2หมายเหตุ ปัญหาที่อธิบายไว้ในส่วน "อาการ" ไม่เกิดขึ้นใน SQL Server ๒๐๑๒เมื่อคุณคืนค่าการสำรองข้อมูลจากเวอร์ชันก่อนหน้าวิธีที่ 2ทำการอัปเกรดแบบแทนที่ของ SQL Server เวอร์ชันก่อนหน้าไปยัง SQL Server ๒๐๑๒วิธีที่ 3ย้ายฐานข้อมูลที่มีกลุ่มข้อมูลแบบอ่านอย่างเดียวไปยังอินสแตนซ์ของ SQL Server ๒๐๑๒ เมื่อต้องการทำเช่นนี้ให้ทำตามขั้นตอนต่อไปนี้หมายเหตุ ดำเนินการขั้นตอนที่4ถึง11บนเซิร์ฟเวอร์ที่กำลังเรียกใช้ SQL Server ๒๐๑๒ ตัวอย่างเช่นดำเนินการขั้นตอนที่4ถึง11บน INST2
-
บน INST1 ให้แยกฐานข้อมูลออก ตัวอย่างเช่นการแยกฐานข้อมูล Test_RO_FG_DB ออก
-
ย้ายไฟล์ฐานข้อมูลไปยังเซิร์ฟเวอร์ที่โฮสต์อินสแตนซ์ INST2
-
ลองแนบฐานข้อมูลกับ INST2 โค้ดตัวอย่างต่อไปนี้แสดงวิธีการทำสิ่งนี้:
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
หมายเหตุ คุณจะได้รับข้อความแสดงข้อผิดพลาด๓๔๒๕ที่กล่าวถึงในส่วน "อาการ"
-
ที่พร้อมท์คำสั่งให้เปลี่ยนชื่อไฟล์ฐานข้อมูล คำสั่งตัวอย่างต่อไปนี้จะแสดงวิธีการทำสิ่งนี้:
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
-
ใน SQL Server Management Studio ให้สร้างฐานข้อมูลที่มีชื่อเดียวกันและโครงสร้างทางกายภาพเป็นฐานข้อมูลที่คุณต้องการแนบ โค้ดตัวอย่างต่อไปนี้แสดงวิธีการทำสิ่งนี้:
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
-
ตั้งค่าฐานข้อมูลเป็นแบบออฟไลน์ เมื่อต้องการทำเช่นนี้ให้เรียกใช้คำสั่งต่อไปนี้:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
ที่พร้อมท์คำสั่งให้เปลี่ยนชื่อไฟล์ในฐานข้อมูลใหม่ คำสั่งตัวอย่างต่อไปนี้จะแสดงวิธีการทำสิ่งนี้:
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
-
ที่พร้อมท์คำสั่งให้เปลี่ยนชื่อไฟล์ในฐานข้อมูลที่คุณย้ายในขั้นตอนที่2 เปลี่ยนชื่อไฟล์ให้ตรงกับฐานข้อมูลที่คุณสร้างในขั้นตอนที่4 คำสั่งตัวอย่างต่อไปนี้จะแสดงวิธีการทำสิ่งนี้:
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
-
ตั้งค่าฐานข้อมูลให้เป็นแบบออนไลน์ เมื่อต้องการทำเช่นนี้ให้เรียกใช้คำสั่งต่อไปนี้:
ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO
-
ตรวจสอบว่าฐานข้อมูลออนไลน์อยู่และสร้างฟังก์ชัน Broker บริการใหม่
-
ลบไฟล์ฐานข้อมูลที่ไม่จำเป็น คำสั่งตัวอย่างต่อไปนี้จะแสดงวิธีการทำสิ่งนี้:
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
วิธีที่4แนบฐานข้อมูลที่มีกลุ่มข้อมูลแบบอ่านอย่างเดียวกับอินสแตนซ์ของ SQL Server รุ่นก่อนหน้า เมื่อต้องการทำเช่นนี้ให้ทำตามขั้นตอนต่อไปนี้หมายเหตุ
-
ฐานข้อมูลยังมีรายการล็อกธุรกรรมใหม่จากการอัปเกรดที่ล้มเหลว
-
ดำเนินการขั้นตอนที่3ถึง10บนเซิร์ฟเวอร์ที่กำลังเรียกใช้ SQL Server เวอร์ชันก่อนหน้า ตัวอย่างเช่นทำขั้นตอนที่3ถึง10บน INST1
-
ย้ายไฟล์ฐานข้อมูลไปยังอินสแตนซ์ของ SQL Server ที่เป็นโฮสต์ INST1
-
ลองแนบฐานข้อมูลกับ INST1 โค้ดตัวอย่างต่อไปนี้แสดงวิธีการทำสิ่งนี้:
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
หมายเหตุ คุณจะได้รับข้อความแสดงข้อผิดพลาด๓๖๒๔ที่กล่าวถึงในส่วน "อาการ" นอกจากนี้คุณจะได้รับข้อความแสดงข้อผิดพลาด๑๘๑๓
-
ที่พร้อมท์คำสั่งให้เปลี่ยนชื่อไฟล์ฐานข้อมูลบน INST1 คำสั่งตัวอย่างต่อไปนี้จะแสดงวิธีการทำสิ่งนี้:
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
-
ใน SQL Server Management Studio ให้สร้างฐานข้อมูลที่มีชื่อเดียวกันและโครงสร้างทางกายภาพเป็นฐานข้อมูลที่คุณต้องการแนบ โค้ดตัวอย่างต่อไปนี้แสดงวิธีการทำสิ่งนี้:
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
-
ตั้งค่าฐานข้อมูลเป็นแบบออฟไลน์ เมื่อต้องการทำเช่นนี้ให้เรียกใช้คำสั่งต่อไปนี้:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
ที่พร้อมท์คำสั่งให้เปลี่ยนชื่อไฟล์ในฐานข้อมูลใหม่ คำสั่งตัวอย่างต่อไปนี้จะแสดงวิธีการทำสิ่งนี้:
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
-
ที่พร้อมท์คำสั่งให้เปลี่ยนชื่อไฟล์ในฐานข้อมูลที่คุณย้ายในขั้นตอนที่2 เปลี่ยนชื่อไฟล์ให้ตรงกับฐานข้อมูลที่คุณสร้างในขั้นตอนที่4 คำสั่งตัวอย่างต่อไปนี้จะแสดงวิธีการทำสิ่งนี้:
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
-
ตั้งค่าฐานข้อมูลไปยังโหมดฉุกเฉินและทำการซ่อมแซม เมื่อต้องการทำเช่นนี้ให้เรียกใช้คำสั่งต่อไปนี้หมายเหตุ บันทึกทรานแซคชันฐานข้อมูลจะถูกสร้างขึ้นใหม่ในระหว่างขั้นตอนนี้ การทำเช่นนี้อาจส่งผลในการสูญหายของข้อมูล ดังนั้นเราจึงขอแนะนำให้คุณสำรองฐานข้อมูลก่อนที่คุณจะทำขั้นตอนนี้
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
-
ตรวจสอบว่าฐานข้อมูลออนไลน์อยู่และสร้างฟังก์ชัน Broker บริการใหม่
-
ลบไฟล์ฐานข้อมูลที่ไม่จำเป็น คำสั่งตัวอย่างต่อไปนี้จะแสดงวิธีการทำสิ่งนี้:
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
ข้อมูลเพิ่มเติม
มีหลายขั้นตอนที่เกิดขึ้นเมื่อมีการแนบฐานข้อมูลกับอินสแตนซ์ของ SQL Server ขั้นตอนเหล่านี้รวมถึงการกู้คืนฐานข้อมูลและอัปเกรดไฟล์จาก SQL Server เวอร์ชันก่อนหน้า ในปัญหาที่อธิบายไว้ในส่วน "อาการ" SQL Server ๒๐๑๒จะเริ่มกระบวนการอัปเกรดก่อนที่จะมีการตรวจพบไฟล์แบบอ่านอย่างเดียวในฐานข้อมูล ขั้นตอนการอัปเกรดรวมถึงการเริ่มทรานแซคชันเพื่อล้างกล่องกาเครื่องหมาย "ปิดเครื่องแล้ว" ในหน้าเริ่มต้นของฐานข้อมูล SQL Server เวอร์ชันก่อนหน้าไม่สามารถอ่านระเบียนเริ่มต้นของทรานแซคชันได้ ฐานข้อมูลไม่สามารถใช้ได้ใน SQL Server เวอร์ชันก่อนหน้าและ SQL Server จะสร้างข้อผิดพลาด๓๖๒๔การอัปเกรดแบบแทนที่เมื่อฐานข้อมูลถูกทำเครื่องหมายเป็นแบบอ่านอย่างเดียวเมื่อคุณทำการอัปเกรดแบบแทนที่ของอินสแตนซ์ของ SQL Server ที่มีฐานข้อมูลแบบอ่านอย่างเดียวที่ชื่อว่า Test_RO_DB ไปยัง SQL Server ๒๐๑๒คุณอาจได้รับข้อความแสดงข้อผิดพลาดที่คล้ายกับต่อไปนี้ในแฟ้มบันทึกข้อผิดพลาด SQL Server:
ที่ส่วนท้ายของกระบวนการอัปเกรด Test_RO_DB ฐานข้อมูลจะอยู่ในสถานะ RECOVERY_PENDING คุณต้องใช้คำสั่ง เปลี่ยนฐานข้อมูล เพื่อตั้งค่าฐานข้อมูลเป็น READ_WRITE จากนั้นใช้คำสั่ง เปลี่ยนฐานข้อมูล เพื่อตั้งค่าฐานข้อมูลเป็น READ_ONLY การทำเช่นนี้จะช่วยให้โปรแกรม SQL Server อัปเกรดฐานข้อมูลเป็นเวอร์ชันที่ถูกต้องการอัปเกรดแบบแทนที่เมื่อฐานข้อมูลแบบอ่าน/เขียนมีกลุ่มไฟล์ที่ถูกทำเครื่องหมายเป็นแบบอ่านอย่างเดียวเมื่อคุณทำการอัปเกรดแบบแทนที่เป็น SQL Server ๒๐๑๒คุณอาจได้รับข้อความที่มีลักษณะดังต่อไปนี้ในบันทึกข้อผิดพลาด SQL Server ปัญหานี้เกิดขึ้นเมื่ออินสแตนซ์ก่อนหน้าของ SQL Server โฮสต์ฐานข้อมูลแบบอ่าน/เขียนและประกอบด้วยกลุ่มไฟล์ที่ถูกทำเครื่องหมาย READ_ONLY อย่างไรก็ตามกระบวนการอัปเกรดจะเสร็จสิ้นตามที่คาดไว้และฐานข้อมูลจะเริ่มต้นใช้งานแบบออนไลน์หมายเหตุ ในข้อความแสดงข้อผิดพลาดต่อไปนี้จะมีการตั้งชื่อฐานข้อมูล Test_RO_FG: