SSMS và kết quả máy chủ đã đăng ký


8

Bối cảnh :

Chúng tôi đang cố gắng tạo ra một khai thác thử nghiệm "là chính" cho một trong các nhóm hỗ trợ của chúng tôi. Không biết máy chủ nào tại bất kỳ thời điểm nào sẽ là máy chủ chính mà họ được hướng dẫn thực hiện TSQL đối với nhóm máy chủ đã đăng ký. Nhóm máy chủ đã đăng ký bao gồm tất cả các máy chủ trong AG. Mục tiêu là chỉ thực hiện TSQL trên máy chủ chính hiện tại:

Khai thác thử nghiệm hiện tại :

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

Vấn đề :

Nếu máy chủ đầu tiên phản hồi lại truy vấn đa máy chủ không trả về bất kỳ kết quả nào, SSMS sẽ cho rằng tập kết quả đúng không phải là tập kết quả, ngay cả khi các máy chủ khác quay lại với tập kết quả. Vì vậy, trong kịch bản này, không có kết quả nào được trả về ... điều này không chính xác và không phải là chức năng mong đợi.

Có ai có thể nghĩ ra một cách, với SSMS (đây là công cụ quen thuộc nhất với nhóm CS), chỉ buộc thực thi trên máy chủ chính hiện tại không?


Bạn đã xem xét việc họ kết nối với người nghe AG, do đó chạy truy vấn theo cách đó? Nó sẽ đảm bảo luôn luôn đánh chính.
Nic

Thật không may, điều này là không thể. Chúng tôi có một tấn người thuê với người nghe được đặt tên giống hệt nhau. Chỉ không làm việc trong trường hợp này.
Harry

Câu trả lời:


10

Tôi đã chạy vào ** này trước đây và nếu tôi nhớ chính xác, để đảm bảo luôn nhận được kết quả với các truy vấn nhiều máy chủ, bạn cần buộc một tập kết quả trống khi không có hàng nào được trả về. Có nghĩa là, bạn cần một ELSEnhánh trên đó IFvà trong phạm vi ELSEbạn sẽ làm một cái gì đó như sau:

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

Điều này tạo ra một tập kết quả trống có tên và kiểu dữ liệu thích hợp.

HOẶC và tôi đã không thử điều này trong quá khứ (chỉ nghĩ về nó khi tôi gõ cái này), nhưng bạn thể thoát khỏi việc dừng lại ở ELSEnhánh đó để máy chủ chính / dự định luôn được phép trả lại kết quả được đặt trước (đây là vấn đề thực sự ở đây: máy chủ đầu tiên phản hồi xác định cấu trúc mà tất cả các phản hồi khác phải tuân thủ). Do đó, những điều sau đây có thể hoạt động như là điều duy nhất trong ELSE:

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

Nhưng tôi không nhớ nếu việc các máy chủ khác không trả lại kết quả nào khiến thông báo lỗi được hiển thị trong tab "Tin nhắn". Nếu điều đó xảy ra, thì tập kết quả trống chắc chắn là con đường để đi. Nhưng nếu điều này không hoạt động, thì nó có thể hoạt động tốt hơn trong một mẫu chung (giống như trường hợp của bạn) vì nó sẽ không yêu cầu điều chỉnh kết quả trống, bắt buộc được đặt mỗi khi nó được sử dụng.

CẬP NHẬT:

OP đã xác minh rằng:

  • những WAITFOR DELAYđã thực sự làm việc, và
  • các bản sao đã báo cáo thông báo lỗi, nhưng nó không gây ra vấn đề gì cho việc sử dụng của OP

** Tình huống tôi gặp phải tương tự, nhưng không liên quan gì đến Nhóm sẵn có hoặc muốn có kết quả từ chỉ một máy chủ. Tình huống của chúng tôi là chúng tôi có 18 máy chủ có cùng một lược đồ dữ liệu khác nhau và cần thực hiện các nhiệm vụ bảo trì khác nhau, tập hợp trên tất cả 18 nút. Có một số thủ tục được lưu trữ, vì bất kỳ lý do gì, đôi khi không trả về bất kỳ tập kết quả nào và bất kỳ lý do nào đó không thể được sửa trong quy trình được lưu trữ. Vì vậy, tùy thuộc vào nút nào được trả về trước, hầu hết mọi thứ đều ổn, nhưng thỉnh thoảng nút đó đôi khi trả về không có kết quả nào được trả về trước. Vì vậy, tôi đã phải làm một cái gì đó như đổ kết quả vào một bảng tạm thời và nếu @@ROWCOUNTđó INSERT...EXEClà 0, thì tôi sẽ chọn tập kết quả bắt buộc, trống.


2
Sẽ không bao giờ nghĩ về điều đó !! Sự chờ đợi cho sự chậm trễ hoạt động như một nhà vô địch! Chắc chắn tiết kiệm từ việc xây dựng kết quả trống đặt ra. Bạn làm người đàn ông @srutzky Cảm ơn
Harry

@Harry Bạn được chào đón, và cảm ơn bạn :-). Tôi vừa cập nhật câu trả lời của mình để rõ ràng hơn một chút về lợi ích của WAITFOR DELAYphương pháp này và bạn đã xác nhận rằng nó đã hoạt động, vì vậy cảm ơn vì điều đó!
Solomon Rutzky

1
Đó là điều tuyệt vời nhất tôi thấy trong tuần này.
Brent Ozar

Nó chắc chắn ném một lỗi trên các bản sao, tuy nhiên trong trường hợp này điều này là hoàn toàn tốt.
Harry

@Harry Cảm ơn một lần nữa vì đã cung cấp phản hồi đó. Tôi đã thêm nó vào câu trả lời của mình, cùng với một lời giải thích ở dưới cùng của tình huống tôi gặp phải.
Solomon Rutzky

0

Tôi đã luôn sử dụng bảng tạm thời để trả về kết quả để nhận được phản hồi nhất quán từ tất cả các máy chủ trong một nhóm. Truy vấn nhiều máy chủ là một trong những điều yêu thích của tôi về SSMS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.