Se aplică la
SQL Server 2012 Enterprise

Simptome

Luați în considerare următorul scenariu:

  • Instalați o instanță de Microsoft SQL Server 2005, de Microsoft SQL Server 2008 sau de Microsoft SQL Server 2008 R2.

  • Instanța SQL Server se numește INST1 și găzduiește o bază de date denumită Test_RO_FG_DB.

  • Baza de date conține următoarele grupuri de fișiere:

    • Primar

    • RO_FG

    • RW_FG

  • Grupul de fișiere denumit RO_FG este marcat ca READ_ONLY.

  • Instalați o instanță nouă de Microsoft SQL Server 2012. Această instanță de SQL Server 2012 se numește INST2.

  • Detașați baza de date Test_RO_FG_DB din INST1.

  • Încercați să atașați baza de date Test_RO_FG_DB la INST2.

  • Primiți un mesaj de eroare care seamănă cu următorul:

    Nu se poate face upgrade pentru Msg 3415, Nivel 16, Starea 2, Baza de date linia 1"Test_RO_FG_DB", deoarece este doar în citire, are fișiere doar în citire sau utilizatorul nu are permisiunea de a modifica unele dintre fișiere. Faceți baza de date sau fișierele ușor de scris și rulați din nou recuperarea.

  • Încercați să reatașați baza de date Test_RO_FG_DB la INST1.

În acest scenariu, nu puteți reatașați baza de date la INST1. Și primiți următorul mesaj de eroare în jurnalul de erori SQL Server:

Notă Această problemă apare doar atunci când încercați să atașați o bază de date care conține un grup de fișiere marcat READ_ONLY. Această problemă nu apare atunci când încercați să mutați o bază de date READ_ONLY în care toate datele sunt marcate READ_ONLY.

Cauză

Această problemă apare deoarece SQL Server 2012 nu detectează grupul de fișiere doar în citire înainte de a începe să facă upgrade bazei de date. După ce a început upgrade-ul, SQL Server 2012 scrie intrări în jurnalul de tranzacții. Versiunile anterioare nu pot citi intrările din jurnalul de tranzacții nou.

Stare

Microsoft a confirmat că aceasta este o problemă în produsele Microsoft enumerate în secțiunea „Se aplică la”.

Rezolvare

Informații despre actualizarea cumulativă

SQL Server 2012

Remedierea pentru această problemă a fost lansată pentru prima dată în actualizarea cumulativă 2 pentru SQL Server 2012. Pentru mai multe informații despre acest pachet de actualizare cumulativă, faceți clic pe următorul număr de articol pentru a vizualiza articolul în Baza de cunoștințe Microsoft:

2703275 Pachetul de actualizare cumulativă 2 pentru SQL Server 2012Note Deoarece compilările sunt cumulative, fiecare ediție nouă de remediere conține toate remedierile rapide și toate remedierile de securitate care au fost incluse în remedierea anterioară a SQL Server 2012. Microsoft recomandă să luați în considerare aplicarea celei mai recente remedieri care conține această remediere rapidă. Pentru mai multe informații, faceți clic pe următorul număr de articol pentru a-l vedea în Baza de cunoștințe Microsoft:

2692828 Compilările SQL Server 2012 care au fost lansate după lansarea SQL Server 2012 Trebuie să aplicați o remediere rapidă SQL Server 2012 la o instalare de SQL Server 2012.

Soluție de evitare

Pentru a rezolva această problemă, utilizați una dintre următoarele metode.Metoda 1Restaurați o copie backup a bazei de date din INST1 pe INST2.Notă Problema descrisă în secțiunea "Simptome" nu are loc în SQL Server 2012 atunci când restaurați o copie backup dintr-o versiune anterioară.Metoda 2Efectuați un upgrade local al versiunii anterioare de SQL Server la SQL Server 2012.Metoda 3Mutați o bază de date care conține un grup de fișiere doar în citire într-o instanță de SQL Server 2012. Pentru aceasta, urmați pașii de mai jos.Notă Efectuați pașii 4-11 pe serverul care rulează SQL Server 2012. De exemplu, efectuați pașii de la 4 la 11 în INST2.

  1. Pe INST1, detașați baza de date. De exemplu, detașați baza de date Test_RO_FG_DB.

  2. Mutați fișierele bazei de date pe serverul care găzduiește instanța INST2.

  3. Încercați să atașați baza de date la INST2. Următorul exemplu de cod vă arată cum să procedați:

    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

    Notă Veți primi mesajul de eroare 3425 care este menționat în secțiunea "Simptome".

  4. Într-o linie de comandă, redenumiți fișierele bazei de date. Următoarea comandă eșantion vă arată cum să procedați:

    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. În SQL Server Management Studio, creați o bază de date care are același nume și aceeași structură fizică ca baza de date pe care doriți să o atașați. Următorul exemplu de cod vă arată cum să procedați:

    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. Setați baza de date la offline. Pentru a face acest lucru, rulați următoarea comandă:

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  7. Într-o linie de comandă, redenumiți fișierele din noua bază de date. Următoarea comandă eșantion vă arată cum să procedați:

    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. Într-o linie de comandă, redenumiți fișierele din baza de date pe care le-ați mutat la pasul 2. Redenumiți fișierele pentru a se potrivi cu baza de date creată la pasul 4. Următoarea comandă eșantion vă arată cum să procedați:

    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. Setați baza de date la ONLINE. Pentru a face acest lucru, rulați următoarea comandă:

    ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO 
  10. Verificați dacă baza de date este online și restabiliți funcționalitatea Service Broker.

  11. Ștergeți fișierele bază de date care nu sunt necesare. Următoarea comandă eșantion vă arată cum să procedați:

    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 

Metoda 4Reatașați o bază de date care conține un grup de fișiere doar în citire la instanța anterioară de SQL Server. Pentru aceasta, urmați pașii de mai jos.Note

  • Baza de date conține, de asemenea, noile intrări jurnal de tranzacții din upgrade-ul nereușit.

  • Efectuați pașii 3-10 pe serverul care rulează o versiune anterioară de SQL Server. De exemplu, efectuați pașii de la 3 la 10 în INST1.

  1. Mutați fișierele bazei de date în instanța de SQL Server care găzduiește INST1.

  2. Încercați să atașați baza de date la INST1. Următorul exemplu de cod vă arată cum să procedați:

    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

    Notă Veți primi mesajul de eroare 3624 care este menționat în secțiunea "Simptome". De asemenea, veți primi un mesaj de eroare 1813.

  3. Într-o linie de comandă, redenumiți fișierele bazei de date în INST1. Următoarea comandă eșantion vă arată cum să procedați:

    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. În SQL Server Management Studio, creați o bază de date care are același nume și aceeași structură fizică ca baza de date pe care doriți să o atașați. Următorul exemplu de cod vă arată cum să procedați:

    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. Setați baza de date la offline. Pentru a face acest lucru, rulați următoarea comandă:

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  6. Într-o linie de comandă, redenumiți fișierele din noua bază de date. Următoarea comandă eșantion vă arată cum să procedați:

    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. Într-o linie de comandă, redenumiți fișierele din baza de date pe care le-ați mutat la pasul 2. Redenumiți fișierele pentru a se potrivi cu baza de date creată la pasul 4. Următoarea comandă eșantion vă arată cum să procedați:

    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. Setați baza de date la modul URGENȚĂ și efectuați o reparare. Pentru a face acest lucru, rulați următoarea comandă.Notă Jurnalele de tranzacții ale bazei de date sunt reconstruit în timpul acestui pas. Acest lucru poate duce la pierderi de date. Prin urmare, vă recomandăm să faceți backup bazei de date înainte de a efectua acest pas.

    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. Verificați dacă baza de date este online și restabiliți funcționalitatea Service Broker.

  10. Ștergeți fișierele bază de date care nu sunt necesare. Următoarea comandă eșantion vă arată cum să procedați:

    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 

Mai multe informații

Există mai mulți pași care apar atunci când o bază de date este atașată la o instanță de SQL Server. Acești pași includ recuperarea bazei de date și upgrade-ul fișierelor din versiunile anterioare de SQL Server. În problema descrisă în secțiunea "Simptome", SQL Server 2012 începe procesul de upgrade înainte să fie detectate fișierele doar în citire din baza de date. Pașii de upgrade includ începerea unei tranzacții pentru a goli bitul "închidere curată" din pagina de pornire a bazei de date. Versiunile anterioare de SQL Server nu pot citi înregistrarea tranzacției de început. Prin urmare, baza de date nu se poate utiliza în versiunile anterioare de SQL Server și SQL Server generează eroarea 3624.Upgrade-uri pe loc atunci când o bază de date este marcată ca doarîn citire Atunci când efectuați un upgrade local al unei instanțe de SQL Server care conține o bază de date doar în citire denumită Test_RO_DB pentru a SQL Server 2012, este posibil să primiți mesaje de eroare care seamănă cu următoarele în jurnalul de erori SQL Server:

La sfârșitul procesului de upgrade, baza de date Test_RO_DB se va află în starea RECOVERY_PENDING. Trebuie să utilizați comanda ALTER DATABASE pentru a seta baza de date să READ_WRITE. Apoi utilizați comanda ALTER DATABASE pentru a seta baza de date să READ_ONLY. Acest lucru permite motorului SQL Server să facă upgrade bazei de date la versiunea corectă.Upgrade-uri pe loc atunci când o bază de date în citire/scriere conține grupuri de fișiere marcate ca doarîn citire Atunci când efectuați un upgrade local la SQL Server 2012, este posibil să primiți mesaje care seamănă cu următoarele în jurnalul de erori SQL Server. Această problemă apare atunci când instanța anterioară de SQL Server găzduiește o bază de date în citire/scriere și conține grupuri de fișiere marcate READ_ONLY. Cu toate acestea, procesul de upgrade se termină așa cum vă așteptați, iar baza de date începe online.Notă În următorul mesaj de eroare, baza de date este denumită Test_RO_FG:

Aveți nevoie de ajutor suplimentar?

Doriți mai multe opțiuni?

Explorați avantajele abonamentului, navigați prin cursurile de instruire, aflați cum să vă securizați dispozitivul și multe altele.