Czy mogę zmniejszyć plik dziennika transakcji w lustrzanej bazie danych?

9

To jest pytanie uzupełniające do poprzedniego pytania, dlaczego nie mogłem zmniejszyć pliku dziennika w głównej bazie danych.

Krótko mówiąc, skonfigurowałem dublowanie bazy danych, ale zapomniałem upewnić się, że zadanie, które wykonało kopię zapasową dziennika transakcji, zostało uruchomione ponownie, a dziennik transakcji urósł do prawie 60 GB.

Od czasu skonfigurowania kopii lustrzanej ten wzrost rozmiaru został zduplikowany na serwerze kopii lustrzanej i ostatecznie zajął całe miejsce na dysku i uniemożliwił korzystanie z bazy danych kopii lustrzanych.

Na pytanie dotyczące konserwacji dziennika transakcji w lustrzanej bazie danych nie można wykonać kopii zapasowej dziennika w lustrze, ale zapytany w komentarzach o tym, jak zmniejszyć przerośnięty plik dziennika w lustrzanej bazie danych, pozostawiono komentarz

Jednym ze sposobów na to byłoby przełączenie awaryjne do lustrzanej bazy danych i zmniejszenie jej. Dokładnie przetestuj to w środowisku nieprodukcyjnym, aby upewnić się, że zachowuje się tak, jak chcesz.

Wydaje się to sugerować, że mogą istnieć inne sposoby zmniejszenia pliku dziennika na kopii lustrzanej, a ta metoda niekoniecznie może być bezpieczna na serwerze produkcyjnym.

Czy istnieje sposób na bezpieczne zmniejszenie pliku dziennika transakcji w lustrze bazy danych?

Rachel
źródło
2
Jedynym obsługiwanym sposobem jest zmniejszenie pliku głównego, który również zmniejszy plik w lustrze. Jeśli twoje lustro nie jest już takie samo jak główny, naprawdę nie chcesz próbować przełączania awaryjnego do lustra. Przerwij tworzenie kopii lustrzanej i odtwórz ją, jak powiedziałeś w poprzednim pytaniu.
Max Vernon

Odpowiedzi:

6

DBCC SHRINKFILEPolecenia będą dublowane od zleceniodawcy do lustrzanej bazy danych. Oto jakiś dowód.

Utwórz przykładową bazę danych na zleceniodawcy:

create database MirroredDb;
go

Utwórz tę samą bazę danych z kopii zapasowej za pomocą NORECOVERY:

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

Skonfiguruj sesję kopii lustrzanej w dowolny sposób.

W głównej bazie danych spójrz na rozmiary plików bazy danych:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Mój zestaw wyników wygląda następująco:

name            size
MirroredDb      392
MirroredDb_log  104

W lustrzanej bazie danych utwórz migawkę i spójrz na te same informacje:

create database MirroredDbss
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb.ss'
)as snapshot of MirroredDb;

use MirroredDbss;
go

select
    name,
    size
from sys.database_files;

Mój zestaw wyników wygląda następująco:

name            size
MirroredDb      392
MirroredDb_log  104

Teraz powiększ plik dziennika transakcji w głównej bazie danych (przyniosłem go do 1 GB):

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

Patrząc na rozmiar dziennika transakcji głównej bazy danych , widzimy teraz dostosowany rozmiar:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Mój zestaw wyników wygląda następująco:

name            size
MirroredDb      392
MirroredDb_log  131072

Utwórz kolejną migawkę w lustrzanej bazie danych i sprawdź tam rozmiar pliku dziennika transakcji:

create database MirroredDbss2
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb2.ss'
)as snapshot of MirroredDb;

use MirroredDbss2;
go

select
    name,
    size
from sys.database_files;

Mój zestaw wyników wygląda następująco:

name            size
MirroredDb      392
MirroredDb_log  131072

Teraz wykonaj DBCC SHRINKFILEna główny :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

Mój zestaw wyników jest następujący:

name            size
MirroredDb      392
MirroredDb_log  104

Utwórz trzecią i ostatnią migawkę w lustrzanej bazie danych i spójrz na rozmiar:

create database MirroredDbss3
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb3.ss'
)as snapshot of MirroredDb;

use MirroredDbss3;
go

select
    name,
    size
from sys.database_files;

I otrzymuję następujący zestaw wyników:

name            size
MirroredDb      392
MirroredDb_log  104

Jak widać tutaj, DBCC SHRINKFILEpolecenie jest w rzeczywistości dublowane w lustrzanej bazie danych.

Thomas Stringer
źródło
Dziękujemy, nie zdawałem sobie sprawy, że rozmiar pliku dziennika został również skopiowany z głównego serwera. Ale czy w przypadku, gdy kopia lustrzana nie działa ze względu na rozmiar dziennika transakcji, czy jedynym rozwiązaniem jest usunięcie i ponowne utworzenie kopii lustrzanej? Nie ma sposobu, aby bezpiecznie zmniejszyć dziennik lustrzany, gdy proces tworzenia kopii lustrzanej nie działa?
Rachel
Nie możesz połączyć się z lustrzaną bazą danych, dlatego nie możesz DBCC SHRINKFILEna niej uruchomić . Jeśli chodzi o to, czy możesz naprawić sesję kopii lustrzanej bez usuwania kopii lustrzanej w tej bazie danych, trzeba będzie przeprowadzić nieco więcej dochodzenia. Wygląda na to, że został zawieszony z powodu rozmiaru pliku. Czy próbowałeś wznowić partnera?
Thomas Stringer
Tak, ale natychmiast wrócił do zawieszenia. Przypuszczam, że dzieje się tak, ponieważ upłynęło zbyt wiele czasu od zatrzymania kopii lustrzanej, więc wiele danych musi zostać przesłanych, zanim dotrze do części „zmniejszania pliku dziennika”. Miałem nadzieję, że istnieje inny sposób, którego po prostu nie byłem świadomy, na przykład coś, co mogłem uruchomić z lustrzanej bazy danych, aby zmniejszyć plik, lub jakieś manipulacje systemem plików, ale tak nie jest. Twoja odpowiedź jest jednak nadal bardzo pomocna, więc dziękuję :)
Rachel
Mam nadzieję, że już nie. Gdy baza danych zostanie zawieszona / rozłączona i kopia zapasowa dziennika zostanie wykonana na podstawowym urządzeniu, prawie nie możesz odzyskać kopii lustrzanej bez synchronizacji.
Jason Cumberland,