อาการ
พิจารณาสถานการณ์ต่อไปนี้:
-
คุณติดตั้งอินสแตนซ์ของ Microsoft SQL Server 2005 ของ Microsoft SQL Server 2008 หรือ Microsoft SQL Server 2008 R2
-
อินสแตนซ์ของ SQL Server มีชื่อว่า INST1 และโฮสต์ฐานข้อมูลที่มีชื่อว่า Test_RO_FG_DB
-
ฐานข้อมูลมีกลุ่มไฟล์ต่อไปนี้:
-
หลัก
-
RO_FG
-
RW_FG
-
-
กลุ่มแฟ้มที่มีชื่อว่า RO_FG จะถูกทําเครื่องหมายเป็น READ_ONLY
-
คุณติดตั้งอินสแตนซ์ใหม่ของ Microsoft SQL Server 2012 อินสแตนซ์นี้ของ SQL Server 2012 มีชื่อว่า INST2
-
คุณแยกฐานข้อมูล Test_RO_FG_DB ออกจาก INST1
-
คุณพยายามแนบฐานข้อมูล Test_RO_FG_DB กับ INST2
-
คุณได้รับข้อความแสดงข้อผิดพลาดที่มีลักษณะดังต่อไปนี้:
ไม่สามารถอัปเกรด Msg 3415, ระดับ 16, สถานะ 2, ฐานข้อมูลบรรทัดที่ 1'Test_RO_FG_DB' ได้ เนื่องจากเป็นแบบอ่านอย่างเดียว มีไฟล์แบบอ่านอย่างเดียว หรือผู้ใช้ไม่มีสิทธิ์ในการปรับเปลี่ยนไฟล์บางไฟล์ ทําให้ฐานข้อมูลหรือไฟล์สามารถเขียนได้ และเริ่มการกู้คืนใหม่
-
คุณพยายามแนบฐานข้อมูล Test_RO_FG_DB กับ INST1
ในสถานการณ์สมมตินี้ คุณไม่สามารถแนบฐานข้อมูลกับ INST1 และคุณได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้ในบันทึกข้อผิดพลาด SQL Server:
หมายเหตุ ปัญหานี้เกิดขึ้นเฉพาะเมื่อคุณพยายามแนบฐานข้อมูลที่ประกอบด้วยกลุ่มแฟ้มที่ถูกทําเครื่องหมาย READ_ONLY ปัญหานี้เกิดขึ้นเมื่อคุณพยายามย้ายฐานข้อมูล READ_ONLY ที่มีการทําเครื่องหมายข้อมูลทั้งหมด READ_ONLY
สาเหตุ
ปัญหานี้เกิดขึ้นเนื่องจาก SQL Server 2012 ไม่พบกลุ่มแฟ้มแบบอ่านอย่างเดียวก่อนที่จะเริ่มปรับรุ่นฐานข้อมูล หลังจากการอัปเกรดเริ่มต้น SQL Server 2012 จะเขียนรายการลงในบันทึกธุรกรรม เวอร์ชันก่อนหน้าไม่สามารถอ่านรายการล็อกธุรกรรมใหม่ได้
สถานะ
Microsoft ยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งมีการระบุไว้ในส่วน "นำไปใช้กับ"
การแก้ไข
ข้อมูลโปรแกรมอัปเดตสะสม
SQL Server 2012
การแก้ไขสําหรับปัญหานี้ถูกนําออกใช้ครั้งแรกในการอัปเดตสะสม 2 สําหรับ SQL Server 2012 สําหรับข้อมูลเพิ่มเติมเกี่ยวกับแพคเกจโปรแกรมปรับปรุงแบบสะสมนี้ ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base:
2703275 แพคเกจการอัปเดตสะสม 2 สําหรับ SQL Server 2012Note เนื่องจากรุ่นเป็นแบบสะสม แต่ละการเผยแพร่การแก้ไขใหม่จะประกอบด้วยโปรแกรมแก้ไขด่วนทั้งหมดและการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการเผยแพร่การแก้ไข SQL Server 2012 ก่อนหน้า Microsoft ขอแนะนําให้คุณพิจารณาใช้การแก้ไขรุ่นล่าสุดที่ประกอบด้วยโปรแกรมแก้ไขด่วนนี้ สำหรับข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base:
2692828 SQL Server รุ่น 2012 ที่เผยแพร่หลังจากการเผยแพร่ SQL Server 2012 คุณต้องใช้โปรแกรมแก้ไขด่วน SQL Server 2012 การติดตั้ง SQL Server 2012
วิธีแก้ไขปัญหาชั่วคราว
เมื่อต้องการแก้ไขปัญหานี้ ให้ใช้วิธีใดวิธีหนึ่งต่อไปนี้วิธีที่ 1คืนค่าการสํารองข้อมูลของฐานข้อมูลจาก INST1 บน INST2หมายเหตุ ปัญหาที่อธิบายไว้ในส่วน "อาการ" ไม่เกิดขึ้นใน SQL Server 2012 เมื่อคุณคืนค่าการสํารองข้อมูลจากเวอร์ชันก่อนหน้าวิธีที่ 2ทําการอัปเกรดแบบแทนที่ของ SQL Server รุ่นก่อนหน้าเป็น SQL Server 2012วิธีที่ 3ย้ายฐานข้อมูลที่มีกลุ่มแฟ้มแบบอ่านอย่างเดียวไปยังอินสแตนซ์ของ SQL Server 2012 โดยทําตามขั้นตอนเหล่านี้หมายเหตุ ทําตามขั้นตอนที่ 4 ถึง 11 บนเซิร์ฟเวอร์ที่กําลังทํางานอยู่ SQL Server 2012 ตัวอย่างเช่น ทําตามขั้นตอนที่ 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
หมายเหตุ คุณจะได้รับข้อความแสดงข้อผิดพลาด 3425 ที่กล่าวถึงในส่วน "อาการ"
-
ที่พร้อมท์คําสั่ง ให้เปลี่ยนชื่อไฟล์ฐานข้อมูล คําสั่งตัวอย่างต่อไปนี้แสดงวิธีการดําเนินการนี้:
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
-
ตรวจสอบว่าฐานข้อมูลนั้นออนไลน์อยู่ และสร้างฟังก์ชันการทํางานของ Service 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
หมายเหตุ คุณจะได้รับข้อความแสดงข้อผิดพลาด 3624 ที่กล่าวถึงในส่วน "อาการ" คุณจะได้รับข้อความแสดงข้อผิดพลาด 1813 ด้วย
-
ที่พร้อมท์คําสั่ง ให้เปลี่ยนชื่อไฟล์ฐานข้อมูลบน 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
-
ตรวจสอบว่าฐานข้อมูลนั้นออนไลน์อยู่ และสร้างฟังก์ชันการทํางานของ Service 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 2012 จะเริ่มกระบวนการอัปเกรดก่อนตรวจพบไฟล์แบบอ่านอย่างเดียวในฐานข้อมูล ขั้นตอนการอัปเกรดรวมถึงการเริ่มต้นทรานแซคชันเพื่อล้างบิต "ปิดเครื่องทั้งหมด" ในหน้าการเริ่มต้นระบบของฐานข้อมูล SQL Server เวอร์ชันก่อนหน้าไม่สามารถอ่านเรกคอร์ดการเริ่มต้นธุรกรรมได้ ดังนั้น ฐานข้อมูลจึงไม่สามารถใช้ได้ใน SQL Server เวอร์ชันก่อนหน้า และ SQL Server จะสร้างข้อผิดพลาด 3624การอัปเกรดแบบแทนที่เมื่อฐานข้อมูลถูกทําเครื่องหมายเป็นอ่านอย่างเดียวเมื่อคุณทําการอัปเกรดแบบแทนที่ของอินสแตนซ์ของ SQL Server ที่มีฐานข้อมูลแบบอ่านอย่างเดียวที่มีชื่อว่า Test_RO_DB SQL Server 2012 คุณอาจได้รับข้อความแสดงข้อผิดพลาดที่คล้ายกับข้อความต่อไปนี้ในบันทึกข้อผิดพลาด SQL Server:
เมื่อสิ้นสุดกระบวนการอัพเกรด ฐานข้อมูล Test_RO_DB จะอยู่ในสถานะ RECOVERY_PENDING คุณต้องใช้คําสั่ง ALTER DATABASE เพื่อตั้งค่าฐานข้อมูลเป็น READ_WRITE แล้วใช้คําสั่ง ALTER DATABASE เพื่อตั้งค่าฐานข้อมูลให้ READ_ONLY ซึ่งจะทําให้เอ็นจิน SQL Server อัปเกรดฐานข้อมูลเป็นเวอร์ชันที่ถูกต้องการอัปเกรดแบบแทนที่เมื่อฐานข้อมูลแบบอ่าน/เขียนมีกลุ่มไฟล์ที่ทําเครื่องหมายเป็นแบบอ่านอย่างเดียวเมื่อคุณทําการอัปเกรดแบบแทนที่เป็น SQL Server 2012 คุณอาจได้รับข้อความที่คล้ายกับข้อความต่อไปนี้ในบันทึกข้อผิดพลาด SQL Server ปัญหานี้เกิดขึ้นเมื่ออินสแตนซ์ก่อนหน้าของ SQL Server โฮสต์ฐานข้อมูลการอ่าน/เขียนและประกอบด้วยกลุ่มไฟล์ที่ทําเครื่องหมาย READ_ONLY อย่างไรก็ตาม กระบวนการอัปเกรดจะเสร็จสิ้นตามที่คาดไว้ และฐานข้อมูลเริ่มต้นทางออนไลน์หมายเหตุ ในข้อความแสดงข้อผิดพลาดต่อไปนี้ ฐานข้อมูลจะถูกตั้งชื่อ Test_RO_FG: