Se me ha encomendado la tarea de intentar recuperar una base de datos que sufrió daños (debido a un error de E / S, que se ha solucionado desde entonces). No estoy familiarizado con la base de datos o lo que contiene.
Me dieron una copia de seguridad completa antigua (~ 3 semanas) y una serie de registros de transacciones ... sin embargo, faltan registros de transacciones, por lo que solo puedo recuperar hasta una fecha determinada. Faltan aproximadamente 2.5 semanas de datos (y se agregan muchos datos a esta base de datos constantemente).
También me han dado una copia de la base de datos corrupta (que es accesible, pero con muchas páginas corruptas / faltantes).
He probado los DBCC CHECKDB
comandos típicos (todavía no repair_allow_data_loss
, ese será mi último recurso si nada más funciona).
Después de que muchos van y vienen a la base de datos (el db es un pequeño monstruo de 1.5 terabytes y todo lo que hago es lento y lleva un tiempo), he intentado hacer una restauración de página en línea desde la última copia de seguridad buena conocida para las páginas corruptas.
Para hacer eso, hice un script que crea muchos RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
comandos a partir de la DBCC CHECKDB
salida (básicamente, una expresión regular y una distintiva) ... hasta ahora tan bueno, funcionó hasta un punto en el que decía que había alcanzado un límite de 1000 páginas. por archivo (hay 8 archivos en esta base de datos) por comando de restauración.
Entonces me pide que "complete la restauración en línea", pero no sé cómo hacerlo ... No tengo un registro de cola ni nada más completo que la copia de seguridad completa con la que estoy comenzando, así que Básicamente no sé cómo completar la restauración para seguir intentando con el resto de páginas.
He intentado un RESTORE DATABASE <foo> WITH RECOVERY
pero que tampoco funcionó, me pide un registro que no tengo.
¿Alguien tiene algún consejo sobre cómo podría intentar recuperar algo de aquí? ¿O cómo "completar" la restauración en línea para poder seguir intentando recuperar más páginas? ¿Tendría el mismo problema si intento una restauración sin conexión (básicamente agrego WITH NORECOVERY
a todo y luego trato de recuperarlo al final)?
Trabajar la base de datos a mano es básicamente imposible de deshacer ... hay cientos de tablas con millones de filas y no hay un significado claro de cuáles son. La base de datos corrupta fallará en las SELECT
consultas después de un millón de filas, pero no estoy seguro de poder averiguar dónde. Intenté reconstruir todos los índices no agrupados, pero hay páginas corruptas con datos de fila, por lo que tampoco funcionó.
Alguna pérdida de datos sería aceptable, pero la coherencia en la base de datos debería al menos intentar alcanzarse.
La base de datos corrupta está todavía en línea y los clientes están trabajando en ella (por lo que sigue obteniendo datos nuevos), por lo que cualquier proceso que realice en el banco de laboratorio debería ser reproducible en la base de datos de producción después (el tiempo de inactividad será difícil).
Esto es SQL Server 2014 Enterprise
PD: No soy un DBA ... Soy un programador, pero el cliente ha probado algunos servicios de recuperación de desastres sql "expertos" y se han rendido, así que me han pedido que lo vea y vea si puedo hacer nada.
Actualización : después de muchas pruebas, la restauración de página por página fue imposible, por lo que hemos abandonado la idea. Vamos a realizar una recuperación manual (seleccionando manualmente los registros que faltan de las tablas corruptas e insertándolos en la última copia de seguridad válida conocida), haciendo algunas herramientas automatizadas para ello (de nuevo, hay cientos y cientos de tablas).