Applies ToSQL Server 2012 Enterprise

Síntomas

Imagine la siguiente situación:

  • Instala una instancia de Microsoft SQL Server 2005, Microsoft SQL Server 2008 o Microsoft SQL Server 2008 R2.

  • La instancia de SQL Server se denomina INST1 y hospeda una base de datos que se denomina Test_RO_FG_DB.

  • La base de datos contiene los siguientes grupos de archivos:

    • Principal

    • RO_FG

    • RW_FG

  • El grupo de archivos denominado RO_FG se marca como READ_ONLY.

  • Instala una nueva instancia de Microsoft SQL Server 2012. Esta instancia de SQL Server 2012 se denomina INST2.

  • Separe Test_RO_FG_DB base de datos de INST1.

  • Intenta adjuntar la base de datos de Test_RO_FG_DB a INST2.

  • Recibe un mensaje de error similar al siguiente:

    MSG 3415, LEVEL 16, State 2, line 1Database ' Test_RO_FG_DB ' no se puede actualizar porque es de solo lectura, tiene archivos de solo lectura o el usuario no tiene permisos para modificar algunos de los archivos. Haga que la base de datos o los archivos sean grabable y vuelva a ejecutar la recuperación.

  • Intenta volver a adjuntar el Test_RO_FG_DB base de datos a INST1.

En este escenario, no puede volver a adjuntar la base de datos a INST1. Y recibe el siguiente mensaje de error en el registro de errores de SQL Server:

Nota Este problema solo se produce al intentar adjuntar una base de datos que contiene un grupo de archivos marcado READ_ONLY. Este problema no se produce cuando intenta mover una READ_ONLY base de datos en la que todos los datos están marcados READ_ONLY.

Causa

Este problema se produce porque SQL Server 2012 no detecta el grupo de archivos de solo lectura antes de iniciar la actualización de la base de datos. Una vez iniciada la actualización, SQL Server 2012 escribe entradas en el registro de transacciones. Las versiones anteriores no pueden leer las entradas del registro de transacciones nuevas.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "Se aplica a".

Resolución

Información sobre la actualización acumulativa

SQL Server 2012

La corrección para este problema se publicó por primera vez en la actualización acumulativa 2 para SQL Server 2012. Para obtener más información acerca de este paquete de actualización acumulativa, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

2703275 Paquete de actualización acumulativa 2 para SQL Server 2012Nota Como las compilaciones son acumulativas, cada nueva versión de corrección contiene todas las revisiones y todas las revisiones de seguridad incluidas en la versión anterior de corrección de SQL Server 2012. Microsoft recomienda que considere la posibilidad de aplicar la versión de corrección más reciente que contenga este Hotfix. Si desea obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

2692828 Las compilaciones de SQL Server 2012 que se publicaron después de que se publicó SQL Server 2012 Debe aplicar una revisión de SQL Server 2012 a una instalación de SQL Server 2012.

Solución alternativa

Para solucionar este problema, use uno de los métodos siguientes.Método 1Restaure una copia de seguridad de la base de datos desde INST1 en INST2.Nota El problema que se describe en la sección "síntomas" no se produce en SQL Server 2012 al restaurar una copia de seguridad de una versión anterior.Método 2Realice una actualización local de la versión anterior de SQL Server a SQL Server 2012.Método 3Mueva una base de datos que contiene un grupo de archivos de solo lectura a una instancia de SQL Server 2012. Para ello, siga estos pasos.Nota Realice los pasos 4 a 11 en el servidor que ejecuta SQL Server 2012. Por ejemplo, realice los pasos 4 a 11 en INST2.

  1. En INST1, Desasocie la base de datos. Por ejemplo, separe el Test_RO_FG_DB base de datos.

  2. Mueva los archivos de base de datos al servidor que hospeda la instancia de INST2.

  3. Intente adjuntar la base de datos a INST2. En el siguiente código de ejemplo se muestra cómo hacerlo:

    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 Recibirá el mensaje de error 3425 que se menciona en la sección "síntomas".

  4. En un símbolo del sistema, cambie el nombre de los archivos de base de datos. El siguiente comando de ejemplo muestra cómo hacerlo:

    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. En SQL Server Management Studio, cree una base de datos que tenga el mismo nombre y la misma estructura física que la base de datos que desea adjuntar. En el siguiente código de ejemplo se muestra cómo hacerlo:

    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. Establezca la base de datos en sin conexión. Para ello, ejecute el siguiente comando:

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  7. En un símbolo del sistema, cambie el nombre de los archivos de la nueva base de datos. El siguiente comando de ejemplo muestra cómo hacerlo:

    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. En un símbolo del sistema, cambie el nombre de los archivos de la base de datos que movió en el paso 2. Cambie el nombre de los archivos para que coincidan con la base de datos que creó en el paso 4. El siguiente comando de ejemplo muestra cómo hacerlo:

    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. Establezca la base de datos en conectado. Para ello, ejecute el siguiente comando:

    ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO 
  10. Compruebe que la base de datos está conectada y vuelva a establecer la funcionalidad de Service Broker.

  11. Elimine los archivos de base de datos que no son necesarios. El siguiente comando de ejemplo muestra cómo hacerlo:

    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 4Vuelva a adjuntar una base de datos que contenga un grupo de archivos de solo lectura a la instancia anterior de SQL Server. Para ello, siga estos pasos.Notas

  • La base de datos también contiene las nuevas entradas del registro de transacciones de la actualización fallida.

  • Realice los pasos 3 a 10 en el servidor que ejecuta una versión anterior de SQL Server. Por ejemplo, realice los pasos 3 a 10 en INST1.

  1. Mueva los archivos de base de datos a la instancia de SQL Server que hospeda INST1.

  2. Intente adjuntar la base de datos a INST1. En el siguiente código de ejemplo se muestra cómo hacerlo:

    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 Recibirá el mensaje de error 3624 que se menciona en la sección "síntomas". También recibirá un mensaje de error 1813.

  3. En un símbolo del sistema, cambie el nombre de los archivos de base de datos en INST1. El siguiente comando de ejemplo muestra cómo hacerlo:

    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. En SQL Server Management Studio, cree una base de datos que tenga el mismo nombre y la misma estructura física que la base de datos que desea adjuntar. En el siguiente código de ejemplo se muestra cómo hacerlo:

    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. Establezca la base de datos en sin conexión. Para ello, ejecute el siguiente comando:

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  6. En un símbolo del sistema, cambie el nombre de los archivos de la nueva base de datos. El siguiente comando de ejemplo muestra cómo hacerlo:

    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. En un símbolo del sistema, cambie el nombre de los archivos de la base de datos que movió en el paso 2. Cambie el nombre de los archivos para que coincidan con la base de datos que creó en el paso 4. El siguiente comando de ejemplo muestra cómo hacerlo:

    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. Establezca la base de datos en modo de emergencia y realice una reparación. Para hacer esto, ejecute el comando siguiente.Nota Los registros de transacciones de la base de datos se vuelven a generar durante este paso. Esto puede provocar la pérdida de datos. Por lo tanto, le recomendamos que haga una copia de seguridad de la base de datos antes de realizar este paso.

    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. Compruebe que la base de datos está conectada y vuelva a establecer la funcionalidad de Service Broker.

  10. Elimine los archivos de base de datos que no son necesarios. El siguiente comando de ejemplo muestra cómo hacerlo:

    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ás información

Hay varios pasos que se producen al adjuntar una base de datos a una instancia de SQL Server. Estos pasos incluyen la recuperación de la base de datos y la actualización de los archivos de versiones anteriores de SQL Server. En el problema que se describe en la sección "síntomas", SQL Server 2012 comienza el proceso de actualización antes de que se detecten los archivos de solo lectura de la base de datos. Los pasos de actualización incluyen iniciar una transacción para borrar el bit "apagado limpio" de la página de inicio de la base de datos. Las versiones anteriores de SQL Server no pueden leer el registro de inicio de la transacción. Por lo tanto, la base de datos no se puede usar en versiones anteriores de SQL Server y SQL Server genera el error 3624.Actualizaciones locales cuando una base de datos está marcada como de solo lecturaAl realizar una actualización local de una instancia de SQL Server que contiene una base de datos de solo lectura con el nombre Test_RO_DB a SQL Server 2012, es posible que aparezcan mensajes de error similares a los siguientes en el registro de errores de SQL Server:

Al final del proceso de actualización, la base de datos de Test_RO_DB estará en el estado RECOVERY_PENDING. Debe usar el comando ALTER DATABASE para establecer la base de datos en READ_WRITE. A continuación, use el comando ALTER DATABASE para establecer la base de datos en READ_ONLY. Esto permite que el motor de SQL Server actualice la base de datos a la versión correcta.Actualizaciones locales cuando una base de datos de lectura y escritura contiene grupos de archivos marcados como de solo lecturaAl realizar una actualización local a SQL Server 2012, es posible que reciba mensajes parecidos a los siguientes en el registro de errores de SQL Server. Este problema se produce cuando la instancia anterior de SQL Server hospeda una base de datos de lectura y escritura y contiene grupos de archivos marcados como READ_ONLY. Sin embargo, el proceso de actualización finaliza según lo esperado y la base de datos se inicia en línea.Nota En el siguiente mensaje de error, la base de datos se denomina Test_RO_FG:

¿Necesita más ayuda?

¿Quiere más opciones?

Explore las ventajas de las suscripciones, examine los cursos de aprendizaje, aprenda a proteger su dispositivo y mucho más.

Las comunidades le ayudan a formular y responder preguntas, enviar comentarios y leer a expertos con conocimientos extensos.