На SQL-сервере моего клиента много баз данных. Эти базы данных находятся в стадии разработки, поэтому разработчики могут проектировать, реорганизовывать, модифицировать данные и так далее. Есть некоторые базы данных, которые меняются редко. Мой клиент должен держать их всех в безопасности (резервное копирование) и тратить некоторое время на управление средой. (В компании нет должности администратора БД.) После продолжительного обсуждения клиент решил использовать ежедневную стратегию полного резервного копирования из-за простоты восстановления.
Итак, вот краткое изложение ситуации:
- Количество баз данных может меняться каждый день.
- Базы данных, которые были изменены (то есть данные и / или структура были изменены), должны быть сохранены.
- Базы данных, которые не были изменены, НЕ подлежат резервному копированию.
- Решение не должно влиять на структуру базы данных (это не ограниченное требование)
- Этот «резервный двигатель» должен работать автоматически.
Основная проблема: как обнаружить, что база данных была изменена. Первая часть проблемы (изменения DDL) может быть решена с помощью триггеров DDL . Но изменения данных (изменения DML) являются проблемой. Нельзя применять триггеры DML ко всем таблицам всех баз данных для отслеживания изменений (производительность, управление расширенными объектами ...). Механизм резервного копирования должен отслеживать все изменения, чтобы пометить каждую базу данных как готовую к резервному копированию.
Сбор данных изменений - это решение, но оно кажется слишком тяжелым (для него также требуется SQL Server Enterprise Edition).
Другой способ - отслеживать изменения файла базы данных (размер или время последнего изменения), но он работает неправильно: база данных может изменить свой размер, когда она превышает все зарезервированное свободное пространство, и sp_spaceused не является решением.
Трассировка - это решение, но оно вызывает проблемы с производительностью и требует дополнительного управления.
Существуют ли решения для расчета фактического размера использования базы данных без влияния на другие объекты управления базами данных (например, статистику ...)? Конечно, изменение данных таблицы, которые не изменяют размер таблицы, не сработает (я думаю), но это лучше, чем ничего. На самом деле я ищу прямое или косвенное решение для SQL Server 2008.
Спасибо за любые комментарии, решения и мысли.
ДОБАВЛЕНО:
Вот решение (спасибо Мариан ):
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%')
)