Berlaku Untuk
SQL Server 2012 Enterprise

Gejala

Pertimbangkan skenario berikut:

  • Anda menginstal instans Microsoft SQL Server 2005, Microsoft SQL Server 2008, atau Microsoft SQL Server 2008 R2.

  • Contoh SQL Server dinamai INST1 dan menghosting database yang dinamai Test_RO_FG_DB.

  • Database berisi grup file berikut ini:

    • Utama

    • RO_FG

    • RW_FG

  • Grup file yang dinamai RO_FG ditandai sebagai READ_ONLY.

  • Anda menginstal instans baru Microsoft SQL Server 2012. Contoh SQL Server 2012 ini bernama INST2.

  • Anda menghapus database Test_RO_FG_DB dari INST1.

  • Anda mencoba melampirkan database Test_RO_FG_DB ke INST2.

  • Anda menerima pesan kesalahan yang menyerupan berikut ini:

    Msg 3415, Tingkat 16, Negara Bagian 2, Database Baris 1'Test_RO_FG_DB' tidak dapat dimutakhirkan karena bersifat baca-saja, memiliki file baca-saja atau pengguna tidak memiliki izin untuk mengubah beberapa file. Buat database atau file dapat ditulis, dan menjalankan ulang pemulihan.

  • Anda mencoba untuk memasukkan kembali database Test_RO_FG_DB ke INST1.

Dalam skenario ini, Anda tidak dapat memasukkan kembali database ke INST1. Dan, Anda menerima pesan kesalahan berikut dalam log kesalahan SQL Server:

Catatan Masalah ini hanya terjadi ketika Anda mencoba melampirkan database yang berisi grup file yang ditandai READ_ONLY. Masalah ini tidak terjadi ketika Anda mencoba memindahkan database READ_ONLY tempat semua data ditandai READ_ONLY.

Penyebab

Masalah ini terjadi karena SQL Server 2012 tidak mendeteksi grup file baca-saja sebelum mulai memutakhirkan database. Setelah pemutakhiran dimulai, SQL Server 2012 menulis entri ke log transaksi. Versi yang lebih lama tidak dapat membaca entri log transaksi baru.

Status

Microsoft telah mengonfirmasi bahwa ini adalah masalah pada produk Microsoft yang tercantum di bagian "Berlaku untuk".

Resolusi

Informasi pembaruan kumulatif

SQL Server 2012

Perbaikan untuk masalah ini pertama kali dirilis dalam Pembaruan Kumulatif 2 untuk SQL Server 2012. Untuk informasi selengkapnya tentang paket pembaruan kumulatif ini, klik nomor artikel berikut ini untuk menampilkan artikel di Pangkalan Pengetahuan Microsoft:

2703275 Pembaruan kumulatif paket 2 untuk SQL Server 2012Note Karena build bersifat kumulatif, setiap rilis perbaikan baru berisi semua hotfix dan semua perbaikan keamanan yang disertakan dengan rilis perbaikan SQL Server 2012 sebelumnya. Microsoft menyarankan agar Anda mempertimbangkan untuk menerapkan rilis perbaikan terbaru yang berisi hotfix ini. Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

2692828 Build SQL Server 2012 yang dirilis setelah SQL Server 2012 dirilis, Anda harus menerapkan hotfix SQL Server 2012 ke penginstalan SQL Server 2012.

Penyelesaian Masalah

Untuk mengatasi masalah ini, gunakan salah satu metode berikut ini.Metode 1Memulihkan cadangan database dari INST1 di INST2.Catatan Masalah yang dijelaskan di bagian "Gejala" tidak terjadi di SQL Server 2012 saat Anda memulihkan cadangan dari versi yang lebih lama.Metode 2Melakukan pemutakhiran di tempat dari versi SQL Server yang lebih lama ke SQL Server 2012.Metode 3Memindahkan database yang berisi grup file baca-saja ke instans SQL Server 2012. Untuk melakukannya, ikuti langkah-langkah berikut.Catatan Lakukan langkah 4 sampai 11 di server yang menjalankan SQL Server 2012. Misalnya, lakukan langkah 4 sampai 11 di INST2.

  1. Di INST1, lepas database. Misalnya, lepaskan database Test_RO_FG_DB.

  2. Pindahkan file database ke server yang menjadi host instans INST2.

  3. Cobalah melampirkan database ke INST2. Kode sampel berikut ini memperlihatkan cara melakukan hal ini:

    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

    Catatan Anda akan menerima pesan kesalahan 3425 yang disebutkan di bagian "Gejala".

  4. Di prompt perintah, ganti nama file database. Contoh perintah berikut ini memperlihatkan cara melakukan hal ini:

    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 
  5. Di SQL Server Management Studio, buat database yang memiliki nama dan struktur fisik yang sama dengan database yang ingin Anda lampirkan. Kode sampel berikut ini memperlihatkan cara melakukan hal ini:

    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
  6. Atur database ke offline. Untuk melakukan ini, jalankan perintah berikut:

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  7. Di prompt perintah, ganti nama file dalam database baru. Contoh perintah berikut ini memperlihatkan cara melakukan hal ini:

    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 
  8. Di prompt perintah, ganti nama file dalam database yang Anda pindahkan di langkah 2. Ganti nama file agar sesuai dengan database yang Anda buat di langkah 4. Contoh perintah berikut ini memperlihatkan cara melakukan hal ini:

    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 
  9. Atur database ke ONLINE. Untuk melakukan ini, jalankan perintah berikut:

    ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO 
  10. Verifikasi bahwa database online, dan gunakan kembali fungsiOnalitas Service Broker.

  11. Hapus file database yang tidak diperlukan. Contoh perintah berikut ini memperlihatkan cara melakukan hal ini:

    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 

Metode 4Pasang ulang database yang berisi grup file baca-saja ke contoh SQL Server yang lebih lama. Untuk melakukannya, ikuti langkah-langkah berikut.Catatan

  • Database juga berisi entri log transaksi baru dari pemutakhiran yang gagal.

  • Lakukan langkah 3 sampai 10 di server yang menjalankan versi SQL Server yang lebih lama. Misalnya, lakukan langkah 3 sampai 10 di INST1.

  1. Pindahkan file database ke contoh SQL Server yang menghosting INST1.

  2. Cobalah melampirkan database ke INST1. Kode sampel berikut ini memperlihatkan cara melakukan hal ini:

    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

    Catatan Anda akan menerima pesan kesalahan 3624 yang disebutkan di bagian "Gejala". Anda juga akan menerima pesan kesalahan 1813.

  3. Di prompt perintah, ganti nama file database di INST1. Contoh perintah berikut ini memperlihatkan cara melakukan hal ini:

    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 
  4. Di SQL Server Management Studio, buat database yang memiliki nama dan struktur fisik yang sama dengan database yang ingin Anda lampirkan. Kode sampel berikut ini memperlihatkan cara melakukan hal ini:

    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
  5. Atur database ke offline. Untuk melakukan ini, jalankan perintah berikut:

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  6. Di prompt perintah, ganti nama file dalam database baru. Contoh perintah berikut ini memperlihatkan cara melakukan hal ini:

    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 
  7. Di prompt perintah, ganti nama file dalam database yang Anda pindahkan di langkah 2. Ganti nama file agar sesuai dengan database yang Anda buat di langkah 4. Contoh perintah berikut ini memperlihatkan cara melakukan hal ini:

    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 
  8. Atur database ke mode DARURAT, dan lakukan perbaikan. Untuk melakukan ini, jalankan perintah berikut ini.Catatan Log transaksi database dibangun kembali selama langkah ini. Hal ini dapat mengakibatkan hilangnya data. Oleh karena itu, kami menyarankan agar Anda mencadangkan database sebelum anda melakukan langkah ini.

    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 
  9. Verifikasi bahwa database online, dan gunakan kembali fungsiOnalitas Service Broker.

  10. Hapus file database yang tidak diperlukan. Contoh perintah berikut ini memperlihatkan cara melakukan hal ini:

    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 

Informasi Selengkapnya

Ada beberapa langkah yang terjadi ketika database dilampirkan ke contoh SQL Server. Langkah-langkah ini termasuk memulihkan database dan memutakhirkan file dari versi SQL Server yang lebih lama. Dalam masalah yang dijelaskan di bagian "Gejala", SQL Server 2012 memulai proses pemutakhiran sebelum file baca-saja dalam database terdeteksi. Langkah-langkah pemutakhiran termasuk memulai transaksi untuk menghapus bit "tutup dengan bersih" di halaman boot database. Versi SQL Server yang lebih lama tidak dapat membaca catatan mulai transaksi. Oleh karena itu, database tidak dapat digunakan dalam versi SQL Server yang lebih lama, dan SQL Server menghasilkan kesalahan 3624.Pemutakhiran di tempat saat database ditandai sebagai baca-sajaSaat Anda melakukan pemutakhiran di tempat contoh SQL Server yang berisi database baca-saja yang bernama Test_RO_DB ke SQL Server 2012, Anda mungkin menerima pesan kesalahan yang menyerupai berikut ini dalam log kesalahan SQL Server:

Di akhir proses pemutakhiran, database Test_RO_DB akan berada dalam status RECOVERY_PENDING. Anda harus menggunakan perintah ALTER DATABASE untuk mengatur database ke READ_WRITE. Lalu gunakan perintah ALTER DATABASE untuk mengatur database ke READ_ONLY. Ini memungkinkan mesin SQL Server memutakhirkan database ke versi yang benar.Pemutakhiran di tempat saat database baca/tulis berisi grup file yang ditandai sebagai baca-sajaSaat Anda melakukan pemutakhiran di tempat ke SQL Server 2012, Anda mungkin menerima pesan yang terlihat seperti berikut ini dalam log kesalahan SQL Server. Masalah ini terjadi ketika contoh SQL Server sebelumnya menghosting database baca/tulis dan berisi grup file yang ditandai READ_ONLY. Namun, proses pemutakhiran selesai seperti yang diharapkan, dan database dimulai secara online.Catatan Dalam pesan kesalahan berikut ini, database dinamai Test_RO_FG:

Perlu bantuan lainnya?

Ingin opsi lainnya?

Jelajahi manfaat langganan, telusuri kursus pelatihan, pelajari cara mengamankan perangkat Anda, dan banyak lagi.