W celu zabezpieczenia serwera przed utratą danych w przypadku awarii robimy backupy. Jak często je robimy wynika przeważnie z obciążenia zmianami tej bazy, tego jaki ma rozmiar i paru innych czynników. Praktycznie niemożliwe, jest robienie backupu co kilka minut a i to nie zapewniło by nam 100 % odzyskania zmian w bazie.
SQL Server pozwala na robienie backupu dziennika transakcji, ma on jednak sens tylko w odniesieniu do pełnej kopi bazy. Dlatego jeżeli mamy ustawiony tryb odzyskiwania bazy na (FULL) a nie było robionej wcześniej pełnej kopi Server obsługuję ją jak by była w trybie SIMPLE. Dzięki temu np. nie rozrasta się plik dziennika. Po pierwszej pełnej kopi bazy zaczyna być zabezpieczany pełen obraz tego co było zmieniane w bazie, jeżeli nie robimy kopi logów na pewno za chwile będziemy szukali pomocy na forach bo baza przestała działać z powodu braku miejsca na plik.
Problem z zachowaniem ciągłości kopi pojawia się gdy przełączymy bazę z trybu FULL lub BULK_LOGGED na SIMPLE, gdy wykonamy backup loga z opcją WITH NO_LOG lub WITH TRUNCATE_ONLY.
CREATE DATABASE test_log
GO
ALTER DATABASE test_log SET RECOVERY FULL WITH NO_WAIT
--------------------
The CREATE DATABASE process is allocating 0.75 MB on disk 'test_log'.
The CREATE DATABASE process is allocating 0.49 MB on disk 'test_log_log'.
Mamy bazę w trybie FULL nie było pełnego backupu sprubujemy zrobić backup logu
BACKUP LOG test_log TO DISK = N'C:\1.trc' WITH INIT
--------------------
Msg 4214, Level 16, State 1, Line 1
BACKUP LOG cannot be performed because there is no current database backup.
Msg 3013, Level 16, State 1, Line 1
BACKUP LOG is terminating abnormally.
(starsze wersje SQL Servera)
There is no current database backup. This log backup cannot be used to roll forward a preceding database backup.
Processed 1 pages for database 'test_log', file 'test_log_log' on file 1.
BACKUP LOG successfully processed 1 pages in 0.038 seconds (0.026 MB/sec).
Zrobimy pełen backup i spróbujemy jeszcze raz
BACKUP DATABASE test_log TO DISK = N'C:\pelna.bak' WITH INIT
GO
BACKUP LOG test_log TO DISK = N'C:\1.trc' WITH INIT
--------------------
Processed 176 pages for database 'test_log', file 'test_log' on file 1.
Processed 2 pages for database 'test_log', file 'test_log_log' on file 1.
BACKUP DATABASE successfully processed 178 pages in 0.082 seconds (17.695 MB/sec).
Processed 2 pages for database 'test_log', file 'test_log_log' on file 1.
BACKUP LOG successfully processed 2 pages in 0.019 seconds (0.646 MB/sec).
Zmienimy na chwilę tryb backupu
ALTER DATABASE test_log SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE test_log SET RECOVERY FULL WITH NO_WAIT
GO
BACKUP LOG test_log TO DISK = N'C:\2.trc' WITH INIT
Dostajemy jeden z komunikatów
There is no current database backup. This log backup cannot be used to roll forward a preceding database backup.
Processed 1 pages for database 'test_log', file 'test_log_log' on file 1.
BACKUP LOG successfully processed 1 pages in 0.038 seconds (0.026 MB/sec).
(starsze wersje SQL Servera)
Msg 4214, Level 16, State 1, Line 1
BACKUP LOG cannot be performed because there is no current database backup.
Msg 3013, Level 16, State 1, Line 1
BACKUP LOG is terminating abnormally.
BACKUP LOG cannot be performed because there is no current database backup.
Msg 3013, Level 16, State 1, Line 1
BACKUP LOG is terminating abnormally.
Sprawa wygląda na prostą, robimy backup bazy i po problemie.
Gorzej jeżeli jest to baza produkcyjna i pliki maja kilka Tb, jest na to mniej inwazyjne rozwiązanie możemy zrobić backup różnicowy (DIFFERENTIAL)
BACKUP DATABASE test_log TO DISK = N'C:\diff.bak' WITH DIFFERENTIAL
GO
BACKUP LOG test_log TO DISK = N'C:\3.trc' WITH INIT
GO
--------------------
Processed 48 pages for database 'test_log', file 'test_log' on file 1.
Processed 1 pages for database 'test_log', file 'test_log_log' on file 1.
BACKUP DATABASE WITH DIFFERENTIAL successfully processed 49 pages in 0.082 seconds (4.807 MB/sec).
BACKUP LOG successfully processed 0 pages in 0.024 seconds (0.000 MB/sec).
Musimy pamiętać, że do czasu wykonania następnego backupu ten backup różnicowy jest nam niezbędny do pełnego odzyskania bazy
Brak komentarzy:
Prześlij komentarz