Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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şlemler
- Uzun süre çalışan etkin anlık görüntü taramaları
- İkincil çoğaltmalarda uzun süreli sorgular
- iptal edilen işlemler
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:
- SQL Server yavaş çalışan sorgularda sorun giderme
- Azure SQL Veritabanı sorgu performansı sorunlarının algılanabilir türleri
- SQL Server ve Azure SQL Yönetilen Örneği'nde sorgu performansı sorunlarının algılanabilir türleri
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. 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ı tempdb
sü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 yerineSNAPSHOT
gibi 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_ghosts
iç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_id
değ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_stats
geniş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şmesisys.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.
İlgili içerik
- hızlandırılmış veritabanı kurtarma
- Hızlandırılmış veritabanı kurtarmayı yönetme
- sys.dm_tran_persistent_version_store_stats
- sys.sp_persistent_version_cleanup
- sys.dm_tran_iptal_edilen_işlemler