Ci sono molti database sul server SQL del mio cliente. Questi database sono in fase di sviluppo, quindi gli sviluppatori possono progettare, refactoring, apportare modifiche ai dati e così via. Ci sono alcuni database che cambiano raramente. Il mio cliente deve tenerli tutti al sicuro (backup) e dedicare un po 'di tempo alla gestione dell'ambiente. (Non esiste alcuna posizione di amministratore DB presso l'azienda). Dopo lunghe discussioni, il cliente ha deciso di utilizzare una strategia di backup completo giornaliero, a causa della facilità di ripristino.
Quindi, ecco il riassunto della situazione:
- Il numero di database può variare ogni giorno.
- È necessario eseguire il backup dei database che sono stati modificati (nel senso che i dati e / o la struttura sono stati modificati).
- I database che non sono stati modificati NON devono essere sottoposti a backup.
- La soluzione non deve influire sulla struttura del database (non è un requisito limitato)
- Questo "motore di backup" deve funzionare automaticamente.
Il problema principale: come rilevare che un database è stato modificato. La prima parte del problema (modifiche DDL) può essere risolta utilizzando i trigger DDL . Ma le modifiche ai dati (modifiche DML) sono un problema. È impossibile applicare i trigger DML a tutte le tabelle di tutti i database per tenere traccia delle modifiche (prestazioni, gestione degli oggetti estesi ...). Il motore di backup deve tenere traccia di tutte le modifiche per contrassegnare ciascun database come pronto per il backup.
Change Data Capture è una soluzione ma sembra troppo pesante (richiede anche SQL Server Enterprise Edition).
Un altro modo è tenere traccia delle modifiche ai file di database (dimensioni o ora dell'ultima modifica), ma non funziona correttamente: un database può cambiare le sue dimensioni quando supera tutto lo spazio libero riservato e sp_spaceused non è una soluzione.
La traccia è una soluzione ma causa problemi di prestazioni e richiede una gestione aggiuntiva.
Esistono soluzioni per calcolare la dimensione effettiva dell'utilizzo del database senza impatto su altri oggetti di gestione del database (come le statistiche ..)? Concesso che una modifica ai dati di una tabella che non modifica le dimensioni della tabella non si innescherebbe (credo), ma è meglio di niente. Sto davvero cercando una soluzione diretta o indiretta per SQL Server 2008.
Grazie per eventuali commenti, soluzioni e pensieri.
AGGIUNTO:
Ecco la soluzione (grazie 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%')
)