¿Cómo adjunto una base de datos en SQL Server?


32

Algunas preguntas comunes relacionadas con la conexión de bases de datos en SQL Server:

  • ¿Qué significa adjuntar o separar una base de datos?
  • ¿Cómo separo una base de datos?
  • ¿Cómo adjunto una base de datos?
    • ¿Qué significa adjuntar y reconstruir el registro?
  • ¿Cómo lo hago en SQL Server Express?
  • ¿Cuándo podría considerar separar y adjuntar?
  • ¿Hay algún riesgo o advertencia?
  • ¿Qué hay de adjuntar entre versiones y ediciones de SQL Server? (¿Estándar para empresa? 2000 a 2008? 2012 a 2008?)

Respuestas:


33

¿Qué es separar o adjuntar y cómo funcionan?

Comenzaremos con la separación. Cuando desconecta una base de datos en SQL Server, desconecta la base de datos y la elimina de la instancia de SQL Server de la que la desconecta. Los datos de las bases de datos y los archivos de registro permanecen intactos y se dejan en un estado coherente para que luego pueda adjuntar la base de datos en un momento posterior o en otra instancia de SQL Server. Adjuntar conecta los datos y los archivos de registro de una base de datos que se ha separado correctamente (o que se ha copiado de una instancia de SQL Server cerrada) a una instancia de SQL Server y pone la base de datos en línea.

¿Cómo separo una base de datos?

Puede hacer esto en T-SQL o desde la GUI de SQL Server Management Studio.

En la GUI, hace clic derecho en la base de datos que desea separar, selecciona All Tasksy hace clic en Detach. A partir de ahí obtendrá el diálogo de separación. Puede elegir soltar las conexiones primero para desconectar por la fuerza cualquier conexión activa y deshacer el trabajo que estaban en medio de la ejecución. También puede optar por actualizar las estadísticas antes de la separación. Separar a través de - Elija Separar ...

En T-SQL:

-- You don't want to be in the database you are trying to detach
USE Master
GO

-- Optional step to drop all active connections and roll back their work
ALTER DATABASE DatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

-- Perform the detach
EXEC sp_detach_db 'DatabaseName'
GO

Para el procedimiento almacenado del sistema sp_detach_db, hay dos parámetros que puede pasar opcionalmente:

  • @skipchecks- la entrada aceptable es 'True'o 'False'si 'True', SQL Server actualizará las estadísticas antes de desconectar. Si ' False', no lo hará. Si no especifica nada aquí, las estadísticas se actualizarán en SQL Server 2005 o posterior.
    • @keepfulltextindexfile- El valor predeterminado aquí es 'True': si se establece en verdadero, los metadatos del índice de texto completo no se eliminarán durante la separación.

Para ver mucho más sobre la separación y algunos detalles más sobre los riesgos que destaco a continuación, el artículo de Books Onlinesp_detach_db es un buen lugar para comenzar.

¿Cómo adjunto una base de datos?

También puede hacerlo en T-SQL o desde la GUI de SQL Server Management Studio.

( NOTA: Si tiene los datos y los archivos de registro de una base de datos que no se desconectó correctamente, su adjunto puede no funcionar. Cuando se produce la desconexión, la base de datos se desconecta y los archivos de registro y datos se colocan en un estado coherente. Esto también sucede cuando un servicio se cierra limpiamente ) .

En la GUI, haga clic derecho en la Databasescarpeta de nivel superior para su instancia y seleccione Attach. En el siguiente cuadro de diálogo, debe seleccionar el archivo de datos primario (.MDF) de la base de datos que desea adjuntar y asegurarse de que tiene los otros archivos seleccionados y sus ubicaciones apropiadas especificadas, y haga clic en Aceptar, adjuntando su base de datos.

En T-SQL, la mejor manera de hacerlo en SQL Server 2005 y hacia adelante es a través del CREATE DATABASEcomando. Este es el método que se admite más allá de SQL Server 2012. Si desea ver cómo usarlo sp_attach_db, puede verlo en los libros de artículos en línea para [sp_attach_db][3]o[sp_attach_single_file_db][4]

Cuando tenga su archivo de registro y archivos de datos disponibles y sean consistentes, este es el enfoque T-SQL:

- Usar Create Database y la cláusula FOR ATTACH para adjuntar

CREATE DATABASE DatabaseName 
    ON (FILENAME = 'FilePath\FileName.mdf'), -- Main Data File .mdf
    (FILENAME = 'FilePath\LogFileName.ldf'), -- Log file .ldf
     (FILENAME = 'FilePath\SecondaryDataFile.ndf)  -- Optional - any secondary data files
    FOR ATTACH 
GO 

También puede ver más sobre la declaración Crear base de datos en los libros en línea.

¿Cómo desconecto / adjunto en SQL Server Express?

En realidad es lo mismo. Si está utilizando SQL Server Management Studio Express, puede usar el diálogo de desconexión / conexión en la GUI descrita anteriormente o los pasos de T-SQL a través de SSMS Express descritos anteriormente también. No hay diferencia con Express allí.

Si no tiene SSMS Express, puede descargarlo ( aquí está la versión SQL Server 2012 Express).

Puede ingresar a una SQLCMDsesión y usar las mismas construcciones T-SQL descritas anteriormente.

¿Cuándo debo considerar hacer una separación o unir?

Primero, una palabra sobre qué separar y adjuntar no está destinado a usarse: Copia de seguridad y recuperación Separar y adjuntar no es una forma de hacer una copia de seguridad de su base de datos con fines de recuperación de rutina. No hay copias de seguridad del registro de transacciones de esta manera, pone su base de datos en un estado donde los archivos de la base de datos pueden eliminarse accidentalmente y no es una buena manera para este propósito.

Dicho esto, separar y adjuntar son buenos para algunos casos de uso (no exhaustivos, siéntase libre de editar para agregar o crear una nueva respuesta con más):

  • A veces para migraciones (aunque prefiero hacer copias de seguridad / restaurar para aquellos como se explica en mi respuesta aquí )
  • Cuando desee eliminar una base de datos que ya no se usa activamente pero que tiene la capacidad de adjuntarla más tarde según sea necesario.
  • En ciertas situaciones de solución de problemas, esto puede ser invocado
  • No tengo el espacio para hacer una copia de seguridad o para restaurar tanto los archivos de datos como los de registro a otro entorno (nunca deberías estar aquí, pero a veces lo he usado para mover bases de datos de desarrollo alrededor de entornos ... No quería ni necesitaba) el registro también lo hizo adjuntar / reconstruir el archivo de registro)

Riesgos y advertencias

Una vez más, los libros en línea son un buen recurso aquí , pero mencionaré algunas consideraciones específicas a tener en cuenta al separar o adjuntar una base de datos:

Despegar

  • Estás desconectando tu base de datos. Ya no será accesible. Esto debería ser obvio, pero vale la pena mencionarlo. Es por eso que no es una excelente opción de respaldo.
  • Cuando su base de datos está en línea, SQL Server bloquea los archivos. No recomendaría probar esto para demostrar que estoy equivocado, porque podría haber otra situación en juego, pero generalmente no puede eliminar un archivo de base de datos (datos, datos secundarios o archivo de registro) mientras SQL Server está en línea. Ésto es una cosa buena. Cuando se separa, no tiene esa protección, esto puede ser algo malo.
  • Si está lidiando con la corrupción de la base de datos y encuentra algún artículo en algún lugar que tiene un primer paso de Separar, está mal , si desconecta una base de datos corrupta, eso puede ser. Es posible que no vuelva a adjuntar esa base de datos.
  • Cortar y pegar los archivos de la base de datos de producción en toda la red es una forma de introducir potencialmente daños en el nivel de los archivos. Otra razón por la que prefiero hacer copias de seguridad / restaurar al hacer migraciones.
  • Puede causar que falle un plan de mantenimiento. La situación es que usted, como lo hice, estableció un plan de mantenimiento para realizar copias de seguridad periódicas de todas las bases de datos sin verificar las mejores prácticas. Esto funciona bien, así que dejas de pensar en ello. Luego, otra persona decide tomar una base de datos que no está utilizando sin conexión. El plan de mantenimiento fallará desde ese punto en adelante hasta que modifique el plan de mantenimiento marcando la opción "ignorar bases de datos cuyo estado no está en línea" en el cuadro de diálogo "Base de datos". Tenga en cuenta que no solo fallará para la base de datos fuera de línea: el plan de mantenimiento fallará con un error en el momento en que intente hacer una copia de seguridad de la base de datos fuera de línea, por lo que algunas bases de datos en línea podrían no tener una copia de seguridad. (Autor diferente para este punto, así que trátelo con sospecha)

Adjuntar : al igual que no debe ejecutar scripts desde Internet o aceptar paquetes de extraños en el aeropuerto, no debe adjuntar una base de datos que obtuvo de otra persona sin algunos pasos para verificarlo. Esta base de datos podría tener código dentro de ella en disparadores, procedimientos almacenados, etc. que podrían comprometer su entorno. Debe revisar una base de datos que desee adjuntar en un entorno seguro y protegido, no en su sistema de producción.

¿Qué pasa con las diferentes versiones o ediciones de SQL Server?

Estas no son diferentes a las reglas sobre la restauración de bases de datos entre versiones. En general, puede restaurar hasta la próxima versión para 3 versiones (SQL Server 2008 a SQL Server 2012, por ejemplo, funcionará. SQL Server 2000 a SQL Server 2012 no lo hará). No puede retroceder en absoluto a través de copia de seguridad / restauración o separar / adjuntar: tendría que escribir los objetos y las inserciones y hacerlo manualmente o con una herramienta que lo haga. Para las ediciones, generalmente puede moverse entre las SKU principales de SQL Server; por ejemplo, puede mover una base de datos de Standard a Enterprise sin trabajo adicional. Sin embargo, si está utilizando funciones de empresa (por ejemplo, compresión o particionamiento), deberá desactivar esas funciones antes de realizar el movimiento. Puedes hacerte una idea de las características que '


@ Mike: ¿hay algún impacto en el rendimiento de separar y adjuntar bases de datos regularmente? Me imagino que la memoria caché del búfer está invalidada para cualquier base de datos que esté separada (claramente), pero ¿conoce algún otro impacto?
Max Vernon

Tengo una base de datos en la que cuando detengo la instancia de SQL Server y copio los 3 archivos y luego los adjunto en otra instancia, la base de datos entra en Recuperación (me ocurrió dos veces en la misma base de datos). Según su descripción, esto no debería suceder, entonces, ¿qué debo sospechar sobre mi DB? ¿Está dañado de alguna manera? Las copias de seguridad tardan eones en crearse y restaurarse, ¡y esta característica es un salvavidas! Al menos para los propósitos de compartir DB de desarrollador ...
NoOne
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.