Síntomas
Imagine la siguiente situación:
-
Puede instalar una instancia de Microsoft SQL Server 2005, de Microsoft SQL Server 2008 o de Microsoft SQL Server 2008 R2.
-
La instancia de SQL Server se denomina INST1 y hospeda una base de datos denominada 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.
-
Instale una nueva instancia de Microsoft SQL Server 2012. Esta instancia de SQL Server 2012 se denomina INST2.
-
Desasocia la base de datos de Test_RO_FG_DB 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, Nivel 16, Estado 2, Línea 1Base de datos '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 se puedan escribir y vuelva a ejecutar la recuperación.
-
Intente volver a conectar la base de datos de Test_RO_FG_DB a INST1.
En este escenario, no puede volver a conectar 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 al intentar mover una base de datos de READ_ONLY en la que todos los datos se marcan como 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 nuevas entradas del registro de transacciones.
Estado
Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "Se aplica a".
Solució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 sobre 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 2012Note Como las compilaciones son acumulativas, cada nueva versión de corrección contiene todas las revisiones y todas las correcciones de seguridad que se incluyeron con la versión anterior de la corrección de SQL Server 2012. Microsoft recomienda que considere la posibilidad de aplicar la corrección más reciente que contiene esta revisión. 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 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 1Restaurar una copia de seguridad de la base de datos a partir de INST1 en INST2.Nota El problema que se describe en la sección "Síntomas" no ocurre en SQL Server 2012 al restaurar una copia de seguridad desde 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 contenga un grupo de archivos de solo lectura a una instancia de SQL Server 2012. Para ello, siga estos pasos.Nota Realice los pasos del 4 al 11 en el servidor que ejecuta SQL Server 2012. Por ejemplo, realice los pasos 4 a 11 en INST2.
-
En INST1, desasocia la base de datos. Por ejemplo, desasocia la base de datos de Test_RO_FG_DB.
-
Mueva los archivos de base de datos al servidor que hospeda la instancia INST2.
-
Intente adjuntar la base de datos a INST2. El siguiente código de ejemplo 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".
-
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
-
En SQL Server Management Studio, cree una base de datos que tenga el mismo nombre y estructura física que la base de datos que desea adjuntar. El siguiente código de ejemplo 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
-
Establezca la base de datos como sin conexión. Para ello, ejecute el siguiente comando:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
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
-
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
-
Establezca la base de datos en EN LÍNEA. Para ello, ejecute el siguiente comando:
ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO
-
Verifique que la base de datos esté en línea, y restablezca la funcionalidad del Service Broker.
-
Elimine los archivos de base de datos que no sean 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 conectar una base de datos que contiene 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 con errores.
-
Realice los pasos del 3 al 10 en el servidor que ejecuta una versión anterior de SQL Server. Por ejemplo, realice los pasos 3 a 10 en INST1.
-
Mueva los archivos de base de datos a la instancia de SQL Server que hospeda INST1.
-
Intente adjuntar la base de datos a INST1. El siguiente código de ejemplo 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ás un mensaje de error 1813.
-
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
-
En SQL Server Management Studio, cree una base de datos que tenga el mismo nombre y estructura física que la base de datos que desea adjuntar. El siguiente código de ejemplo 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
-
Establezca la base de datos como sin conexión. Para ello, ejecute el siguiente comando:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
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
-
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
-
Establezca la base de datos en modo 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
-
Verifique que la base de datos esté en línea, y restablezca la funcionalidad del Service Broker.
-
Elimine los archivos de base de datos que no sean 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 cuando se adjunta 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 en la base de datos. Los pasos de actualización incluyen iniciar una transacción para borrar el bit "apagar limpiamente" en la página de arranque de la base de datos. Las versiones anteriores de SQL Server no pueden leer el registro de transacción inicial. Por lo tanto, la base de datos no es utilizable en versiones anteriores de SQL Server y SQL Server genera el error 3624.Actualizaciones locales cuando una base de datos se marca como de sololectura Al realizar una actualización local de una instancia de SQL Server que contiene una base de datos de solo lectura denominada Test_RO_DB a SQL Server 2012, es posible que reciba 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 estado RECOVERY_PENDING. Debe usar el comando ALTER DATABASE para establecer la base de datos en READ_WRITE. Después, use el comando ALTER DATABASE para establecer la base de datos en READ_ONLY. Esto permite al motor de SQL Server actualizar 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 sololectura Al realizar una actualización local a SQL Server 2012, es posible que reciba mensajes similares 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 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: