SQL-transactielogboek groeit wanneer u Change Data Capture gebruikt voor Oracle by Attunity

Dit artikel helpt u bij het oplossen van het probleem waarbij u continue groei van transactielogboeken voor een CDC-database ziet.

Oorspronkelijke productversie: SQL Server 2012 en de latere versies
Oorspronkelijk KB-nummer: 2871474

Symptomen

Bekijk het volgende scenario:

  • U gebruikt SQL Server 2017, SQL Server 2016, SQL Server 2014 of SQL Server 2012 in Windows.
  • U gebruikt Change Data Capture voor Oracle by Attunity.
  • U maakt een CDC-exemplaar om wijzigingen van Oracle-databasetabellen vast te leggen.
  • De waarden voor het vastleggen van wijzigingen worden opgeslagen in SQL Server-wijzigingsregistratiedatabases.
  • Het transactielogboek in de SQL Server-database groeit en transacties worden niet gemarkeerd voor afkapping wanneer gegevenswijzigingen worden vastgelegd.

In dit scenario verzamelt de groei van het transactielogboekbestand van de SQL Server-database te veel schijfruimte in de loop van de tijd.

Oorzaak

Wanneer Change Data Capture voor Oracle-exemplaren is geconfigureerd, heeft de SQL-database die de wijzigingsgegevens ontvangt gespiegelde tabellen, met transacties die zijn gemarkeerd voor replicatie. Dit gedrag treedt op omdat CDC voor Oracle afhankelijk is van opgeslagen procedures van het onderliggende systeem die lijken op de procedures die worden gebruikt in CDC voor SQL Server. Omdat er echter geen SQL CDC-replicatie betrokken is wanneer CDC voor Oracle alleen wordt gebruikt, is er geen logboeklezer om de transacties te wissen die zijn gemarkeerd voor replicatie. Omdat de transactie niet hoeft te worden gerepliceerd in SQL Server, is het veilig om de transactie handmatig te markeren als gedistribueerd met behulp van de tijdelijke oplossing die verderop in dit artikel wordt beschreven.

Als u deze exacte oorzaak wilt controleren, voert u de DBCC OPENTRAN opdracht uit terwijl u bent verbonden met de SQL Server CDC-database. U ziet een niet-gedistribueerd LSN-nummer, zoals wordt weergegeven in het volgende voorbeeld:

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.

Mogelijk hebt u een niet-gedistribueerde LSN omdat CDC voor Oracle gebruikmaakt van CDC voor opgeslagen SQL-procedures en dat op zijn beurt de replicatielogboeklezer gebruikt. Deze niet-gedistribueerde LSN komt overeen met de logboekvermeldingen om de gespiegelde tabel toe te voegen in de Attunity CDC-database.

Als u deze query uitvoert, retourneert de log_reuse_wait_desc optie een waarde van REPLICATION, die de oorzaak aangeeft.

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

Oplossing

  1. Voer de volgende opdracht uit in een queryvenster dat is verbonden met de database met CDC in SQL Server:

    EXEC sp_repltrans
    

    Als het goed is, ontvangt u uitvoer die er ongeveer als volgt uitziet:

    xdesid xact_seqno xact_seqno
    0x000000260000012C0001 0x0000002A000001B50001
    

    Kopieer de LSN-transactiereeksnummers voor de volgende opdracht.

  2. Voer met behulp van de getallen uit stap 1 de sp_repldone opdracht als volgt uit om aan te geven dat BeginTran- en CommitTran LSN-paren al zijn gerepliceerd:

    sp_repldone @xactid = 0x000000260000012C0001, @xact_segno = 0x0000002A000001B50001
    
  3. Voer de volgende opdracht uit om te controleren of de transactie is gemarkeerd als gerepliceerd in de CDC-database:

    DBCC OPENTRAN
    

    Dit retourneert uitvoer die lijkt op het volgende:

    No active open transactions.
    DBCC execution completed. If DBCC printed error messages, contact your system administrator.
    
  4. Als u ervoor wilt zorgen dat het transactielogboek opnieuw kan worden gebruikt, controleert u of er geen andere reden voor hergebruik is aangegeven in de database:

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

    Dit retourneert uitvoer die lijkt op het volgende:

    log_reuse_wait_desc name
    NOTHING <your_cdc_database>
    
  5. Nu moet u het transactielogboek kunnen afkappen met behulp van logboekback-ups. U moet ook het transactielogboekbestand kunnen verkleinen om de schijfruimte te verminderen die wordt verbruikt. Voer bijvoorbeeld het volgende uit:

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

Zie De grootte van het transactielogboekbestand beheren voor meer informatie.

Meer informatie

Voor meer informatie, zie Fouten met CDC-exemplaren oplossen in Microsoft Change Data Capture voor Oracle door Attunity.

De producten van derden die in dit artikel worden vermeld, worden vervaardigd door bedrijven die onafhankelijk zijn van Microsoft. Microsoft verleent dan ook geen enkele garantie, impliciet noch anderszins, omtrent de prestaties of de betrouwbaarheid van deze producten.