Aplica-se A
SQL Server 2012 Enterprise

Sintomas

Considere o seguinte cenário:

  • Instale uma instância do Microsoft SQL Server 2005, do Microsoft SQL Server 2008 ou do Microsoft SQL Server 2008 R2.

  • A instância do SQL Server tem o nome INST1 e aloja uma base de dados com o nome Test_RO_FG_DB.

  • A base de dados contém os seguintes grupos de ficheiros:

    • Principal

    • RO_FG

    • RW_FG

  • O grupo de ficheiros com o nome RO_FG está marcado como READ_ONLY.

  • Instale uma nova instância do Microsoft SQL Server 2012. Esta instância do SQL Server 2012 tem o nome INST2.

  • Desanexa a base de dados Test_RO_FG_DB do INST1.

  • Tenta anexar a base de dados Test_RO_FG_DB ao INST2.

  • Recebe uma mensagem de erro semelhante à seguinte:

    Msg 3415, Level 16, State 2, Line 1Database 'Test_RO_FG_DB' não podem ser atualizados porque é só de leitura, tem ficheiros só de leitura ou o utilizador não tem permissões para modificar alguns dos ficheiros. Torne a base de dados ou os ficheiros graváveis e volte a executar a recuperação.

  • Tenta voltar a anexar a base de dados Test_RO_FG_DB ao INST1.

Neste cenário, não pode voltar a anexar a base de dados ao INST1. Além disso, recebe a seguinte mensagem de erro no registo de erros SQL Server:

Nota Este problema só ocorre quando tenta anexar uma base de dados que contém um grupo de ficheiros marcado READ_ONLY. Este problema não ocorre quando tenta mover uma base de dados READ_ONLY na qual todos os dados são marcados READ_ONLY.

Causa

Este problema ocorre porque SQL Server 2012 não deteta o grupo de ficheiros só de leitura antes de começar a atualizar a base de dados. Após o início da atualização, SQL Server 2012 escreve entradas no registo de transações. As versões anteriores não conseguem ler as novas entradas do registo de transações.

Estado

A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".

Resolução

Informações de atualização cumulativa

SQL Server 2012

A correção para este problema foi lançada pela primeira vez na Atualização Cumulativa 2 para SQL Server 2012. Para obter mais informações sobre este pacote de atualização cumulativa, clique no seguinte número de artigo para ver o artigo na Base de Dados de Conhecimento Microsoft:

2703275 Pacote de atualização cumulativa 2 para SQL Server 2012Note Uma vez que as compilações são cumulativas, cada nova versão de correção contém todas as correções e todas as correções de segurança incluídas na versão de correção anterior do SQL Server 2012. A Microsoft recomenda que considere aplicar a versão de correção mais recente que contém esta correção. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:

2692828 As compilações SQL Server 2012 que foram lançadas após SQL Server lançamento de 2012 Tem de aplicar uma correção SQL Server 2012 a uma instalação do SQL Server 2012.

Solução

Para contornar este problema, utilize um dos seguintes métodos.Método 1Restaurar uma cópia de segurança da base de dados a partir do INST1 no INST2.Nota O problema descrito na secção "Sintomas" não ocorre no SQL Server 2012 quando restaura uma cópia de segurança a partir de uma versão anterior.Método 2Executar uma atualização no local da versão anterior do SQL Server para SQL Server 2012.Método 3Mova uma base de dados que contenha um grupo de ficheiros só de leitura para uma instância do SQL Server 2012. Para tal, siga estes passos.Nota Execute os passos 4 a 11 no servidor que está a executar SQL Server 2012. Por exemplo, execute os passos 4 a 11 no INST2.

  1. No INST1, desanexe a base de dados. Por exemplo, desanexe a base de dados Test_RO_FG_DB.

  2. Mova os ficheiros da base de dados para o servidor que aloja a instância INST2.

  3. Tente anexar a base de dados ao INST2. O código de exemplo seguinte mostra como fazê-lo:

    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

    Nota Receberá a mensagem de erro 3425 mencionada na secção "Sintomas".

  4. Numa linha de comandos, mude o nome dos ficheiros da base de dados. O comando de exemplo seguinte mostra como fazê-lo:

    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. No SQL Server Management Studio, crie uma base de dados com o mesmo nome e estrutura física que a base de dados que pretende anexar. O código de exemplo seguinte mostra como fazê-lo:

    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. Defina a base de dados como offline. Para tal, execute o seguinte comando:

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  7. Numa linha de comandos, mude o nome dos ficheiros na nova base de dados. O comando de exemplo seguinte mostra como fazê-lo:

    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. Numa linha de comandos, mude o nome dos ficheiros na base de dados que moveu no passo 2. Mude o nome dos ficheiros para corresponderem à base de dados que criou no passo 4. O comando de exemplo seguinte mostra como fazê-lo:

    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. Defina a base de dados como ONLINE. Para tal, execute o seguinte comando:

    ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO 
  10. Verifique se a base de dados está online e volte a publicar a funcionalidade Service Broker.

  11. Elimine os ficheiros da base de dados que não são necessários. O comando de exemplo seguinte mostra como fazê-lo:

    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 

Método 4Volte a anexar uma base de dados que contenha um grupo de ficheiros só de leitura à instância anterior do SQL Server. Para tal, siga estes passos.Notas

  • A base de dados também contém as novas entradas do registo de transações da atualização falhada.

  • Execute os passos 3 a 10 no servidor que está a executar uma versão anterior do SQL Server. Por exemplo, execute os passos 3 a 10 no INST1.

  1. Mova os ficheiros da base de dados para a instância do SQL Server que aloja o INST1.

  2. Tente anexar a base de dados ao INST1. O código de exemplo seguinte mostra como fazê-lo:

    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

    Nota Receberá a mensagem de erro 3624 mencionada na secção "Sintomas". Também receberá uma mensagem de erro 1813.

  3. Numa linha de comandos, mude o nome dos ficheiros da base de dados no INST1. O comando de exemplo seguinte mostra como fazê-lo:

    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. No SQL Server Management Studio, crie uma base de dados com o mesmo nome e estrutura física que a base de dados que pretende anexar. O código de exemplo seguinte mostra como fazê-lo:

    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. Defina a base de dados como offline. Para tal, execute o seguinte comando:

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  6. Numa linha de comandos, mude o nome dos ficheiros na nova base de dados. O comando de exemplo seguinte mostra como fazê-lo:

    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. Numa linha de comandos, mude o nome dos ficheiros na base de dados que moveu no passo 2. Mude o nome dos ficheiros para corresponderem à base de dados que criou no passo 4. O comando de exemplo seguinte mostra como fazê-lo:

    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. Defina a base de dados como MODO DE EMERGÊNCIA e efetue uma reparação. Para tal, execute o seguinte comando.Nota Os registos de transações da base de dados são reconstruídos durante este passo. Isto pode resultar na perda de dados. Por conseguinte, recomendamos que faça uma cópia de segurança da base de dados antes de efetuar este passo.

    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. Verifique se a base de dados está online e volte a publicar a funcionalidade Service Broker.

  10. Elimine os ficheiros da base de dados que não são necessários. O comando de exemplo seguinte mostra como fazê-lo:

    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 

Mais Informações

Existem vários passos que ocorrem quando uma base de dados está anexada a uma instância de SQL Server. Estes passos incluem recuperar a base de dados e atualizar os ficheiros a partir de versões anteriores do SQL Server. No problema descrito na secção "Sintomas", SQL Server 2012 inicia o processo de atualização antes de os ficheiros só de leitura na base de dados serem detetados. Os passos de atualização incluem iniciar uma transação para limpar o bit "encerrar corretamente" na página de arranque da base de dados. As versões anteriores do SQL Server não conseguem ler o registo de transação inicial. Por conseguinte, a base de dados não é utilizável em versões anteriores do SQL Server e SQL Server gera o erro 3624.Atualizações no local quando uma base de dados é marcada como sóde leitura Quando efetua uma atualização no local de uma instância de SQL Server que contém uma base de dados só de leitura com o nome Test_RO_DB para SQL Server 2012, poderá receber mensagens de erro semelhantes às seguintes no registo de erros SQL Server:

No final do processo de atualização, a base de dados Test_RO_DB estará no estado RECOVERY_PENDING. Tem de utilizar o comando ALTER DATABASE para definir a base de dados como READ_WRITE. Em seguida, utilize o comando ALTER DATABASE para definir a base de dados como READ_ONLY. Isto permite que o motor de SQL Server atualize a base de dados para a versão correta.Atualizações no local quando uma base de dados de leitura/escrita contém grupos de ficheiros marcados como sóde leitura Quando efetua uma atualização no local para o SQL Server 2012, poderá receber mensagens semelhantes às seguintes no registo de erros SQL Server. Este problema ocorre quando a instância anterior do SQL Server aloja uma base de dados de leitura/escrita e contém grupos de ficheiros marcados READ_ONLY. No entanto, o processo de atualização é concluído conforme esperado e a base de dados é iniciada online.Nota Na seguinte mensagem de erro, a base de dados tem o nome Test_RO_FG:

Precisa de mais ajuda?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.