Instantáneas de la base de datos de SQL Server para pruebas de integración

14

Estoy tratando de definir una forma de trabajar con una base de datos de prueba (en SQL Server) para nuestras pruebas de integración.

Mi idea era seguir estos pasos en el lanzamiento del ensamblaje de prueba de integración:

  • crear una base de datos totalmente vacía
  • ejecute el script "crear objetos de base de datos" para crear todos los objetos de base de datos relevantes (tabla, vistas, secuencias, etc.)
  • rellene los "datos base" (valores de búsqueda, etc.)
  • tomar una instantánea de la base de datos llamada (db)_Basiscomo "línea base" para futuras pruebas de integración

Ahora, antes de cada clase de prueba (que contiene pruebas 1-n), estaba planeando simplemente hacer una "restauración desde la instantánea" para volver al estado bien definido, más o menos "vacío" de la base de datos. Funciona como un encanto hasta ahora.

Sin embargo, hay un conjunto de pruebas de integración que deben operar en una base de datos de prueba grande, por lo que esperaba hacer esto antes de cada uno de esos dispositivos de prueba (clases con n pruebas individuales)

  • restaurar la base de datos desde la (db)_Basisinstantánea
  • inserte esas 50,000 filas de datos en la base de datos
  • crear otra instantánea (db)_With_Testdatainstantánea

y luego, para cada prueba, restablezca la base de datos a la (db)_With_Testdataversión de instantánea bien definida , ejecute las pruebas, verifique el resultado, etc.

El problema es que parece que no puedo tener dos instantáneas db al mismo tiempo; una vez que lo hago, no puedo restaurar mi base de datos en ninguno de ellos ... Continúo recibiendo este error:

Msg 3137, Nivel 16, Estado 4, Línea 9 La
base de datos no se puede revertir. El nombre principal o el nombre de la instantánea no se especifica correctamente, el resto de las instantáneas no se han eliminado o faltan archivos.

El mensaje 3013, Nivel 16, Estado 1, Línea 9
RESTAURAR BASE DE DATOS está finalizando de manera anormal.

¿Es realmente así como funcionan las instantáneas de la base de datos de SQL Server? Parece terriblemente restrictivo ... Lo entendería si no pudiera volver directamente a la instantánea original "(db) _Basis" tal vez, pero solo porque ahora tengo dos instantáneas, ni siquiera puedo volver a la más reciente ?!?!?

marc_s
fuente
¿Cuánto dura la parte Insertar 50,000 filas ? ¿Podrías volver a aplicar eso en su lugar?
RBarryYoung

Respuestas:

12

Desafortunadamente, es por diseño.

Tomado de la página BOL " Revertir una base de datos a una instantánea de base de datos ":

Limitaciones y Restricciones

La reversión no es compatible bajo las siguientes condiciones:

  • La base de datos debe tener actualmente solo una instantánea de la base de datos , a la que planea revertir.
  • Cualquier grupo de archivos de solo lectura o comprimido existe en la base de datos.
  • Todos los archivos ahora están fuera de línea pero estaban en línea cuando se creó la instantánea

Como alternativa, puede soltar la primera instantánea (db)_Basis. Puedo entender que esto parece muy limitante, pero míralo de esta manera: las instantáneas son archivos dispersos basados ​​en los archivos de datos originales, por lo que volver a una instantánea específica invalidaría todas las instantáneas de todos modos (la operación de reversión cambiaría los archivos de datos básicos) . La limitación puede ser molesta, pero no parece irrazonable.

spaghettidba
fuente
4

Otra perspectiva será hacer copias de seguridad y restaurar , ya que solo está creando una base de datos y un esquema vacíos con algunos valores de búsqueda.

Además, simplemente insertando 50K filas, la base de datos no será tan grande. Si usa compresión, el tamaño de la copia de seguridad también será menor.

Puede tener trabajos de Agente TSQL o solo secuencias de comandos (puede crear un procedimiento almacenado y simplemente llamarlo después de sus pruebas en función del resultado que obtenga).

  • Base de respaldo - (db)_Basis
  • Con respaldo de datos de prueba: (db)_With_Testdata

haga que se ejecuten sus scripts de integración y, según el resultado final, puede ejecutar cualquiera de los trabajos anteriores para volver al punto que desee.

Creo que el método de copia de seguridad / restauración es muy elegante en su escenario ya que está llegando a la limitación de la instantánea de la base de datos . Además, Paul Randal escribió en su blog sobre un error desagradable en todas las versiones hasta SQL Server 2012 inclusive (no estoy seguro de si se corrigió en una CU posterior)

Cuando vuelve a la instantánea de la base de datos, el archivo de registro de transacciones de la base de datos de origen se extrae y se reemplaza con un archivo de registro de 0.5MB con dos VLF de 0.25MB.

Kin Shah
fuente
Sí, hemos estado usando la copia de seguridad / restauración, pero eso está en el rango de 5-7 segundos, mientras que la restauración desde una instantánea de la base de datos está muy por debajo de 1 segundo, es por eso que estamos buscando una alternativa a la copia de seguridad / restauración
marc_s
@marc_s Bueno, para mí, de 5 a 7 segundos es aceptable sin limitaciones y errores frente a 1 segundo con limitaciones y posibles errores: --)
Kin Shah
Para nosotros, es no aceptable - que estamos buscando una solución más rápida
marc_s
@marc_s Veo que su punto no es aceptable. Pero ya estás llegando a la limitación que es por diseño. Puede usar solo 1 instantánea pero aún necesita una copia de seguridad para revertirla. La elección es suya: use una única instantánea, por ejemplo, con sus datos de prueba y use una copia de seguridad para restaurar los datos base.
Kin Shah