Published on

August 14, 2020

Deshacer errores humanos en SQL Server con la recuperación en un punto en el tiempo

¿Alguna vez has cometido un error mientras trabajabas con SQL Server? Tal vez hayas eliminado una tabla por accidente, escrito una instrucción UPDATE sin una condición WHERE o eliminado datos críticos. Si has experimentado alguno de estos escenarios, comprendes la importancia de poder deshacer estos errores humanos.

En SQL Server, puedes utilizar la recuperación en un punto en el tiempo para deshacer transacciones y recuperar tus datos. Sin embargo, hay algunas condiciones que deben cumplirse para que esto funcione. En primer lugar, tu base de datos debe estar utilizando el Modelo de Recuperación Completa. En segundo lugar, debes haber realizado una copia de seguridad completa antes de que ocurriera el error. Si no se cumplen alguna de estas condiciones, es posible que no puedas recuperar tus datos.

Pero, ¿qué sucede si tu base de datos tiene otras transacciones importantes en diferentes tablas que deseas mantener intactas? En ese caso, puedes restaurar tu base de datos en otro sistema o con un nombre diferente en el mismo sistema. Luego, puedes restaurar tu base de datos hasta el punto justo antes de que ocurriera el error. Una vez que hayas hecho eso, puedes recuperar los datos de la tabla donde ocurrió el error e insertarlos en tu base de datos en vivo original.

Siempre es una buena práctica realizar todos tus experimentos y pruebas en un entorno de desarrollo primero. Una vez que estés satisfecho con los resultados y la salida, puedes implementar tus cambios en el entorno de producción con confianza. Probar tu trabajo antes de la implementación ayuda a minimizar el riesgo de errores y garantiza la estabilidad de tu sistema.

Aquí tienes un script de ejemplo que demuestra el proceso de recuperación en un punto en el tiempo:

CREATE DATABASE SQLAuthority
GO
ALTER DATABASE SQLAuthority
SET RECOVERY FULL
GO
USE SQLAuthority
GO
CREATE TABLE TestTable (ID INT)
GO
BACKUP DATABASE [SQLAuthority] 
TO DISK = N'D:\SQLAuthority.bak'
GO
INSERT INTO TestTable (ID)
VALUES (1), (2), (3)
GO
SELECT GETDATE() BeforeTruncateTime;
-- 2020-08-18 19:45:38.717
SELECT *
FROM TestTable
GO
-- Desastre
TRUNCATE TABLE TestTable
GO
SELECT *
FROM TestTable
GO
BACKUP LOG [SQLAuthority] TO
DISK = N'D:\SQLAuthorityLog.trn'
GO
-- Operación de restauración
USE master
GO
RESTORE DATABASE [SQLAuthority] 
FROM DISK = N'D:\SQLAuthority.bak'
WITH NORECOVERY, REPLACE
GO
RESTORE LOG [SQLAuthority] 
FROM DISK = N'D:\SQLAuthorityLog.trn'
WITH STOPAT = '2020-08-18 19:45:38.717', RECOVERY
GO
USE SQLAuthority
GO
SELECT *
FROM TestTable
GO
USE master
GO
DROP DATABASE SQLAuthority
GO

Por favor, ten precaución al ejecutar el script anterior. Asegúrate de entender cada comando y sus implicaciones. Ejecutar el script sin un entendimiento adecuado puede resultar en daños a tu sistema.

Recuerda, cuando algo sale mal, no entres en pánico. Toma nota del momento en que ocurrió el error. Si tienes una copia de seguridad completa y estás utilizando el modelo de recuperación completa, siempre puedes deshacer la transacción utilizando la técnica explicada en esta publicación del blog.

Si necesitas ayuda adicional o tienes alguna pregunta, no dudes en contactarme en Comprehensive Database Performance Health Check.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.