¿Se pueden copiar los archivos de una base de datos mientras una base de datos está en línea?

9

Estoy trabajando en la configuración de una copia de desarrollo de una base de datos de producción en SQL Server 2008 R2 SP1. Actualmente, dos desarrolladores utilizan ligeramente la base de datos en vivo para consultas de solo lectura, pero la nueva base de datos también tendrá actualizaciones.

Dado que la base de datos es de 2.1TB y tardó un total de 3 días en restaurar y actualizar a la última compilación que necesitamos para probar, mi plan original era crear un nuevo conjunto de archivos de respaldo y luego restaurar desde esos archivos. Esto me permitiría crear la copia de desarrollo de la base de datos en la misma instancia y máquina SQL, sin tener que desconectar la base de datos actual.

Sin embargo, para ahorrar un par de esos días, estaba pensando que podría ser una buena idea copiar los archivos de la base de datos física y adjuntar la nueva copia de la base de datos. Lamentablemente, cuando intento copiar, aparece un error que hace referencia al bloqueo que SQL Server pone en esos archivos.

Dado que no puedo desconectar la base de datos para nada más que transferir los archivos de registro (puedo terminar esto antes de que la gente entre por la mañana), ¿hay alguna forma de copiar los archivos de la base de datos en vivo sin poner la base de datos en un estado fuera de línea? ¿O debería esperar hasta que la gente se vaya a casa para hacer eso?

Sean Long
fuente

Respuestas:

11

¿Por qué lleva 3 días hacer una copia de seguridad / restaurar una base de datos de 2.1 TB? Si se trata de mover la copia de seguridad, sospecho que copiar los archivos MDF / LDF en realidad sería más lento ya que al menos la copia de seguridad podría estar comprimida. Y si solo se trata de restaurar, escribir las copias del archivo no debería ser más rápido que el proceso de restauración en sí mismo; asegúrese de tener habilitada la inicialización instantánea del archivo . O obtenga una E / S más rápida en el sistema secundario.

De todos modos, no, no puede copiar los archivos MDF / LDF mientras la base de datos está en línea, tendría que desconectarla para hacerlo. Y esta es la forma absolutamente MENOS segura de copiar una base de datos. Si algo le sucede a los archivos mientras están desconectados / desconectados, ahora tiene cero copias de su base de datos.

Sugeriría buscar formas de hacer que la copia de seguridad / restauración sea más rápida, ya sea para asegurarse de que está comprimiendo sus copias de seguridad y transfiriendo los archivos de la mejor manera posible, utilizando el mejor subsistema de E / S disponible, mejorando la E / S, haciendo asegúrese de que IFI esté habilitado, etc.

Otra opción a considerar es el envío de registros round robin: suponiendo que la producción se esté recuperando por completo y que esté realizando copias de seguridad de registros regulares, puede realizar el envío de registros a una base de datos mientras los desarrolladores trabajan en otra, y cuando llegue a un punto estable, restaure con recuperación y haga que los desarrolladores cambien, llevando sus cambios recientes con ellos. Ahora reinicialice el envío de registros en la copia en la que dejaron de trabajar, y estará listo para ellos en el próximo corte "estable", sin esperas.

Aaron Bertrand
fuente
La copia de seguridad tomaría una cantidad desconocida de horas (no creé la copia de seguridad original). La restauración demora 10 horas, luego ejecutar actualizaciones para llevarlo a nuestra compilación de desarrollo lleva otras 8 horas. Entonces, realmente, si estamos hablando de un día de 24 horas, solo lleva 18 horas. Hablando de 8 horas diarias, eso es básicamente 3 días (agregando algo de tiempo para copiar archivos). Hay ABSOLUTAMENTE formas en que puedo ajustar el proceso de copia de seguridad / restauración en sí mismo, y eso es lo que voy a hacer ahora que sé que ese es el camino que quiero seguir.
Sean Long
0

No, tendrá que desconectarlo para copiar los archivos. Si tiene su base de datos dividida en archivos / grupos de archivos más pequeños, podría ayudar a hacer que la restauración de la copia de seguridad sea más rápida después de haberla hecho una vez (dependiendo de qué datos están cambiando y qué datos se necesitan para la copia de desarrollo).

Tanner Corbin
fuente
0

He visto las otras respuestas y tienen mucho sentido. Sin embargo, solo para responder a su pregunta, ciertamente puede copiar archivos de base de datos sin desconectar la base de datos. Deberá usar la programación SMO para este propósito. Mira esto: http://technet.microsoft.com/en-us/library/ms162175(v=sql.100).aspx

Tenga en cuenta que el enlace proporcionado es a objetos de programación SMO generales y no una respuesta específica a esta pregunta. Todavía no lo he hecho, pero pronto voy a intentarlo y les haré saber a todos (si recuerdo) lo que descubrí.

Mandar Shindagi
fuente
-1

¿Se pueden copiar los archivos de una base de datos mientras una base de datos está en línea?

Si.

Todo lo que tiene que hacer es configurar la base de datos en solo lectura:

  1. Correr:

    USE [master]
    GO
    ALTER DATABASE [Database] SET READ_ONLY WITH NO_WAIT
    GO
  2. Copie los archivos de la base de datos: MDF, LDF, etc. a su nuevo destino

  3. Una vez que se realiza la copia, puede separar y volver a adjuntar en la nueva ubicación. Solo asegúrese de restablecer la opción de solo lectura y de que está utilizando la misma cuenta de usuario al manipular estos archivos. Además, es posible que desee eliminar los archivos antiguos después del traslado.

Otro método

Una vez que los archivos se hayan copiado correctamente (paso 2 anterior):

Puede configurar la base de datos en: Single_Usermodo y luego:

  1. Correr:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Single_USER WITH NO_WAIT
    GO
  2. D:\ siendo la nueva ubicación

    ALTER DATABASE Database MODIFY FILE
    (NAME = DATABASE, FILENAME = 'D:\DATABASE.mdf')
    GO
    ALTER DATABASE OHDSI MODIFY FILE
    (NAME = DATABASE_LOG, FILENAME = 'D:\DATABASE_LOG.ldf')
    GO
  3. Asegúrese de que los archivos de datos en la nueva ubicación ( D:\) tengan acceso completo a la cuenta de servicio que ejecuta SQL Server.

  4. Reiniciar los servicios SQL

  5. Correr:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Multi_USER WITH NO_WAIT
    GO

¡Hecho!

RAVicioso
fuente
Primero tenga en cuenta que poner la base de datos en modo de solo lectura provoca una interrupción efectiva si el uso normal requiere escribir en la base de datos. En segundo lugar, esperaría que SQL Server todavía tenga los archivos bloqueados para su uso si se están leyendo; Si su experiencia personal o la documentación de MS dice lo contrario, edítelo en su respuesta. En tercer lugar, el consejo que generalmente he visto para alterar la ubicación de un archivo es desconectar la base de datos , no solo en modo de usuario único. Nuevamente, si tiene experiencia personal o documentos de MS que sugieran lo contrario, edite en la respuesta. ¡Gracias!
RDFozz
¡Eso es correcto! Solo lectura evitará que los usuarios escriban, pero podrán leer. En su segundo punto, sí, puede desconectar la base de datos, pero la pregunta es mientras está en línea. El proceso que describí anteriormente funciona con el mínimo tiempo de inactividad. Gracias.
RAVicioso
@RAVicioso, la base de datos que se está leyendo solo es una interrupción también. Si no puede escribir nuevos datos (es decir, tomar pedidos), su sistema está efectivamente inactivo. Esto parece una mala idea, ¿no?
Erik Darling
@sp_BlitzErik: la solución funciona, pero no podrá escribir durante este tipo de mantenimiento. En su ejemplo: "tomar pedidos", no lo hará.
RAVicioso