Sunucu yeniden başlatıldıktan sonra SQL Server Dağıtılmış Kullanılabilirlik Grubu veritabanları eşitlenmiyor


22

Biz gerçekleştirmek için hazır alıyoruz geniş yükseltme bizim SQL Sunucuları ve ben ileri gitmeden önce gidermek çalışıyorum o Distributed Durumu Grupları ile bazı sıradışı davranışı fark edilir.

Geçen ay, uzak bir ikincil sunucuyu SQL Server 2016'dan SQL Server 2017'ye yükselttim. Bu sunucu birden fazla Dağıtılmış Kullanılabilirlik Grubunun (DAG) ve ayrı bir Kullanılabilirlik Grubunun (AG) bir parçasıdır . Bu sunucuyu yükselttiğimizde, okunamayan bir duruma geleceğinin farkında değildik , bu nedenle geçen ay boyunca yalnızca birincil sunucuya güveniyorduk.

Yaklaşan güncellemenin bir parçası olarak, CU 4 yamasını sunucuya uyguladım ve yeniden başlattım. Sunucu tekrar çevrimiçi olduğunda, yeni eklenmiş ikincil tüm DAG'lerin / AG'lerin sorunsuz bir şekilde senkronize edildiğini gösterdi.

Ancak, birincil çok farklı bir hikaye gösteriyordu. Bunu rapor ediyordu

  • ayrı AG, sorunsuz bir şekilde senkronize edildi
  • ancak DAG'ler Senkronize Değil / Sağlıklı Değil durumundaydı

Başlangıçta panik yaptıktan sonra, DAG'lerde tekrar senkronize etmek için aşağıdakileri denedim:

  • Birinciden, veri hareketini durdurdum ve devam ettirdim. Bu, verileri senkronize etmeye başlamadı.
  • İkincilde (az önce eklememiştim) Koştum ALTER DATABASE [<database] SET HADR RESUME;- ki hatasız çalıştırılan, ancak herhangi bir senkronizasyona devam etmeyen

Verileri tekrar senkronize etmeye yönelik son denemem ikincil oturum açmak ve SQL Server hizmetini manuel olarak yeniden başlatmaktı. Sunucunun el ile yeniden başlatılması biraz aşırı görünüyor, çünkü sunucunun yeniden başlatılmasının yeterli olacağını düşünüyorum.

Bir DAG'ın bir yeniden başlatma işleminden sonra ikincil ile senkronize edilmeye başlamaması durumunda bu sorunu yaşayan var mı? Eğer öyleyse, nasıl çözüldü?

Hem SQL Server hata günlüğünü hem de ikincil sunucudaki olay görüntüleyiciyi kontrol ettim, normalden görebildiğim hiçbir şey yoktu.


SQL 2017'yi üretimde hiç kullanmadım, ancak daha düşük SQL seviyeleri arasında AG destekliyor mu? Diğer sürümler arasında AlwaysOn'ı farklı sürümler arasında kurabilirsiniz, ancak birincil sürümünüzü yeniden başlattıktan ve daha yüksek bir SQL sürümüne geçtiğinizde, senkronizasyon işlemini durduracaktır.
Alen

Yanıtlar:


8

Lütfen bunun kesin bir cevap olmadığını, ancak Taryn ile sohbet ettikten sonra en iyi cevap olduğunu unutmayın .

Ancak, birincil çok farklı bir hikaye gösteriyordu. Ayrı AG'nin sorunsuz bir şekilde senkronize edildiği, ancak DAG'lerin Senkronize Değil / Sağlıklı Değil durumunda olduğu rapor edildi.

Eğer dağıtılmış agın altındaki bireysel veri tabanları ve AG'ler sağlıklı ve senkronize olduklarını söylüyorlarsa, bunun DMV'ler ve / veya SSMS gösterge panolarında bir hıçkırık olması ihtimali yüksektir. Hata günlüğünde eşlemenin bağlantı kurmadığını veya bağlantısı kesilmiş durumda olduğunu gösteren hiçbir şey olmadığından.

Maalesef, sorun çözüldüğünden beri, tam olarak ne olduğunu söylemek zor ... ama gelecekte birileri için bu gerçekleşirse:

  • Sağlıklı olmayan bir şey arayan tüm kümelerde sys.dm_hadr_database_replica_states adresini kontrol edin . Her şey sağlıklı görünüyorsa, DMV henüz güncellenmemiş olabilir.
  • Sağlıksızsa, bağlantı sorunları için errorlog / DMV'leri kontrol edin (örneğin ileticiye / global primere bağlanamamak gibi)
  • Dan'in cevabı veri tabanı başlangıcından kaynaklanabilecek meselelerden bahseder; ancak bu durumda örnek okunamaz, bu nedenle büyük olasılıkla bir sorun değil ancak sizin durumunuzda olabilir
  • Veri tabanı okunabiliyorsa, sahte bir tablo / insert veya ... ile duman testi yapın.
  • DEBUG kanal öğelerini kullanarak uzatılmış olay oturumu sqlserver.hadr_dump_log_blockveya sqlserver.hadr_apply_log_blockikincil işlemin gerçekten kütük blokları alıp / alıp almadığını görmek için ...
  • Perfmon nesnesi SQLServer:Database Replica\Log Bytes Received/sec

Bu ikincil hakkında veri alıyorsanız, ancak dağıtılmış ag hala senkronize değil veya sağlıklı olmadığını gösteriyorsa, o zaman açıkça günlük bloklarını alıp işlediğinden DMV değerlerinin değişip değişmediğini görmek için biraz izin verdim.

Bununla birlikte, eğer öyleyse, cevabın kapsamı dışında kalanları daha fazla araştırmamız gerekecek.


4

Bunların hepsinde, üretimde hiç DAG olmadığını belirten ihtarla önsöz yapacağım. Temel olarak, bu öneri hem AG hem de DAG arasında geçerli olmalıdır.

Hizmet yeniden başlatıldıktan sonra senkronizasyon devam etti mi? Eğer öyleyse, nedenim hakkındaki en iyi tahminim SPo'yu tekrarlamaktan mahrum kalıyor. Yeniden başlattıktan sonra bile hala senkronize olmuyorsa, ilk önce kontrol edeceğim şey:

AG'nin engellenmesi SPID

Genellikle sadece okunabilir bir ikincilde gerçekleşir. Kontrol etmek için aşağıdakileri çalıştırın:

select session_id, blocking_session_id, db_name(database_id), wait_type
from sys.dm_exec_requests
where command = 'DB STARTUP'

Herhangi bir engelleyici DB STARTUPSPID belirirse, ikincil devam etmeden önce onları öldürmeniz gerekir ( SPID yineleme işlemlerini gerçekleştiren şeydir). Nedenini belirlemek ve engellemek için önceden engelleme SPID'sini gözden geçirmenizi öneririm (genellikle uzun süren bir rapor).

Bununla ilgili daha fazla bilgi istiyorsanız, burada (XE'leri kullanarak bu tür davranışların izlenmesi dahil) harika bir makale var .

DMV'leri kontrol et

Veri hareketi askıya alınırsa, askıya alma nedeni hakkında daha fazla bilgi almak için DMV'lere başvurabilirsiniz. Aşağıdakileri çalıştırın:

select db_name(database_id), synchronization_state_desc, database_state_desc, suspend_reason_desc
from sys.dm_hadr_database_replica_states

BOL makale biraz daha suspend_reason açıklanır.


0

Dağıtılmış Kullanılabilirlik Grubunuz (DAG) farklı bölgeler arasında bölünmüş mü? Öyleyse, varsayılan SESSION_TIMEOUT değerinden (10 saniye) çok düşük olmanız olabilir. Bu, iki bölge arasındaki gecikmenin, senkronizasyonu güvenilir bir şekilde tamamlamak için çok yüksek olduğu anlamına gelir.

Normal bir kullanılabilirlik grubu, senkronizasyon oturumlarını daha istikrarlı hale getirmek için SESSION_TIMEOUT değerinin artmasına neden olabilir. Geçen yılın sonlarında DAG'ın SESSION_TIMEOUT parametresinin düzenlenemediğini fark ettim. Bu, DAG’lerin yalnızca düşük gecikmeli senaryolar için uygun olduğu anlamına geliyordu. Microsoft'a bir bilet kaydettik ve bu yılın başlarında bir düzeltme yayımlandı.

İyileştirme: SQL Server 2016 ve 2017'de Dağıtılmış Kullanılabilirlik Grubu kopyası için SESSION_TIMEOUT değerini yapılandırma

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.