Istnieje wiele baz danych na serwerze SQL mojego klienta. Te bazy danych są w fazie rozwoju, więc programiści mogą projektować, refaktoryzować, modyfikować dane i tak dalej. Niektóre bazy danych zmieniają się rzadko. Mój klient musi zabezpieczyć je wszystkie (wykonać kopię zapasową) i poświęcić trochę czasu na zarządzanie środowiskiem. (W firmie nie ma stanowiska administratora DB). Po długiej dyskusji klient postanowił zastosować codzienną strategię pełnej kopii zapasowej, ze względu na łatwość przywracania.
Oto podsumowanie sytuacji:
- Liczba baz danych może się zmieniać każdego dnia.
- Kopie zapasowe baz danych, które zostały zmienione (co oznacza, że dane i / lub struktura zostały zmienione) powinny zostać zapisane.
- Bazy danych, które nie zostały zmienione, NIE powinny być archiwizowane.
- Rozwiązanie nie wpłynie na strukturę bazy danych (nie jest to wymóg ograniczony)
- Ten „silnik rezerwowy” powinien działać automatycznie.
Główny problem: jak wykryć, że baza danych została zmieniona. Pierwszą część problemu (zmiany DDL) można rozwiązać za pomocą wyzwalaczy DDL . Ale zmiany danych (zmiany DML) stanowią problem. Niemożliwe jest zastosowanie wyzwalaczy DML do wszystkich tabel we wszystkich bazach danych w celu śledzenia zmian (wydajność, zarządzanie rozszerzonymi obiektami ...). Mechanizm tworzenia kopii zapasowych musi śledzić wszystkie zmiany, aby oznaczyć każdą bazę danych jako gotową do utworzenia kopii zapasowej.
Zmiana przechwytywania danych jest rozwiązaniem, ale wydaje się zbyt ciężka (wymaga również SQL Server Enterprise Edition).
Innym sposobem jest śledzenie zmian w pliku bazy danych (rozmiar lub czas ostatniej zmiany), ale nie działa ono poprawnie: baza danych może zmienić swój rozmiar, gdy przekroczy całe zarezerwowane wolne miejsce, a sp_spaceused nie jest rozwiązaniem.
Śledzenie jest rozwiązaniem, ale powoduje problemy z wydajnością i wymaga dodatkowego zarządzania.
Czy istnieją jakieś rozwiązania do obliczania rzeczywistego rozmiaru użycia bazy danych bez wpływu na inne obiekty zarządzania bazą danych (takie jak statystyki ...)? Przyznaję, że zmiana danych tabeli, która nie zmienia jej rozmiaru, nie wywołałaby (tak sądzę), ale jest lepsza niż nic. Naprawdę szukam bezpośredniego lub pośredniego rozwiązania dla SQL Server 2008.
Dziękujemy za wszelkie uwagi, rozwiązania i przemyślenia.
DODANY:
Oto rozwiązanie (dzięki Marianowi ):
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%')
)