Udostępnij za pośrednictwem


Dziennik transakcji SQL rośnie, gdy używasz funkcji przechwytywania zmian danych dla programu Oracle firmy Attunity

Ten artykuł pomaga rozwiązać problem polegający na tym, że zauważasz ciągły wzrost dziennika transakcji dla bazy danych z włączoną usługą CDC.

Oryginalna wersja produktu: SQL Server 2012 i nowsze wersje
Oryginalny numer KB: 2871474

Symptomy

Rozważmy następujący scenariusz:

  • Używasz programu SQL Server 2017, SQL Server 2016, SQL Server 2014 lub SQL Server 2012 w systemie Windows.
  • Używasz rozwiązania Change Data Capture dla Oracle firmy Attunity.
  • Wystąpienie cdC tworzy się w celu przechwytywania zmian z tabel bazy danych Oracle.
  • Wartości przechwytywania zmian są przechowywane w bazach danych przechwytywania zmian programu SQL Server.
  • Dziennik transakcji w bazie danych programu SQL Server rośnie, a transakcje nie są oznaczane do obcinania, ponieważ zmiany danych są przechwytywane.

W tym scenariuszu wzrost pliku dziennika transakcji bazy danych programu SQL Server gromadzi się i zużywa zbyt dużo miejsca na dysku w czasie.

Przyczyna

Po skonfigurowaniu funkcji przechwytywania zmian danych dla wystąpień Oracle baza danych SQL, która odbiera dane zmiany, będzie zawierać tabele dublowane z transakcjami oznaczonymi do replikacji. Takie zachowanie występuje, ponieważ usługa CDC for Oracle opiera się na podstawowych procedurach składowanych systemu, które przypominają te, które są używane w usłudze CDC dla programu SQL Server. Jednak ponieważ nie jest używana żadna replikacja usługi CDC SQL w przypadku użycia samej usługi CDC dla bazy danych Oracle, nie ma czytnika dzienników w celu wyczyszczenia transakcji oznaczonych do replikacji. Ponieważ transakcja nie musi być replikowana w programie SQL Server, można bezpiecznie ręcznie oznaczyć transakcję jako dystrybuowaną przy użyciu obejścia opisanego w dalszej części tego artykułu.

Aby sprawdzić tę dokładną przyczynę DBCC OPENTRAN , uruchom polecenie podczas nawiązywania połączenia z bazą danych CDC programu SQL Server. Zobaczysz nieprostrybucyjną liczbę LSN, jak pokazano w poniższym przykładzie:

Replicated Transaction Information:
Oldest distributed LSN : (0:0:0)
Oldest non-distributed LSN : (38:272:1)
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Być może istnieje rozproszona nazwa LSN, ponieważ usługa CDC dla firmy Oracle używa usługi CDC dla procedur składowanych SQL, a z kolei używa czytnika dzienników replikacji. Ta nieproszysowana nazwa LSN odpowiada wpisom dziennika, aby dodać tabelę dublowaną w bazie danych usługi CDC attunity.

Jeśli uruchomisz to zapytanie, log_reuse_wait_desc opcja zwróci wartość REPLICATION, wskazującą przyczynę.

SELECT log_reuse_wait_desc FROM sys.databases WHERE name = '<your_cdc_database>'

Rozwiązanie

  1. Uruchom następujące polecenie w oknie zapytania połączonym z bazą danych z włączoną usługą CDC w programie SQL Server:

    EXEC sp_repltrans
    

    Powinny zostać wyświetlone dane wyjściowe podobne do następujących:

    xdesid xact_seqno xact_seqno
    0x000000260000012C0001 0x0000002A000001B50001
    

    Skopiuj numery sekwencji transakcji LSN dla następnego polecenia.

  2. Używając liczb z kroku 1, uruchom sp_repldone polecenie w następujący sposób, aby zasygnalizować, że pary LSN BeginTran i CommitTran są już replikowane:

    sp_repldone @xactid = 0x000000260000012C0001, @xact_segno = 0x0000002A000001B50001
    
  3. Uruchom następujące polecenie, aby sprawdzić, czy transakcja jest oznaczona jako zreplikowana w bazie danych CDC:

    DBCC OPENTRAN
    

    Spowoduje to zwrócenie danych wyjściowych przypominających następujące:

    No active open transactions.
    DBCC execution completed. If DBCC printed error messages, contact your system administrator.
    
  4. Aby upewnić się, że dziennik transakcji można użyć ponownie, upewnij się, że nie ma innego powodu ponownego użycia wskazanego w bazie danych:

    SELECT log_reuse_wait_desc, NAME FROM sys.databases WHERE NAME = '<your_cdc_database>'
    

    Spowoduje to zwrócenie danych wyjściowych przypominających następujące:

    log_reuse_wait_desc name
    NOTHING <your_cdc_database>
    
  5. Teraz powinno być możliwe obcięcie dziennika transakcji przy użyciu kopii zapasowych dziennika. Należy również zmniejszyć plik dziennika transakcji, aby zmniejszyć ilość używanego miejsca na dysku. Uruchom na przykład następujące polecenie:

    BACKUP LOG <your_cdc_database> TO DISK='c:\folder\logbackup.trn'
    DBCC SHRINKFILE (yourcdcdatabase_log, 1024)
    

Aby uzyskać więcej informacji, zobacz Zarządzanie rozmiarem pliku dziennika transakcji.

Więcej informacji

Aby uzyskać więcej informacji, zobacz Rozwiązywanie problemów z błędami instancji CDC w usłudze Microsoft Change Data Capture dla Oracle autorstwa Attunity.

Produkty innych firm omówione w tym artykule są wytwarzane przez producentów niezależnych od firmy Microsoft. Firma Microsoft nie udziela żadnych gwarancji, dorozumianych ani żadnego innego rodzaju, w odniesieniu do wydajności lub niezawodności tych produktów.