Pregunta

Hay una gran cantidad de bases de datos en el servidor SQL de mi cliente. Estas bases de datos están en fase de desarrollo, por lo que los desarrolladores pueden diseñar, refactor, hacer modificaciones de datos y así sucesivamente. Hay algunas bases de datos que cambian con poca frecuencia. Mi cliente tiene que mantener a todos a salvo (copia de seguridad) y pasar algún tiempo en la gestión del medio ambiente. (No hay ninguna posición administrador de base de datos en la empresa.) Tras un largo debate, el cliente ha decidido utilizar una estrategia de copia de seguridad completa diaria, debido a la facilidad de la restauración.

Así que aquí está el resumen de la situación:

  • El número de bases de datos puede variar cada día.
  • Las bases de datos que se han cambiado (datos y / o estructura intencionados han sido cambiados) se copia de seguridad.
  • Las bases de datos que no se han modificado no deberá ser respaldado.
  • Solución no deberá estructura de la base de impacto (requisito no está restringido)
  • Este "motor de copia de seguridad" trabajará automáticamente.

El problema principal:. Cómo detectar que una base de datos ha cambiado La primera parte del problema (DDL cambia) se puede resolver mediante el uso de DDL desencadenantes . Pero los cambios de datos (cambios DML) son un problema. Es imposible aplicar desencadenantes DML a todas las tablas de las bases de datos para rastrear los cambios (rendimiento, gestión de objetos extendidos ...). El motor de copia de seguridad tiene que realizar un seguimiento de todos los cambios para marcar cada base de datos como lista para copia de seguridad.

  • captura de datos modificados es una solución, pero parece demasiado pesado (que requiere SQL Server Enterprise Edition también).

  • Otra forma es rastrear cambios en los archivos de base de datos (tamaño o el último tiempo el cambio), pero no funciona correctamente: base de datos de A puede cambiar su tamaño cuando supera todo el espacio libre reservado y sp_spaceused no es una solución.

  • Tracing es una solución pero causa problemas de rendimiento y requiere administración adicional.

¿Existe alguna solución para calcular el tamaño real el uso de base de datos sin impacto sobre otros objetos de gestión de base de datos (como las estadísticas ..)? Por supuesto que un cambio en los datos de una tabla que no cambia el tamaño de la tabla no haría gatillo (creo), pero es mejor que nada. Realmente estoy en busca de una solución directa o indirecta para SQL Server 2008.

Gracias por cualquier comentario, soluciones y pensamientos que usted.

AÑADIDO:

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%')
    )
¿Fue útil?

Solución

Una idea sería hacer una instantánea cada día y vigilar el tamaño de archivo de instantánea en el disco usando un monitor de archivos. La instantánea está aumentando su tamaño sólo cuando se añaden los datos allí, por lo que sería una idea válida si desea encontrar una herramienta para controlar el tamaño real (tamaño indicado).

Ahora .. yo no usar esto, así que no le puede dar ideas técnicas: -).

Otra idea sería verificar el registro de transacciones de cada db (si está usando el modo de recuperación completa en ellos, por supuesto), con alguna función que he visto en los foros (db_fnlog .. o algo así) que lee las operaciones desde el registro, y ver si tiene alguna eliminaciones / inserciones / actualizaciones.

Los hay cosas fáciles de hacer .. pero espero que sean de utilidad.

PS: encontrado el artículo con la función log (que es fndblog leer, por cierto :-): Read el registro de transacciones de Jens K. Suessmeyer .

Otros consejos

  • Para DDL cambio que pueda leer el defecto traza .
  • Para las modificaciones DML puesto que encuentre CDC sea poco pesado, es posible ejecutar su propia traza del lado del servidor ligera que traza sólo los eventos relevantes

Para DDL que cambia desencadenadores DDL, Pero LMD Los cambios que puede intentar usar 3 opciones diferentes

1) el seguimiento de cambios 2) CDC (captura de datos modificados) 3) Característica de Auditoría

Para El seguimiento de cambios .. se puede ver el siguiente enlace http://www.mssqltips.com/sqlservertip/1819/using-change-tracking-in-sql-server-2008/

este seguimiento de cambios será utilizado wheather la tabla ha cambiado o no ... pero es muy difícil encontrar qué datos ha cambiado .. si usted quiere encontrar qué datos ha cambiado entonces puede ir de captura de datos Chnage.

Para Aduit en sqlserver .you puede comprobar el siguiente enlace http: //blogs.msdn .com / b / manisblog / archivo / 2008/07/21 / sql-server-2008-auditing.aspx

Para LMD cambia se puede utilizar cualquiera de las auditorías followinh nativa de SQL Server cuenta con:

  • seguimiento de cambios de SQL Server
  • captura de datos modificados SQL Server
  • SQL Server Auditoría

Cada uno tiene sus ventajas y desventajas, pero la Auditoría es el último introducido por Microsoft, por lo que sería una buena idea para construir sus soluciones actuales y futuras envueltos con él.

Tenga en cuenta que solamente la función de auditoría proporciona información acerca de quién / cuándo / cómo

Se puede detectar cualquier cambio DDL mediante el uso de archivo de rastreo. A continuación se guión para conseguir cambios.

SELECT 
    te.name AS eventtype
    ,t.loginname
    ,t.spid
    ,t.starttime
    ,t.objectname
    ,t.databasename
    ,t.hostname
    ,t.ntusername
    ,t.ntdomainname
    ,t.clientprocessid
    ,t.applicationname  
FROM sys.fn_trace_gettable
(
    CONVERT
    (VARCHAR(150)
    ,(
        SELECT TOP 1 
            value
        FROM sys.fn_trace_getinfo(NULL)  
        WHERE property = 2
    )),DEFAULT
) T 
INNER JOIN sys.trace_events as te 
    ON t.eventclass = te.trace_event_id 
WHERE eventclass=164

Se puede detectar cualquier modificación en la tabla y el procedimiento almacenado utilizando este script:

SELECT 
    SO.Name
    ,SS.name 
    ,SO.type_desc 
    ,SO.create_date
    ,SO.modify_date 
 FROM sys.objects AS SO
INNER JOIN sys.schemas AS SS 
    ON SS.schema_id = SO.schema_id 
WHERE DATEDIFF(D,modify_date, GETDATE()) < 50
AND TYPE IN ('P','U')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top