Share via


Tranzakciónapló-hibák elhárítása felügyelt Azure SQL-példánysal

A következőre vonatkozik: Felügyelt Azure SQL-példány

A 9002-ben vagy a 40552-ben megjelenő hibaüzenetek akkor jelenhetnek meg, ha a tranzakciónapló megtelt, és nem tudja elfogadni az új tranzakciókat. Ezek a hibák akkor fordulnak elő, ha a felügyelt Azure SQL-példány által felügyelt adatbázis-tranzakciónapló túllépi a hely küszöbértékeit, és nem tudja továbbra is elfogadni a tranzakciókat. Ezek a hibák hasonlóak az SQL Server teljes tranzakciónaplójával kapcsolatos problémákhoz, de az SQL Serverben, az Azure SQL Database-ben és a felügyelt Azure SQL-példányban eltérő megoldásokkal rendelkeznek.

Megjegyzés:

Ez a cikk a felügyelt Azure SQL-példányra összpontosít. A felügyelt Azure SQL-példány a Microsoft SQL Server adatbázismotor legújabb stabil verzióján alapul, így a tartalom nagy része hasonló, bár a hibaelhárítási lehetőségek és eszközök eltérhetnek az SQL Servertől.

A tranzakciónaplók Azure SQL Database-ben történő hibaelhárításáról további információt az Azure SQL Database tranzakciónapló-hibáinak elhárítása című témakörben talál.

Az SQL Server tranzakciónaplóinak hibaelhárításáról további információt a Teljes tranzakciós napló hibaelhárítása (SQL Server 9002-s hiba) című témakörben talál.

Automatikus biztonsági mentések és a tranzakciónapló

A felügyelt Azure SQL-példányban a tranzakciónaplók biztonsági mentése automatikusan megtörténik. A gyakoriságról, a megőrzésről és további információkról az automatikus biztonsági mentések című témakörben olvashat. A felügyelt SQL-példányok automatikus biztonsági mentéseinek nyomon követéséhez tekintse át a Biztonsági mentés figyelése tevékenységet.

Az adatbázisfájlok helyét és nevét nem lehet kezelni, de a rendszergazdák kezelhetik az adatbázisfájlokat és a fájl automatikus beállításait. A tranzakciónaplóval kapcsolatos problémák tipikus okai és megoldásai az SQL Serverhez hasonlóak.

Az SQL Serverhez hasonlóan az egyes adatbázisok tranzakciónaplója csonkolt, amikor egy napló biztonsági mentése sikeresen befejeződik. A naplók csonkolása törli az inaktív virtuális naplófájlokat (VLF-eket) a tranzakciónaplóból, így helyet szabadít fel a fájlon belül, de nem módosítja a lemezen lévő fájl méretét. A naplófájl üres területe ezután új tranzakciókhoz használható. Ha a naplófájl nem csonkolható a napló biztonsági másolatai által, a naplófájl az új tranzakciókhoz igazodik. Ha a naplófájl eléri a maximális korlátot a felügyelt Azure SQL-példányban, az új írási tranzakciók sikertelenek lesznek.

A felügyelt Azure SQL-példányban a számítástól függetlenül, legfeljebb egy korlátig vásárolhat bővítménytárat. További információ: Fájlkezelés több hely felszabadításához.

Tranzakciónapló csonkolásának megelőzése

Ha szeretné felderíteni, hogy mi akadályozza meg a napló csonkolását egy adott esetben, tekintse meg log_reuse_wait_desc a következőt sys.databases: . A napló újrafelhasználási várakozása tájékoztatja arról, hogy milyen feltételek vagy okok miatt akadályozza meg a tranzakciónaplót a rendszeres napló biztonsági mentése. For more information, see sys.databases (Transact-SQL).

SELECT [name], log_reuse_wait_desc FROM sys.databases;

A következő értékek log_reuse_wait_descsys.databases jelezhetik az adatbázis tranzakciónapló-csonkolásának okát:

log_reuse_wait_desc Diagnosztika Válasz szükséges
SEMMI Tipikus állapot. Semmi sem blokkolja a napló csonkolását. Nem.
ELLENŐRZŐPONT A napló csonkításához ellenőrzőpontra van szükség. Ritka. Nincs szükség válaszra, hacsak nem tart fenn. Ha tartós, küldjön egy támogatási kérést az Azure ügyfélszolgálatához.
NAPLÓ BIZTONSÁGI MENTÉSE Napló biztonsági mentésre van szükség. Nincs szükség válaszra, hacsak nem tart fenn. Ha tartós, küldjön egy támogatási kérést az Azure ügyfélszolgálatához.
AKTÍV BIZTONSÁGI MENTÉS VAGY VISSZAÁLLÍTÁS Az adatbázis biztonsági mentése folyamatban van. Nincs szükség válaszra, hacsak nem tart fenn. Ha tartós, küldjön egy támogatási kérést az Azure ügyfélszolgálatához.
AKTÍV TRANZAKCIÓ Egy folyamatban lévő tranzakció megakadályozza a naplók csonkolását. A naplófájl nem csonkítható aktív és/vagy nem véglegesített tranzakciók miatt. Lásd a következő szakaszt.
REPLIKÁCIÓS A felügyelt Azure SQL-példányban akkor fordulhat elő, ha a replikáció vagy a CDC engedélyezve van. Ha tartós, vizsgálja meg a CDC-vel vagy replikációval érintett ügynököket. A CDC hibaelhárításához lekérdezési feladatok msdb.dbo.cdc_jobs. Ha nincs jelen, adja hozzá a sys.sp_cdc_add_job. A replikációval kapcsolatban lásd a tranzakciós replikáció hibaelhárítását. Ha nem oldható fel, küldjön támogatási kérelmet az Azure ügyfélszolgálatának.
AVAILABILITY_REPLICA A másodlagos replika szinkronizálása folyamatban van. Nincs szükség válaszra, hacsak nem tart fenn. Ha tartós, küldjön egy támogatási kérést az Azure ügyfélszolgálatához.

Napló csonkolását megakadályozta egy aktív tranzakció

Az új tranzakciókat nem elfogadó tranzakciónaplók leggyakoribb forgatókönyve egy hosszú ideig futó vagy letiltott tranzakció.

Futtassa ezt a minta lekérdezést a nem véglegesített vagy aktív tranzakciók és azok tulajdonságainak megkereséséhez.

  • A tranzakció tulajdonságaival kapcsolatos információkat adja vissza a sys.dm_tran_active_transactions.
  • A munkamenet kapcsolati adatait adja vissza a sys.dm_exec_sessions.
  • A sys.dm_exec_requests a kérelmek adatait adja vissza (aktív kérelmek esetén). Ez a lekérdezés a blokkolt munkamenetek azonosítására is használható, keresse meg a request_blocked_by. További információ: Gyűjtse össze a letiltó információkat.
  • Az aktuális kérés szövegét vagy bemeneti pufferszövegét adja vissza a sys.dm_exec_sql_text vagy sys.dm_exec_input_buffer DMV-k használatával. Ha a mező sys.dm_exec_sql_text által text visszaadott adatok, NULLa kérés nem aktív, de függőben lévő tranzakcióval rendelkezik. Ebben az esetben a mező sys.dm_exec_input_buffer az event_info adatbázismotornak átadott utolsó utasítást tartalmazza.
SELECT [database_name] = db_name(s.database_id)
, tat.transaction_id, tat.transaction_begin_time, tst.session_id 
, session_open_transaction_count = tst.open_transaction_count
, transaction_duration_s = datediff(s, tat.transaction_begin_time, sysdatetime())
, input_buffer = ib.event_info
, request_text = CASE  WHEN r.statement_start_offset = 0 and r.statement_end_offset= 0 THEN left(est.text, 4000)
                       ELSE    SUBSTRING ( est.[text],    r.statement_start_offset/2 + 1, 
                                           CASE WHEN r.statement_end_offset = -1 THEN LEN (CONVERT(nvarchar(max), est.[text])) 
                                                ELSE r.statement_end_offset/2 - r.statement_start_offset/2 + 1
                                           END  )  END
, request_status = r.status
, request_blocked_by = r.blocking_session_id
, transaction_state = CASE tat.transaction_state    
                     WHEN 0 THEN 'The transaction has not been completely initialized yet.'
                     WHEN 1 THEN 'The transaction has been initialized but has not started.'
                     WHEN 2 THEN 'The transaction is active - has not been committed or rolled back.'
                     WHEN 3 THEN 'The transaction has ended. This is used for read-only transactions.'
                     WHEN 4 THEN 'The commit process has been initiated on the distributed transaction. This is for distributed transactions only. The distributed transaction is still active but further processing cannot take place.'
                     WHEN 5 THEN 'The transaction is in a prepared state and waiting resolution.'
                     WHEN 6 THEN 'The transaction has been committed.'
                     WHEN 7 THEN 'The transaction is being rolled back.'
                     WHEN 8 THEN 'The transaction has been rolled back.' END 
, transaction_name = tat.name
, transaction_type = CASE tat.transaction_type    WHEN 1 THEN 'Read/write transaction'
                                             WHEN 2 THEN 'Read-only transaction'
                                             WHEN 3 THEN 'System transaction'
                                             WHEN 4 THEN 'Distributed transaction' END
, tst.is_user_transaction
, local_or_distributed = CASE tst.is_local WHEN 1 THEN 'Local transaction, not distributed' WHEN 0 THEN 'Distributed transaction or an enlisted bound session transaction.' END
, transaction_uow    --for distributed transactions. 
, s.login_time, s.host_name, s.program_name, s.client_interface_name, s.login_name, s.is_user_process
, session_cpu_time = s.cpu_time, session_logical_reads = s.logical_reads, session_reads = s.reads, session_writes = s.writes
, observed = sysdatetimeoffset()
FROM sys.dm_tran_active_transactions AS tat 
INNER JOIN sys.dm_tran_session_transactions AS tst  on tat.transaction_id = tst.transaction_id
INNER JOIN Sys.dm_exec_sessions AS s on s.session_id = tst.session_id 
LEFT OUTER JOIN sys.dm_exec_requests AS r on r.session_id = s.session_id
CROSS APPLY sys.dm_exec_input_buffer(s.session_id, null) AS ib 
OUTER APPLY sys.dm_exec_sql_text (r.sql_handle) AS est;

Fájlkezelés több hely felszabadításához

Ha a tranzakciónapló nem csonkulhat a felügyelt Azure SQL-példányban, a megoldás részét képezheti a szabad terület felszabadítása. A gyökér feloldása esetén azonban a tranzakciónapló-fájl csonkolását blokkoló feltétel kulcs. Bizonyos esetekben a több lemezterület ideiglenes létrehozása lehetővé teszi a hosszú ideig futó tranzakciók befejezését, így a tranzakciónapló-fájl csonkolását megakadályozó feltételt normál tranzakciónapló-biztonsági mentéssel távolítja el. A szabad hely felszabadítása azonban csak átmeneti mentességet biztosíthat, amíg a tranzakciónapló újra meg nem nő.

A felügyelt Azure SQL-példányban a számítástól függetlenül, legfeljebb egy korlátig vásárolhat bővítménytárat. Az Azure Portalon például a Compute + Storage oldal elérése a gb-os tárterület növeléséhez. A tranzakciónapló méretkorlátjaival kapcsolatos információkért tekintse meg a felügyelt SQL-példány erőforráskorlátait. További információ: Felügyelt Azure SQL-példányban lévő adatbázisok fájlterületének kezelése.

A biztonsági mentési tárterület nem lesz levonva a felügyelt SQL-példány tárterületéből. A biztonsági mentési tároló független a példány tárterületétől, és mérete nem korlátozott.

9002-s hiba: Az adatbázis tranzakciónaplója megtelt

9002: The transaction log for database '%.*ls' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases.

A 9002-s hiba ugyanazon okok miatt fordul elő az SQL Serverben és az Azure SQL Managed Instance-ben.

A teljes tranzakciónaplóra adott megfelelő válasz attól függ, hogy milyen feltételek miatt történt a napló kitöltése.

A 9002-s hiba elhárításához próbálkozzon a következő módszerekkel:

  • A tranzakciónaplót nem csonkolja a rendszer, és az összes rendelkezésre álló területet kitölti.
    • Mivel a tranzakciónaplók biztonsági mentése a felügyelt Azure SQL-példányban automatikus, valami másnak meg kell őriznie a tranzakciónapló-tevékenység csonkolását. A hiányos replikáció, a CDC vagy a rendelkezésre állási csoport szinkronizálása megakadályozhatja a csonkolást. Lásd: A tranzakciónapló csonkolásának megakadályozása.
  • A felügyelt SQL-példány fenntartott tárterületének mérete megtelt, és a tranzakciónapló nem növekedhet.
  • A tranzakciónapló mérete rögzített maximális értékre van állítva, vagy az automatikus növekedés le van tiltva, ezért nem nőhet.

40552-ös hiba: A munkamenet a tranzakciónapló túlzott kihasználtsága miatt megszakadt

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Bár a 9002-s hiba gyakoribb, mint a felügyelt Azure SQL-példány 40552-s hibája, mindkettő előfordulhat.

A 40552-s hiba elhárításához próbálkozzon a következő módszerekkel:

  • A probléma bármilyen DML-műveletben előfordulhat, például beszúrás, frissítés vagy törlés. A szükségtelen írások elkerülése érdekében tekintse át a tranzakciót. Próbálja meg csökkenteni az azonnal végrehajtott sorok számát kötegelés vagy több kisebb tranzakcióra való felosztás implementálásával. További információ: A kötegelés használata az alkalmazás teljesítményének javítása érdekében.
  • A probléma az index újraépítési műveletei miatt fordulhat elő. A probléma elkerülése érdekében győződjön meg arról, hogy a következő képlet igaz: (a táblázatban érintett sorok száma) megszorozva (a bájtokban frissített mező átlagos mérete + 80) < 2 gigabájt (GB). Nagy táblák esetén fontolja meg partíciók létrehozását és az indexkarbantartást csak a tábla egyes partícióinál. További információ: Particionált táblák és indexek létrehozása.
  • Ha tömeges beszúrásokat hajt végre a segédprogram vagy az bcp.exeSystem.Data.SqlClient.SqlBulkCopy osztály használatával, próbálja meg -b batchsizeBatchSize korlátozni a kiszolgálóra másolt sorok számát az egyes tranzakciókban. További információ: bcp Utility.
  • Ha az utasítással ALTER INDEX újraépít egy indexet, használja a , ONLINE = ONés RESUMABLE=ON a SORT_IN_TEMPDB = ONbeállításokat. Az ismételhető indexek esetén gyakoribb a napló csonkolása. További információ: ALTER INDEX (Transact-SQL).

Következő lépések