Database Grup Ketersediaan yang Didistribusikan SQL Server tidak menyinkronkan setelah server reboot

22

Kami sedang bersiap-siap untuk melakukan peningkatan besar pada SQL Server kami dan memperhatikan beberapa perilaku yang tidak biasa dengan Grup Ketersediaan yang Didistribusikan yang saya coba selesaikan sebelum bergerak maju.

Bulan lalu, saya memutakhirkan server sekunder jarak jauh dari SQL Server 2016 ke SQL Server 2017. Server ini adalah bagian dari beberapa Grup Ketersediaan Terdistribusi (DAG) dan Grup Ketersediaan (AG) terpisah . Ketika kami memutakhirkan server ini, kami tidak menyadari bahwa itu akan masuk ke keadaan tidak terbaca , jadi selama sebulan terakhir kami hanya mengandalkan server utama.

Sebagai bagian dari pembaruan yang akan datang, saya menerapkan patch CU 4 ke server dan mem-boot-ulangnya. Ketika server kembali online, sekunder just-patched menunjukkan semua DAG / AG sedang disinkronkan tanpa masalah.

Namun, yang utama menunjukkan kisah yang sangat berbeda. Itu melaporkan itu

  • AG terpisah sedang disinkronkan tanpa masalah
  • tapi DAGs berada di Tidak Synchronzing / Tidak Sehat negara

Setelah awalnya panik, saya mencoba hal-hal berikut untuk menyinkronkan hal-hal lagi di DAG:

  • Dari primary, saya berhenti dan melanjutkan pergerakan data. Ini tidak mulai menyinkronkan data.
  • Pada yang kedua (yang baru saya tambal) saya berlari ALTER DATABASE [<database] SET HADR RESUME;- yang mengeksekusi tanpa kesalahan, tetapi tidak melanjutkan sinkronisasi apa pun

Upaya terakhir saya untuk menyinkronkan data lagi adalah login ke sekunder, dan secara manual restart layanan SQL Server. Memulai ulang layanan secara manual tampaknya agak ekstrem, karena saya perkirakan server yang dibooting ulang sudah cukup.

Adakah yang mengalami masalah ini ketika DAG tidak mulai menyinkronkan ke sekunder setelah reboot? Jika demikian, bagaimana cara mengatasinya?

Saya memeriksa log kesalahan SQL Server, dan penampil acara di server sekunder, tidak ada yang luar biasa yang bisa saya lihat.

Taryn
sumber
Saya tidak pernah menggunakan SQL 2017 dalam produksi, tetapi apakah ini mendukung AG antara level SQL yang lebih rendah? Setiap versi lain Anda dapat mengatur AlwaysOn di antara versi yang berbeda, tetapi begitu Anda me-reboot primer Anda dan gagal ke versi SQL yang lebih tinggi itu akan menghentikan proses sinkronisasi.
Alen

Jawaban:

8

Harap dicatat, ini bukan jawaban yang pasti tetapi itu adalah jawaban terbaik setelah mengobrol dengan Taryn .

Namun, yang utama menunjukkan kisah yang sangat berbeda. Dilaporkan bahwa AG terpisah sedang disinkronkan tanpa masalah tetapi DAG berada dalam kondisi Tidak Sinkronisasi / Tidak Sehat

Jika basis data dan AG individu yang mendasari ag terdistribusi mengatakan mereka sehat dan menyinkronkan, ada kemungkinan bagus ini hanya masalah di DMV dan / atau dasbor SSMS. Karena tidak ada dalam errorlog untuk menyarankan replika tidak terhubung atau dalam keadaan terputus.

Sayangnya karena masalah telah diselesaikan, sulit untuk mengatakan dengan tepat apa itu ... tetapi di masa depan jika ini terjadi pada seseorang:

  • Periksa sys.dm_hadr_database_replica_states pada semua kluster yang mencari apa pun yang tidak sehat. Jika semua menunjukkan sehat, mungkin DMV belum diperbarui
  • Jika tidak sehat periksa errorlog / DMV untuk masalah konektivitas (seperti tidak dapat terhubung ke forwarder / global primer)
  • Jawaban Dan menyebutkan masalah yang bisa muncul dari startup basis data - meskipun dalam kasus ini instance tidak dapat dibaca sehingga kemungkinan besar bukan masalah tetapi bisa dalam kasus Anda
  • Jika database dapat dibaca, uji asap dengan tabel dummy / masukkan atau ...
  • Sesi acara diperpanjang menggunakan item saluran DEBUG sqlserver.hadr_dump_log_blockatau sqlserver.hadr_apply_log_blockuntuk melihat apakah sekunder benar-benar menerima / menerapkan blok log atau ...
  • Obyek perfmon SQLServer:Database Replica\Log Bytes Received/sec

Jika Anda menerima data pada sekunder itu tetapi ag didistribusikan masih menunjukkan tidak menyinkronkan atau tidak sehat maka saya akan membiarkannya untuk melihat apakah nilai DMV berubah karena jelas menerima dan memproses blok log.

Namun, jika tidak maka kita perlu menyelidiki lebih lanjut yang berada di luar jangkauan jawabannya.

Sean mengatakan Hapus Sara Chipps
sumber
4

Saya akan mengawali ini semua dengan peringatan bahwa saya tidak memiliki DAG dalam produksi. Meskipun pada dasarnya saran ini harus berlaku antara AG dan DAG.

Apakah sinkronisasi dilanjutkan setelah layanan restart? Jika demikian maka tebakan terbaik saya untuk penyebabnya adalah pemblokiran pada redo SPID. Jika masih tidak menyinkronkan bahkan setelah restart, inilah yang akan saya periksa pertama kali:

Memblokir AG mengulangi SPID

Umumnya hanya akan terjadi pada sekunder yang dapat dibaca. Untuk memeriksa, jalankan yang berikut:

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

Jika ada DB STARTUPSPID pemblokiran yang muncul, Anda harus membunuhnya sebelum yang kedua dapat dilanjutkan ( SPID yang menangani operasi yang diulang). Saya sarankan meninjau SPID pemblokiran terlebih dahulu untuk mencoba dan menentukan penyebabnya (biasanya laporan berjalan lama).

Jika Anda ingin informasi lebih lanjut tentang ini, ada artikel bagus (termasuk pemantauan untuk jenis perilaku ini menggunakan XE) di sini .

Periksa DMV

Jika perpindahan data ditangguhkan, Anda dapat merujuk ke DMV untuk mendapatkan informasi lebih lanjut tentang alasan penangguhan. Jalankan yang berikut ini:

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

The Artikel BOL menjelaskan suspend_reason sedikit lebih jauh.

Dan
sumber
0

Apakah Grup Ketersediaan Terdistribusi (DAG) Anda terbagi antara wilayah yang berbeda? Jika demikian, Anda mungkin menderita karena nilai SESSION_TIMEOUT default (10 detik) terlalu rendah. Ini berarti bahwa latensi antara kedua wilayah terlalu tinggi untuk menyelesaikan sinkronisasi yang andal.

Grup ketersediaan normal dapat memiliki nilai SESSION_TIMEOUT meningkat untuk membuat sesi sinkronisasi lebih stabil. Saya perhatikan akhir tahun lalu bahwa parameter SESSION_TIMEOUT dari DAG tidak dapat diedit. Ini berarti bahwa DAG hanya layak untuk skenario latensi rendah. Kami mencatat tiket dengan Microsoft dan awal tahun ini perbaikan terbaru dirilis.

Peningkatan: Mengkonfigurasi nilai SESSION_TIMEOUT untuk replika Grup Ketersediaan Terdistribusi di SQL Server 2016 dan 2017

Nikos Kyriacou
sumber