Il y a beaucoup de bases de données sur le serveur SQL de mon client. Ces bases de données sont en cours de développement, afin que les développeurs puissent concevoir, refactoriser, effectuer des modifications de données, etc. Certaines bases de données changent rarement. Mon client doit les garder tous en sécurité (sauvegardés) et passer du temps à gérer l'environnement. (Il n'y a pas de poste d'administrateur de base de données dans l'entreprise.) Après une longue discussion, le client a décidé d'utiliser une stratégie de sauvegarde complète quotidienne, en raison de la facilité de restauration.
Voici donc le résumé de la situation:
- Le nombre de bases de données peut varier chaque jour.
- Les bases de données qui ont été modifiées (ce qui signifie que les données et / ou la structure ont été modifiées) doivent être sauvegardées.
- Les bases de données qui n'ont pas été modifiées ne doivent PAS être sauvegardées.
- La solution ne doit pas avoir d'impact sur la structure de la base de données (ce n'est pas une exigence restreinte)
- Ce "moteur de sauvegarde" fonctionnera automatiquement.
Le principal problème: comment détecter qu'une base de données a été modifiée. La première partie du problème (modifications DDL) peut être résolue à l'aide de déclencheurs DDL . Mais les changements de données (changements DML) sont un problème. Il est impossible d'appliquer des déclencheurs DML à toutes les tables de toutes les bases de données pour suivre les changements (performances, gestion des objets étendus ...). Le moteur de sauvegarde doit suivre toutes les modifications pour marquer chaque base de données comme prête à être sauvegardée.
Change Data Capture est une solution mais elle semble trop lourde (elle nécessite également SQL Server Enterprise Edition).
Une autre façon consiste à suivre les modifications des fichiers de la base de données (taille ou heure de la dernière modification), mais cela ne fonctionne pas correctement: une base de données peut changer sa taille lorsqu'elle dépasse tout l'espace libre réservé et sp_spaceused n'est pas une solution.
Le traçage est une solution mais il entraîne des problèmes de performances et nécessite une gestion supplémentaire.
Existe-t-il des solutions pour calculer la taille réelle d'utilisation de la base de données sans impact sur les autres objets de gestion de base de données (comme les statistiques ..)? Certes, une modification des données d'une table qui ne change pas la taille de la table ne se déclencherait pas (je pense), mais c'est mieux que rien. Vraiment je recherche une solution directe ou indirecte pour SQL Server 2008.
Merci pour tous commentaires, solutions et réflexions.
AJOUTÉE:
Voici la solution (merci à 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%')
)