На 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%')
)