Ejecutamos una consulta de eliminación en una base de datos con 1.800 millones de filas. Esta eliminación eliminaría 1.200 millones de filas.
En retrospectiva, habríamos dividido esta consulta en 100 m a la vez, pero estamos en una posición en la que se ha estado ejecutando durante 24 horas y el archivo de registro está en 2Tb, que parece ser el tamaño máximo permitido para un archivo de registro.
La base de datos está en modo de recuperación SIMPLE.
¿Hay alguna que guarde esta consulta? ¿O necesitamos simplemente reiniciar el SQL Server y ver qué sucede? ¿La base de datos será inutilizable? ¿Hay algo que podamos hacer para acabar con esto de la manera más limpia posible?
sql-server
sql-server-2008-r2
delete
Graeme
fuente
fuente
Respuestas:
En primer lugar, verifique el registro de errores de SQL para ver si realmente alcanzó un tamaño máximo para el registro. Si lo hizo, entonces la consulta no tiene esperanzas de completarse, probablemente ya esté en un estado de reversión.
Incluso si es así, siempre prefiero matar el spid manualmente (usar
sp_who2
osp_WhoIsActive
para encontrar el spid, luego hacer unkill 59
o lo que sea). Tampoco puede verificar el estado de reversión a menos que haga un KILL explícito, vea este hilo relacionado .Como se trata de una eliminación, y no una actualización o inserción, puede ser muy afortunado y descubrir que retrocede de inmediato. De lo contrario, puede llevar tanto tiempo (o más) retroceder como lo hizo para llegar a este punto.
Para ver el estado de reversión, use
Desafortunadamente, he encontrado que esto con frecuencia no muestra nada útil, solo un "0% completado". En ese caso, tendrá que usar
sp_who2
y observar el IO y la CPU para ver si todavía está haciendo algo.En cuanto al reinicio, este es un grave riesgo. Si el spid está retrocediendo activamente (la CPU y la E / S están cambiando), reiniciar SQL solo desconectará la base de datos por completo hasta que la reversión haya finalizado por completo (horas y horas). Pero , si la CPU y la E / S no se mueven, de hecho puede eliminarlo de inmediato. De cualquier manera, es un riesgo.
Una última opción, si las cosas son especialmente graves: si tiene una copia de seguridad justo antes de que comenzara la eliminación (y no ha habido otras actualizaciones de la base de datos) , entonces la forma más rápida de recuperación puede ser simplemente soltar la base de datos, reiniciar SQL y restauración desde copia de seguridad.
Si no puede soltar la base de datos (o si ya reinició la instancia y el registro de errores de sql predice un tiempo de recuperación de 24 horas), cierre los servicios SQL, elimine los archivos MDF y LDF del disco, inicie SQL, suelte la base de datos (fantasma) y restaurar desde la copia de seguridad.
Obviamente, solo lo intentaría si fuera una base de datos de procesamiento de fondo con la que los usuarios no interactuaran.
fuente
NO REINICIE EL SERVIDOR SQL. Esto solo prolongará su agonía, ya que se realizará la recuperación, lo que revertirá o rehacerá cualquier transacción no completada, incluida su eliminación.
Eliminar la sesión que está ejecutando la eliminación dará como resultado una reversión, que también tardará mucho tiempo en completarse.
Desea ver la siguiente consulta para ver el estado de la operación:
La
percent_complete
columna y las que dependen de ella, comoestimated_completion_time
, solo se rellenan para las siguientes operaciones:Por lo tanto, solo verá que esa columna tiene sentido si ya ha cancelado la declaración de eliminación, y está retrocediendo, o si ya ha reiniciado SQL Server y está en recuperación.
Si la
blocking_session_id
columna contiene un número, eso indica que otra sesión está bloqueando la operación de eliminación. Si esa sesión ha estado bloqueando la operación de eliminación desde que comenzó, es posible que pueda cancelar la operación sin tener que realizar ninguna reversión.fuente