Aracılığıyla paylaş


Azure SQL Database ile işlem günlüğü hatalarını giderme

Applies to:Azure SQL Database

İşlem günlüğü dolu olduğunda ve yeni işlemleri kabul edemiyorsa 9002 veya 40552 hataları görebilirsiniz. Bu hatalar, Azure SQL Database tarafından yönetilen veritabanı işlem günlüğü alan eşiklerini aştığında ve işlemleri kabul etmeye devam edemeyeceğinde oluşur. Bu hatalar, SQL Server tam işlem günlüğüyle ilgili sorunlara benzer, ancak SQL Server, Azure SQL Database ve Azure SQL Managed Instance farklı çözümlere sahiptir.

Not

Bu makale Azure SQL Database odaklanmıştır. Azure SQL Database, Microsoft SQL Server veritabanı altyapısının en son kararlı sürümünü temel alır, bu nedenle içeriğin çoğu benzerdir, ancak sorun giderme seçenekleri ve araçları SQL Server farklı olabilir.

Azure SQL Managed Instance işlem günlüğü sorunlarını giderme hakkında daha fazla bilgi için bkz. Azure SQL Managed Instance ile işlem günlüğü hatalarını giderme.

SQL Server'da işlem günlüğü sorunlarını giderme hakkında daha fazla bilgi için bkz. Tam İşlem Günlüğü Oluşturma (SQL Server Hatası 9002).

Otomatik yedeklemeler ve işlem günlüğü

Azure SQL Database işlem günlüğü yedeklemeleri otomatik olarak alınır. Sıklık, saklama ve daha fazla bilgi için bkz . Otomatik yedeklemeler.

Boş disk alanı, veritabanı dosyası büyümesi ve dosya konumu da yönetildiğinden işlem günlüğü sorunlarının tipik nedenleri ve çözümleri SQL Server farklıdır.

SQL Server'a benzer şekilde, günlük yedeklemesi başarıyla tamamlandığında her veritabanı için işlem günlüğü kısaltılır. Kesme, günlük dosyasında boş alan bırakır ve bu alan daha sonra yeni işlemler için kullanılabilir. Günlük dosyası, günlük yedeklemelerle kısaltılamadığında, yeni işlemlere uyum sağlamak için büyür. Günlük dosyası Azure SQL Database üst sınırına kadar büyürse, yeni yazma işlemleri başarısız olur.

İşlem günlüğü boyutları hakkında bilgi için bkz:

İşlem günlüğünün kesilmesi engellendi

Belirli bir durumda günlük kesilmesini engelleyen nedenleri öğrenmek için log_reuse_wait_desc'ye sys.databases'da bakın. Günlük yeniden kullanım beklemesi, işlem günlüğünün normal bir günlük yedeklemesi ile kısaltılmasını engelleyen koşul veya nedenleri size bildirir. Daha fazla bilgi için bkz. sys.databases (Transact-SQL).

SELECT [name], log_reuse_wait_desc FROM sys.databases;

Azure SQL Database için, bu sorguyu yürütmek için master veritabanı yerine belirli bir kullanıcı veritabanına bağlanmanızı öneririz.

Aşağıdaki log_reuse_wait_desc değerleri sys.databases veritabanının işlem günlüğü kesilmesinin neden engellendiğini gösterebilir:

günlük_yeniden_kullanım_bekleme_açıklaması Tanılama Yanıt gerekli
NOTHING Tipik durum. Günlüğün kısaltılmasını engelleyen bir şey yok. Hayır
CHECKPOINT Günlük kısaltılması için bir denetim noktası gereklidir. Nadir. Sürdürülebilir olmadığı sürece yanıt gerekmez. Devam ederse Azure Support ile bir destek isteği oluşturun.
LOG BACKUP Kayıt yedeklemesi gereklidir. Sürdürüldüğü takdirde yanıt gerekmez. Devam ederse Azure Support ile bir destek isteği oluşturun.
ACTIVE BACKUP OR RESTORE Veritabanı yedeklemesi devam ediyor. Sürdürüldüğü takdirde yanıt gerekmez. Devam ederse Azure Support ile bir destek isteği oluşturun.
ACTIVE TRANSACTION Devam eden bir işlem kütük kısaltılmasını engelliyor. Etkin ve/veya kaydedilmemiş işlemler nedeniyle günlük dosyası kısaltılamıyor. Sonraki bölüme bakın.
REPLICATION Azure SQL Database change data capture (CDC) etkinleştirilirse bu durum oluşabilir. sys.dm_cdc_errors sorgula ve hataları çöz. Çözümlenemezse, Azure Support ile bir destek isteği oluşturun.
AVAILABILITY_REPLICA İkincil eşe senkronizasyon devam ediyor. Devam edilmediği sürece yanıt gerekmez. Devam ederse Azure Support ile bir destek isteği oluşturun.

Etkin bir işlem tarafından log kesme önlendi

Yeni işlemleri kabul edemeyen bir işlem günlüğü için en yaygın senaryo, uzun süre çalışan veya engellenen bir işlemdir.

Kaydedilmemiş veya etkin işlemleri ve bunların özelliklerini bulmak için bu örnek sorguyu çalıştırın.

  • sys.dm_tran_active_transactions işlem özellikleri hakkındaki bilgileri döndürür.
  • sys.dm_exec_sessions oturum bağlantısı bilgilerini döndürür.
  • sys.dm_exec_requests aktif istekler için istek bilgilerini döndürür. Bu sorgu, engellenen oturumları tanımlamak için de kullanılabilir; request_blocked_by öğesini arayın. Daha fazla bilgi için Engelleme bilgilerini toplama sayfasına bakın.
  • sys.dm_exec_sql_text veya sys.dm_exec_input_buffer DMV'lerini kullanarak geçerli isteğin metnini veya giriş arabelleği metnini döndürür. sys.dm_exec_sql_text alanının text tarafından döndürülen veriler NULL ise, istek etkin değildir ancak beklemede bir işlem vardır. Bu durumda, event_info alanı sys.dm_exec_input_buffer veritabanı altyapısına geçirilen son deyimi içerir.
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
, azure_dtc_state    --Applies to: Azure SQL Database only
             =    CASE tat.dtc_state 
                 WHEN 1 THEN 'ACTIVE'
                 WHEN 2 THEN 'PREPARED'
                 WHEN 3 THEN 'COMMITTED'
                 WHEN 4 THEN 'ABORTED'
                 WHEN 5 THEN 'RECOVERED' END
, 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;

Daha fazla alan açmak için dosya yönetimi

İşlem günlüğünün Azure SQL Database elastik havuzlarda kesilmesi engellenirse, elastik havuz için alan boşaltma çözümün bir parçası olabilir. Ancak, işlem günlüğü dosyasının kesilmesini engelleyen temel koşulun çözülmesi önemlidir. Bazı durumlarda, geçici olarak daha fazla disk alanı oluşturmak uzun süre çalışan işlemlerin tamamlanmasını sağlar ve işlem günlüğü dosyasının normal bir işlem günlüğü yedeklemesiyle kesilmesini engelleyen koşulu kaldırır. Ancak, alan boşaltma işlemi işlem günlüğü yeniden büyüyene kadar yalnızca geçici bir rahatlama sağlayabilir.

Veritabanlarının ve elastik havuzların dosya alanını yönetme hakkında daha fazla bilgi için bkz. Azure SQL Database veritabanları için dosya alanı yönetme.

Hata 40552: Aşırı işlem günlüğü alanı kullanımı nedeniyle oturum sonlandırıldı

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

Bu sorunu çözmek için aşağıdaki yöntemleri deneyin:

  1. Sorun ekleme, güncelleştirme veya silme gibi herhangi bir DML işleminde oluşabilir. Gereksiz yazma işlemlerini önlemek için işlemi gözden geçirin. Toplu işlem gerçekleştirerek veya birden çok daha küçük işleme bölerek hemen çalıştırılan satır sayısını azaltmaya çalışın. Daha fazla bilgi için bkz. SQL Veritabanı uygulama performansını geliştirmek için toplu işlem kullanma.
  2. Dizin yeniden oluşturma işlemleri nedeniyle sorun oluşabilir. Bu sorunu önlemek için şu formülün doğru olduğundan emin olun: (tabloda etkilenen satır sayısı) çarpı (bayt cinsinden güncellenen alanın ortalama boyutu + 80) < 2 gigabayt (GB). Büyük tablolar için bölümler oluşturmayı ve yalnızca tablonun bazı bölümlerinde dizin bakımı gerçekleştirmeyi göz önünde bulundurun. Daha fazla bilgi için bkz . Bölümlenmiş Tablolar ve Dizinler Oluşturma.
  3. bcp.exe yardımcı programını veya System.Data.SqlClient.SqlBulkCopy sınıfını kullanarak toplu eklemeler yapıyorsanız, her işlemde sunucuya kopyalanan satır sayısını sınırlamak için -b batchsize veya BatchSize seçeneklerinden birini kullanmayı deneyin. Daha fazla bilgi için bcp Yardımcı Programı'na bakınız.
  4. ALTER INDEX deyimini kullanarak bir dizini yeniden derliyorsanız, SORT_IN_TEMPDB = ON, ONLINE = ON ve RESUMABLE=ON seçeneklerini kullanın. Devam ettirilebilir dizinlerde, log kısaltılması daha sık olur. Daha fazla bilgi için bkz. ALTER INDEX (Transact-SQL).

Not

Diğer kaynak idaresi hataları hakkında daha fazla bilgi için bkz . Kaynak idaresi hataları.