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

Şunlar için geçerlidir:Azure SQL Veritabanı

İşlem günlüğü dolu olduğunda ve yeni işlemleri kabul edemiyorsa 9002 veya 40552 hataları görebilirsiniz. Bu hatalar, Azure SQL Veritabanı 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'da tam işlem günlüğüyle ilgili sorunlara benzer, ancak SQL Server, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği'da farklı çözümlere sahiptir.

Dekont

Bu makale Azure SQL Veritabanı odaklanmıştır. Azure SQL Veritabanı, 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'dan farklı olabilir.

Azure SQL Yönetilen Örneği işlem günlüğü sorunlarını giderme hakkında daha fazla bilgi için bkz. Azure SQL Yönetilen Örneği 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üğü Sorunlarını Giderme (SQL Server Hatası 9002).

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

Azure SQL Veritabanı 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'dan farklıdır.

SQL Server'a benzer şekilde, günlük yedeklemesi başarıyla tamamlandığında her veritabanının işlem günlüğü kesilir. 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 yedeklemeleri tarafından kesilemediğinde, günlük dosyası yeni işlemlere uyum sağlamak için büyür. Günlük dosyası Azure SQL Veritabanı ü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 şeyleri bulmak için içinde sys.databaseskonusuna log_reuse_wait_desc bakın. Günlük yeniden kullanım beklemesi, işlem günlüğünün normal günlük yedeklemesi tarafından kesilmesini engelleyen koşulları 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 Veritabanı için, bu sorguyu yürütmek için veritabanı yerine master belirli bir kullanıcı veritabanına bağlanmanızı öneririz.

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

Log_reuse_wait_desc Tanılama Yanıt gerekli
HİÇBİR ŞEY Tipik durum. Günlüğün kesilmesini engelleyen bir şey yok. Hayır.
DENETİM NOKTASI Günlük kesilmesi için bir denetim noktası gereklidir. Na -dir. Devam edilmediği sürece yanıt gerekmez. Devam ederse Azure Desteği'ne bir destek isteği oluşturun.
GÜNLÜK YEDEKLEME Günlük yedeklemesi gereklidir. Devam edilmediği sürece yanıt gerekmez. Devam ederse Azure Desteği'ne bir destek isteği oluşturun.
ETKIN YEDEKLEME VEYA GERI YÜKLEME Veritabanı yedeklemesi devam ediyor. Devam edilmediği sürece yanıt gerekmez. Devam ederse Azure Desteği'ne bir destek isteği oluşturun.
ETKİn İşlem Devam eden bir işlem günlük kesilmesini engelliyor. Etkin ve/veya kaydedilmemiş işlemler nedeniyle günlük dosyası kesilemiyor. Sonraki bölüme bakın.
ÇOĞALTMA Azure SQL Veritabanı değişiklik veri yakalama (CDC) etkinleştirilirse bu durum oluşabilir. Sorgu sys.dm_cdc_errors ve hataları çözün. Çözümlenemezse Azure Desteği'ne bir destek isteği oluşturun.
AVAILABILITY_REPLICA İkincil çoğaltmaya eşitleme devam ediyor. Devam edilmediği sürece yanıt gerekmez. Devam ederse Azure Desteği'ne bir destek isteği oluşturun.

Etkin bir işlem tarafından günlük kesilmesi engellendi

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.

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 Veritabanı elastik havuzlarda kesilmesi engellenirse, elastik havuz için alan boşaltma çözümün bir parçası olabilir. Ancak kök çözümleme işlemi işlem günlüğü dosyasının kesilmesini engelleyen koşulun çözümlenmesi ö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 Veritabanı veritabanları için dosya alanını 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ı) ile çarpıldığından (bayt + 80 olarak güncelleştirilen alanın ortalama boyutu) < 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. Yardımcı programını veya System.Data.SqlClient.SqlBulkCopy sınıfını bcp.exe kullanarak toplu eklemeler gerçekleştirirseniz, her işlemde -b batchsize sunucuya kopyalanan satır sayısını sınırlamak için veya BatchSize seçeneklerini kullanmayı deneyin. Daha fazla bilgi için bkz . bcp Yardımcı Programı.
  4. deyimiyle ALTER INDEX bir dizini yeniden derlediyseniz , ONLINE = ONve RESUMABLE=ON seçeneklerini kullanınSORT_IN_TEMPDB = ON. Devam ettirilebilen dizinlerde günlük kesilmesi daha sıktır. Daha fazla bilgi için bkz . ALTER INDEX (Transact-SQL).

Dekont

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

Sonraki adımlar