Hay muchas bases de datos en el servidor SQL de mi cliente. Estas bases de datos están en desarrollo, por lo que los desarrolladores pueden diseñar, refactorizar, realizar modificaciones de datos, etc. Hay algunas bases de datos que cambian raramente. Mi cliente tiene que mantenerlos a todos seguros (respaldados) y pasar algún tiempo administrando el medio ambiente. (No hay un puesto de administrador de base de datos en la empresa). Después de una larga discusión, el cliente ha decidido utilizar una estrategia de copia de seguridad completa diaria, debido a la facilidad de restauración.
Así que aquí está el resumen de la situación:
- El número de bases de datos puede variar todos los días.
- Las bases de datos que fueron cambiadas (lo que significa que los datos y / o la estructura han sido cambiados) serán respaldados.
- Las bases de datos que no fueron modificadas NO deberán ser respaldadas.
- La solución no afectará la estructura de la base de datos (no es un requisito restringido)
- Este "motor de respaldo" funcionará automáticamente.
El principal problema: cómo detectar que se ha cambiado una base de datos. La primera parte del problema (cambios DDL) puede resolverse mediante el uso de desencadenadores DDL . Pero los cambios de datos (cambios de DML) son un problema. Es imposible aplicar disparadores DML a todas las tablas de todas las bases de datos para realizar un seguimiento de los cambios (rendimiento, gestión de objetos extendidos ...). El motor de respaldo tiene que rastrear todos los cambios para marcar cada base de datos como lista para respaldar.
Change Data Capture es una solución, pero parece demasiado pesada (también requiere SQL Server Enterprise Edition).
Otra forma es rastrear los cambios en el archivo de la base de datos (tamaño o tiempo de último cambio), pero no funciona correctamente: una base de datos puede cambiar su tamaño cuando excede todo el espacio libre reservado y sp_spaceused no es una solución.
El seguimiento es una solución, pero causa problemas de rendimiento y requiere una administración adicional.
¿Hay alguna solución para calcular el tamaño real de uso de la base de datos sin afectar otros objetos de administración de la base de datos (como estadísticas ...)? Concedido que un cambio en los datos de una tabla que no cambia el tamaño de la tabla no se disparará (creo), pero es mejor que nada. Realmente estoy buscando una solución directa o indirecta para SQL Server 2008.
Gracias por cualquier comentario, solución y opinión.
ADICIONAL:
Aquí está la solución (gracias a Marian ):
Select
NextLSN = MAX(fn.[Current LSN])
,Databasename = DB_NAME()
from fn_dblog(NULL, NULL) fn
LEFT JOIN sys.allocation_units au
ON fn.AllocUnitId = au.allocation_unit_id
LEFT JOIN sys.partitions p
ON p.partition_id = au.container_id
LEFT JOIN sys.objects so
ON so.object_id = p.object_id
WHERE
(
(Operation IN
('LOP_INSERT_ROWS','LOP_MODIFY_ROW',
'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT')
AND so.is_ms_shipped = 0)
OR
([Lock Information] like '%ACQUIRE_LOCK_SCH_M OBJECT%')
)