Aracılığıyla paylaş


Hızlandırılmış veritabanı kurtarmayı izleme ve sorunlarını giderme

Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri Azure SQL VeritabanıMicrosoft Fabric'de Azure SQL Yönetilen ÖrneğiSQL veritabanı

Bu makale SQL Server 2019 (15.x) ve sonraki sürümlerde hızlandırılmış veritabanı kurtarma (ADR), Azure SQL Yönetilen Örneği, Azure SQL Veritabanı ve Microsoft Fabric'teki SQL veritabanıyla ilgili sorunları izlemenize, tanılamanıza ve çözmenize yardımcı olur.

PVS'nin boyutunu inceleme

Kalıcı sürüm deposu (PVS) boyutunun beklenenden büyük olup olmadığını belirlemek için sys.dm_tran_persistent_version_store_stats DMV'sini kullanın.

Aşağıdaki örnek tanılama sorgusu, PVS boyutunun sıfırdan büyük olduğu tüm veritabanlarında geçerli PVS boyutu, temizleme işlemleri ve diğer ayrıntılar hakkındaki bilgileri gösterir:

SELECT pvss.database_id,
       DB_NAME(pvss.database_id) AS database_name,
       pvss.persistent_version_store_size_kb / 1024. / 1024 AS persistent_version_store_size_gb,
       100 * pvss.persistent_version_store_size_kb / df.total_db_size_kb AS pvs_percent_of_database_size,
       df.total_db_size_kb / 1024. / 1024 AS total_db_size_gb,
       pvss.online_index_version_store_size_kb / 1024. / 1024 AS online_index_version_store_size_gb,
       pvss.current_aborted_transaction_count,
       pvss.aborted_version_cleaner_start_time,
       pvss.aborted_version_cleaner_end_time,
       pvss.oldest_aborted_transaction_id,
       pvss.oldest_active_transaction_id,
       dt.database_transaction_begin_time AS oldest_transaction_begin_time,
       asdt.session_id AS active_transaction_session_id,
       asdt.elapsed_time_seconds AS active_transaction_elapsed_time_seconds,
       pvss.pvs_off_row_page_skipped_low_water_mark,
       pvss.pvs_off_row_page_skipped_min_useful_xts,
       pvss.pvs_off_row_page_skipped_oldest_aborted_xdesid
FROM sys.dm_tran_persistent_version_store_stats AS pvss
CROSS APPLY (
            SELECT SUM(size * 8.) AS total_db_size_kb
            FROM sys.master_files AS mf
            WHERE mf.database_id = pvss.database_id
                  AND
                  mf.state = 0
                  AND
                  mf.type = 0
            ) AS df
LEFT JOIN sys.dm_tran_database_transactions AS dt
ON pvss.oldest_active_transaction_id = dt.transaction_id
   AND
   pvss.database_id = dt.database_id
LEFT JOIN sys.dm_tran_active_snapshot_database_transactions AS asdt
ON pvss.min_transaction_timestamp = asdt.transaction_sequence_num
   OR
   pvss.online_index_min_transaction_timestamp = asdt.transaction_sequence_num
WHERE pvss.persistent_version_store_size_kb > 0
ORDER BY persistent_version_store_size_kb DESC;

PVS'nin toplam veritabanı boyutuna göre büyüklüğünü görmek için pvs_percent_of_database_size sütununu kontrol edin. Tipik PVS boyutu ile uygulama etkinliğinin tipik dönemlerinde görülen taban çizgileri arasındaki farklara dikkat edin. TABAN çizgisinden önemli ölçüde büyükse veya veritabanı boyutunun 50% yakınsa PVS büyük olarak kabul edilir.

PVS'nin boyutu azalmıyorsa, büyük PVS boyutunun nedenini bulmak ve çözmek için aşağıdaki sorun giderme adımlarını kullanın.

Tavsiye

Aşağıdaki sorun giderme adımlarında belirtilen sütunlar, bu bölümdeki tanılama sorgusunun sonuç kümesindeki sütunlara başvurur.

Büyük PVS boyutuna aşağıdaki nedenlerden biri neden olabilir:

Uzun süreli aktif işlemleri kontrol et

Etkin işlemlerin uzun süre çalışması, ADR'nin etkin olduğu veritabanlarında PVS temizlemesini engelleyebilir. oldest_transaction_begin_time sütununu kullanarak en eski etkin işlemin başlangıç saatini denetleyin. Uzun süre çalışan işlemleri bulmak için aşağıdaki örnek sorguyu kullanın. İşlem süresi ve oluşturulan işlem günlüğü miktarı için eşikler ayarlayabilirsiniz:

DECLARE @LongTxThreshold int = 900;  /* The number of seconds to use as a duration threshold for long-running transactions */
DECLARE @LongTransactionLogBytes bigint = 1073741824; /* The number of bytes to use as the generated log threshold for long-running transactions */

SELECT  dbtr.database_id,
        DB_NAME(dbtr.database_id) AS database_name,
        st.session_id,
        st.transaction_id,
        atr.name,
        sess.login_time,
        dbtr.database_transaction_log_bytes_used,
        CASE WHEN GETDATE() >= DATEADD(second, @LongTxThreshold, tr.transaction_begin_time) THEN 'DurationThresholdExceeded'
             WHEN dbtr.database_transaction_log_bytes_used >= @LongTransactionLogBytes THEN 'LogThresholdExceeded'
             ELSE 'Unknown'
        END
        AS reason
FROM sys.dm_tran_active_transactions AS tr
INNER JOIN sys.dm_tran_session_transactions AS st
ON tr.transaction_id = st.transaction_id
INNER JOIN sys.dm_exec_sessions AS sess
ON st.session_id = sess.session_id
INNER JOIN sys.dm_tran_database_transactions AS dbtr
ON tr.transaction_id = dbtr.transaction_id
INNER JOIN sys.dm_tran_active_transactions AS atr
ON atr.transaction_id = st.transaction_id
WHERE GETDATE() >= DATEADD(second, @LongTxThreshold, tr.transaction_begin_time)
      OR
      dbtr.database_transaction_log_bytes_used >= @LongTransactionLogBytes;

Oturumlar belirlendiyse ve izin veriliyorsa, oturumu sonlandırmayı göz önünde bulundurun. Gelecekte sorun yaşamamak için sorunlu işlemlerin niteliğini belirlemek için uygulamayı gözden geçirin.

Uzun süre çalışan sorguların sorunlarını giderme hakkında daha fazla bilgi için bakınız:

Uzun süre devam eden aktif anlık görüntü taramalarını kontrol et

Uzun süre çalışan etkin anlık görüntü taramaları, ADR'nin etkinleştirildiği veritabanlarında PVS temizlemesini engelleyebilir. anlık görüntü yalıtımı (RCSI) veya yalıtım düzeyleri kullanan ifadeler, örnek düzeyi zaman damgaları alır. Anlık görüntü taraması, RCSI veya SNAPSHOT işleminin sürüm satırı görünürlüğünü belirlemek için zaman damgasını kullanır. RCSI kullanan her deyimin kendi zaman damgası bulunurken, SNAPSHOT yalıtımının ise işlem seviyesinde bir zaman damgası vardır.

Bu örnek düzeyindeki işlem zaman damgaları tek veritabanı işlemlerinde bile kullanılır, çünkü herhangi bir işlem veritabanları arası bir işleme yükseltilebilir. Bu nedenle anlık görüntü taramaları, aynı veritabanı motoru örneğindeki herhangi bir veritabanında PVS temizliğini engelleyebilir. Benzer şekilde, ADR etkinleştirilmediğinde bile anlık görüntü taramaları tempdbsürümündeki sürüm deposunun temizlenmesini engelleyebilir. Sonuç olarak, SNAPSHOT veya RCSI kullanan uzun süre çalışan işlemler mevcut olduğunda PVS'nin boyutu büyüyebilir.

pvs_off_row_page_skipped_min_useful_xts sütunu, uzun bir anlık görüntü taraması nedeniyle temizleme sırasında atlanan sayfa sayısını gösterir. Bu sütun büyük bir değer gösteriyorsa, uzun bir anlık görüntü taraması PVS temizliğini engelliyor demektir.

Uzun süre çalışan SNAPSHOT veya RCSI işlemine sahip oturumları bulmak için aşağıdaki örnek sorguyu kullanın:

SELECT sdt.transaction_id,
       sdt.transaction_sequence_num,
       s.database_id,
       s.session_id,
       s.login_time,
       GETDATE() AS query_time,
       s.host_name,
       s.program_name,
       s.login_name,
       s.last_request_start_time
FROM sys.dm_tran_active_snapshot_database_transactions AS sdt
INNER JOIN sys.dm_exec_sessions AS s
ON sdt.session_id = s.session_id;

PVS temizleme gecikmelerini önlemek için:

  • Mümkünse PVS temizliğini geciktiren uzun süreli etkin işlem oturumunu sonlandırmayı düşünün.
  • Sorgu süresini azaltmak için uzun süre çalışan sorguları ayarlayın.
  • Sorunlu etkin anlık görüntü taramasının doğasını belirlemek için uygulamayı gözden geçirin. Uzun süreli sorgular PVS temizliğini geciktiriyorsa, READ COMMITTED veya RCSI yerine SNAPSHOTgibi farklı bir yalıtım düzeyini düşünün. Bu sorun, SNAPSHOT yalıtım düzeyinde daha sık oluşur.
  • Azure SQL Veritabanı elastik havuzlarında, aynı havuzdaki diğer veritabanlarında PVS temizleme gecikmesini önlemek için SNAPSHOT yalıtım veya RCSI kullanarak uzun süre çalışan işlemleri olan veritabanlarını elastik havuzdan taşımayı göz önünde bulundurun.

İkincil çoğaltmalarda uzun süreli sorguları kontrol et

Veritabanında ikincil çoğaltmalar varsa, ikincil düşük filigranın ilerleyip ilerlemediğini kontrol edin.

pvs_off_row_page_skipped_low_water_mark sütununda yer alan büyük bir değer, ikincil replikadaki uzun süreli bir sorgu nedeniyle temizleme gecikmesine işaret edebilir. PVS temizlemesini durdurmanın yanı sıra, ikincil bir replikada uzun süre çalışan bir sorgu da hayalet temizlemeyı durdurabilir.

İkincil çoğaltmalardaki uzun süreli sorguların PVS temizliğini engelleyip engellemediğini öğrenmek için aşağıdaki örnek sorguları birincil çoğaltmada kullanabilirsiniz. Birincil replika üzerinde bir yazma iş yükü çalışıyorsa, ancak low_water_mark_for_ghosts sütunundaki değer örnek sorgunun bir çalıştırılmasından diğerine artmıyorsa, PVS ve hayalet temizleme, ikincil replikada uzun süre çalışan bir sorgu tarafından engelleniyor olabilir.

SELECT database_id,
       DB_NAME(database_id) AS database_name,
       low_water_mark_for_ghosts,
       synchronization_state_desc,
       synchronization_health_desc,
       is_suspended,
       suspend_reason_desc,
       secondary_lag_seconds
FROM sys.dm_hadr_database_replica_states
WHERE is_local = 1
      AND
      is_primary_replica = 1;

Daha fazla bilgi için low_water_mark_for_ghostsiçindeki sütununun açıklamasına bakın.

Okunabilir her ikincil kopyaya bağlanın, uzun süreli sorguların bulunduğu oturumları tespit edin ve izin verilirse oturumu sonlandırmayı düşünün. Daha fazla bilgi için bkz. yavaş sorguları bulma.

Çok sayıda durdurulan işlemi denetleyin

durdurulan son işlem temizleme işleminin tamamlanıp tamamlanmadığını görmek için aborted_version_cleaner_start_time ve aborted_version_cleaner_end_time sütunlarını denetleyin. Yarıda kalan işlem temizliği tamamlandıktan sonra oldest_aborted_transaction_id yukarıya doğru hareket etmelidir. oldest_aborted_transaction_id oldest_active_transaction_iddeğerinden çok daha düşükse ve current_abort_transaction_count değeri büyükse, muhtemelen PVS temizlemeyi engelleyen eski bir yarım kalmış işlem vardır.

Çok sayıda durdurulan işlem nedeniyle PVS temizleme gecikmesini çözmek için aşağıdakileri göz önünde bulundurun:

  • SQL Server 2022 (16.x) kullanıyorsanız, ADR Cleaner Thread Count sunucu yapılandırmasının değerini artırın. Daha fazla bilgi için bkz. Sunucu yapılandırması: ADR Cleaner Thread Sayısı.
  • Mümkünse, sürüm temizleyicisinin ilerlemesi için iş yükünü durdurun.
  • Yüksek işlem durdurma oranı sorununu belirlemek ve çözmek için uygulamayı gözden geçirin. Durdurmalar, kilitlenmelerin yüksek oranından, yinelenen anahtarlardan, kısıtlama ihlallerinden veya sorgu süresinin aşılmasından kaynaklanabilir.
  • PVS temizleyicisinin gerektirdiği nesne düzeyi veya bölüm düzeyi IX kilitleriyle uyumlu olmayan kilitleri azaltmak için iş yükünü iyileştirin. Daha fazla bilgi için bakınız Kilit uyumluluğu.
  • SQL Server kullanıyorsanız PVS boyutunu denetlemek için ADR'yi yalnızca acil durum adımı olarak devre dışı bırakın. Bkz. ADR'yi Devre Dışı Bırak.
  • SQL Server kullanılıyorsa ve durdurulan işlem temizleme işlemi yakın zamanda başarıyla tamamlanmamışsa, VersionCleaner sorunları bildiren iletiler için hata günlüğünü denetleyin.
  • Temizleme tamamlandıktan sonra bile PVS boyutu beklendiği gibi küçültülmezse pvs_off_row_page_skipped_oldest_aborted_xdesid sütununu denetleyin. Büyük değerler, durdurulan işlemlerden satır sürümleri tarafından alanın hala kullanıldığını gösterir.

PVS boyutunu denetleme

Yüksek hacimli OLTP gibi yüksek hacimli DML deyimlerine (INSERT, UPDATE, DELETE, MERGE) sahip bir iş yükünüz varsa ve PVS boyutunun büyük olduğunu gözlemlerseniz, PVS boyutunu denetim altında tutmak için ADR Cleaner Thread Count sunucu yapılandırmasının değerini artırmanız gerekebilir. Daha fazla bilgi için SQL Server 2022'den (16.x) itibaren kullanılabilir olan Sunucu yapılandırması: ADR Temizleyici İş Parçacığı Sayısı bölümüne bakın.

SQL Server 2019'da (15.x) veya ADR Cleaner Thread Count yapılandırmasının değerinin artırılması PVS boyutunun yeterince azaltılmasına yardımcı olmazsa, iş yükü pvs temizleme işleminin alanı geri kazanabilmesi için bir bekleme/kurtarma süresi gerektirebilir.

PVS temizleme işlemini iş yükleri arasında veya bakım süreleri sırasında manuel olarak etkinleştirmek için sys.sp_persistent_version_cleanupsistem saklı yordamını kullanın.

Örneğin:

EXEC sys.sp_persistent_version_cleanup [WideWorldImporters];

Etkin bir işlem PVS temizleme işleminin başlatılmasını engelleyebilir. Bu durumda, sys.sp_persistent_version_cleanup saklı yordamı çalıştıran oturum PVS_CLEANUP_LOCK bekleme türüyle bekler. İşlemin tamamlanmasını bekleyebilir veya mümkünse etkin bir işlemle engelleyici oturumunu sonlandırmayı düşünebilirsiniz.

Temizlik hatalarını yakala

SQL Server 2022(16.x) sürümünden başlayarak, önemli PVS temizleme iletileri hata günlüğüne kaydedilir. Temizleme istatistikleri, tx_mtvc2_sweep_statsgenişletilmiş olay tarafından da bildirilir.

Bilinen sorunlar

  • SQL Server 2025 (17.x) Önizleme sürümünde, içinde tempdb ADR etkinleştirildiğinde ve geçici tablolar yüksek hızda oluşturulup bırakıldığında (veya kesildiğinde), sistem tablosundaki mandal çekişmesi sys.sysseobjvalues nedeniyle iş yükü aktarım hızı önemli ölçüde azaltılabilir. Bu sorun araştırılıyor. Sonraki bir sürüm için bir düzeltme planlanıyor.