Hasil SSMS dan Server Terdaftar

8

Latar belakang :

Kami mencoba membuat AG "harness test" utama untuk salah satu tim pendukung kami. Tidak mengetahui server mana pada waktu tertentu akan menjadi yang utama mereka telah diperintahkan untuk mengeksekusi TSQL terhadap kelompok server terdaftar. Grup server terdaftar terdiri dari semua server di AG. Tujuannya adalah hanya menjalankan TSQL di server utama saat ini:

Test Harness saat ini :

IF EXISTS (SELECT *
FROM sys.dm_hadr_availability_replica_states AS HARS 
INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id 
    WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME))
BEGIN
<<SOME CODE TO EXECUTE>>
END

Masalah :

Jika server pertama yang merespons kembali ke kueri multi-server tidak mengembalikan hasil apa pun, SSMS akan menganggap set hasil yang tepat tidak ada set hasil, bahkan jika server lain kemudian kembali dengan set hasil. Jadi dalam skenario ini, tidak ada hasil yang dikembalikan ... ini tidak benar dan bukan fungsi yang diharapkan.

Adakah yang bisa memikirkan cara, dengan SSMS (ini adalah alat yang paling akrab bagi tim CS), untuk memaksa eksekusi hanya pada server utama saat ini?

Harry
sumber
Sudahkah Anda mempertimbangkan untuk menghubungkan mereka ke pendengar AG, sehingga menjalankan kueri seperti itu? Ini akan memastikan selalu mengenai yang utama.
Nic
Sayangnya, ini tidak mungkin. Kami memiliki banyak penyewa dengan pendengar yang bernama identik. Tidak akan berhasil dalam kasus ini.
Harry

Jawaban:

10

Saya telah mengalami ** ini sebelumnya, dan jika saya ingat dengan benar, untuk memastikan selalu mendapatkan hasil dengan permintaan multi-server Anda perlu memaksakan hasil kosong yang ditetapkan ketika tidak ada baris yang akan dikembalikan. Artinya, Anda memerlukan ELSEcabang tentang itu IFdan di dalam ELSEAnda akan melakukan sesuatu seperti berikut:

SELECT CONVERT(DATETIME, NULL) AS [Col1name],
       CONVERT(DECIMAL(12, 5), NULL) AS [Col2name],
       ...{additional fields}...
WHERE  1 = 0;

Ini menghasilkan set hasil kosong yang memiliki nama dan tipe data yang tepat.

ATAU, dan saya belum pernah mencoba ini di masa lalu (hanya memikirkannya saat saya mengetik ini), tetapi Anda mungkin bisa lolos dengan hanya menjeda di ELSEcabang itu sehingga server utama / yang dimaksudkan diperbolehkan untuk selalu mengembalikan nya hasil ditetapkan pertama (yang merupakan masalah sebenarnya di sini: server pertama yang merespons menetapkan struktur yang harus dipatuhi semua tanggapan lainnya). Karenanya, berikut ini mungkin berfungsi sebagai satu-satunya hal di ELSE:

WAITFOR DELAY '00:00:10'; -- 10 seconds (just needs to be longer than the real query takes)

Tapi saya tidak ingat jika server lain tidak mengembalikan hasil sama sekali menyebabkan pesan kesalahan ditampilkan di tab "Pesan". Jika itu terjadi, maka set hasil kosong pasti cara untuk pergi. Tetapi jika ini berhasil, maka ini mungkin bekerja lebih baik di template umum (seperti kasus Anda tampaknya) karena tidak perlu menyesuaikan paksa, hasil kosong yang ditetapkan setiap kali digunakan.

MEMPERBARUI:

OP memverifikasi bahwa:

  • yang WAITFOR DELAYmemang bekerja, dan
  • replika melaporkan pesan kesalahan, tetapi itu tidak menimbulkan masalah untuk penggunaan OP

** Situasi yang saya temui mirip, tetapi tidak ada hubungannya dengan Grup Ketersediaan atau menginginkan hasil dari hanya satu server. Situasi kami adalah bahwa kami memiliki 18 server dengan skema yang sama dengan data yang berbeda dan perlu melakukan berbagai tugas pemeliharaan, agregasi di seluruh 18 node. Ada beberapa prosedur tersimpan yang, untuk alasan apa pun, kadang-kadang tidak mengembalikan set hasil apa pun, dan apa pun alasannya itu tidak dapat diperbaiki dalam prosedur tersimpan. Jadi, tergantung pada simpul mana yang kembali lebih dulu, sebagian besar waktu semuanya baik-baik saja, tetapi sesekali simpul yang kadang-kadang kembali tidak ada hasil yang disetel dikembalikan terlebih dahulu. Jadi, saya harus melakukan sesuatu seperti membuang hasil ke tabel temp dan jika @@ROWCOUNTitu INSERT...EXECadalah 0, maka saya akan memilih paksa, kosong hasil yang ditetapkan.

Solomon Rutzky
sumber
2
Akan pernah memikirkan itu !! Menunggu penundaan berfungsi seperti jagoan! Pasti menghemat dari membangun hasil kosong yang ditetapkan. You do man @srutzky Terima kasih
Harry
@ Harry Anda dipersilakan, dan terima kasih :-). Saya baru saja memperbarui jawaban saya untuk menjadi sedikit lebih jelas tentang manfaat dari WAITFOR DELAYpendekatan dan bahwa Anda mengonfirmasi itu berhasil, jadi terima kasih untuk itu!
Solomon Rutzky
1
Itu hal paling keren yang saya lihat minggu ini.
Brent Ozar
Itu pasti melempar kesalahan pada replika, namun dalam hal ini benar-benar baik-baik saja.
Harry
@ Harry Terima kasih lagi untuk memberikan umpan balik itu. Saya telah menambahkannya ke jawaban saya, bersama dengan penjelasan di bagian bawah situasi yang saya temui.
Solomon Rutzky
0

Saya selalu menggunakan tabel temp untuk mengembalikan hasil untuk mendapatkan respons yang konsisten dari semua server dalam grup. Kueri multi server adalah salah satu hal favorit saya tentang SSMS.

Tony
sumber