Kết nối có điều kiện trong SSIS dựa trên trạng thái Nhóm sẵn có


7

Tôi đang làm việc trên gói SSIS sẽ làm mới cơ sở dữ liệu dev từ bản sao lưu sản xuất. Gói đã được sử dụng trong nhiều năm, nhưng chúng tôi đang triển khai Nhóm khả dụng trên ví dụ nhà phát triển, vì vậy các tác vụ phải được thay đổi để hoạt động với cả bản sao chính và phụ. Bối cảnh: Tất cả các phiên bản là SQL Server 2014 SP2. Một phiên bản sản xuất (PD1), hai phiên bản dev (DV3 & DV7) và một phiên bản tiện ích (DV1), trong đó gói SSIS được triển khai cho SSISDB và nơi công việc Tác nhân SQL chạy. Trong gói SSIS, sau khi có được các bản sao lưu đầy đủ và đưa vào chia sẻ mạng từ sản xuất, bộ tác vụ tiếp theo (trong gói SSIS riêng) cần tìm ra nút nào lưu trữ bản sao chính. Tôi đang làm theo các bước được liệt kê ở đâyđể thực hiện công việc này và mọi thứ sẽ hoạt động tốt nếu nó được mã hóa cứng (điều này, tất nhiên sẽ không hoạt động nếu / khi xảy ra lỗi chuyển đổi). Cách duy nhất tôi có thể nghĩ về việc tiếp cận điều này là, trong thời gian chạy, đánh giá trường hợp nào là chính và sau đó tiến hành các tác vụ (trong đó, tất cả đều là các đối tượng "Thực thi tác vụ SQL" - yêu cầu định nghĩa kết nối của riêng chúng ). Tôi đã thấy một vài ví dụ về cách sử dụng biểu thức trong ConnectionStrings và các biến, nhưng không thể tìm ra cách đặt giá trị được trả về từ truy vấn bên dưới trong SQL Server để trả về thể hiện chính xác để đặt chuỗi kết nối trong gói.

    select cs.replica_server_name
from sys.dm_hadr_availability_replica_states rs
join sys.dm_hadr_availability_replica_cluster_states cs
    on rs.replica_id = cs.replica_id
join sys.dm_hadr_name_id_map n
    on rs.group_id = n.ag_id
where rs.role = 2
and n.ag_name = 'DVAG001'

Lý tưởng nhất, sẽ có hai trong số các trình quản lý kết nối này, một cho chính và một cho phụ, sau đó tôi có thể sử dụng trong các đối tượng "Thực thi tác vụ SQL". Sau đó, mọi thứ sẽ hoạt động hoàn hảo. Có thể có nhiều cách khác để làm điều này, nhưng tôi không có nhiều kinh nghiệm về SSIS hoặc phát triển ngoài TSQL.

CẬP NHẬT: Quá trình trên được thực hiện mỗi ngày ... đó là lý do tại sao tôi đang sử dụng gói SSIS và Tác nhân SQL. Vì vậy, toàn bộ quá trình phải được tự động hóa và có tất cả các giá trị cần thiết - đặc biệt là xác định trạng thái bản sao (chính và phụ) - bên trong gói để không cần can thiệp thủ công.

Câu trả lời:


8

Giả sử rằng bạn có một nhóm khả dụng chỉ với một bản sao thứ cấp (bạn có thể dễ dàng mở rộng mẫu này để có thêm bản sao)

1. Kết nối

Bạn sẽ cần 3 kết nối:

  • Trình nghe AG (để chạy truy vấn sẽ trả về máy chủ nào đang giữ chính là phụ)
  • Chính (được tham số hóa với máy chủ chính)
  • Thứ cấp (được tham số hóa với máy chủ thứ cấp)

2. Biến

Tạo 2 biến với chuỗi kiểu dữ liệu

  • Tên máy chủ
  • Tên máy chủ

nhập mô tả hình ảnh ở đây

3. Truy vấn

Để ánh xạ kết quả truy vấn được đặt thành một biến bằng Thực thi tác vụ SQL, truy vấn của bạn chỉ cần trả về một hàng. Bạn sẽ ánh xạ từng cột vào biến mà bạn muốn. Biết rằng, tôi đã thay đổi bạn truy vấn như sau:

WITH CTE_AGStatus as (
    select cs.replica_server_name, rs.role
    from sys.dm_hadr_availability_replica_states rs
    join sys.dm_hadr_availability_replica_cluster_states cs
        on rs.replica_id = cs.replica_id
    join sys.dm_hadr_name_id_map n
        on rs.group_id = n.ag_id
    where n.ag_name = 'DVAG001'
)

select  ServernamePrimary = MAX(case when role = 1 then replica_server_name end)
,       ServernameSecondary = MAX(case when role = 2 then replica_server_name end)
from CTE_AGStatus

(Hãy thoải mái thay đổi nó theo ý muốn, chỉ cần nhớ chỉ trả lại một hàng)

4. Ánh xạ tập kết quả thành các biến

Trên Trình soạn thảo tác vụ SQL thực thi, dán truy vấn ở trên, đặt kết nối OLEDB 'Trình nghe AG' và thay đổi tập kết quả thành 'Hàng đơn' Thực thi Trình soạn thảo tác vụ SQL - Tab Chung

Sau đó chuyển đến tab 'Tập kết quả' và ánh xạ các cột thành các biến Kết quả Đặt bản đồ thành biến

5. Thay đổi chuỗi kết nối

Nhấp vào trình quản lý kết nối 'Chính' và chuyển đến tab 'Thuộc tính', sau đó nhấp vào 'Biểu thức', chọn thuộc tính 'Tên máy chủ' và thêm biến của bạn vào Biểu thức.

nhập mô tả hình ảnh ở đây

Lặp lại quy trình với trình quản lý kết nối 'Thứ cấp'

6. Kiểm tra quy trình

Để xác thực, bạn có thể thêm các bước khác và sử dụng điểm dừng để kiểm tra xem các biến của bạn đang chạy như thế nào. Các bước tiếp theo là tùy thuộc vào bạn. Bây giờ bạn có một kết nối trỏ đến từng máy chủ của AG. nhập mô tả hình ảnh ở đây


Cái này thật tuyệt! Tôi sẽ thử nó và xem nếu nó làm những gì tôi cần. Cảm ơn bạn!
SQL_Hacker

Không có gì! Tôi rất vui vì tôi có thể hữu ích
Evandro

1
Đây là một câu trả lời tốt. Chào mừng bạn đến với trang web
Tom V - hãy thử topanswers.xyz

0

Là một chiến lược thay thế, tôi có thể xem xét đơn giản hóa mọi thứ mà không cần tham số SSIS bằng cách sử dụng thực thi T-SQL (không cần tham số). SSIS, đặc biệt là các gói cũ, dường như luôn có khả năng dễ bị lỗi và lỗi mà tôi không muốn chạm vào chúng nếu không cần thiết:

A Để bắt đầu, hãy xem xét việc chạy "Kiểm tra AG chính" của bạn trên chính các máy chủ sản xuất thay vì các máy chủ dev.

B. Sau đó, nhập các gói SSIS của bạn vào sản xuất nếu chúng chưa có ở đó - để được chạy ở đó. Người ta có thể xem xét dev khôi phục từ prod nhiều hơn của một quá trình sản xuất nào.

C. Và cuối cùng, tránh thay đổi các gói SSIS cũ của bạn càng nhiều càng tốt bằng cách chạy công việc Tác nhân T-SQL gọi lệnh thực thi gói SSIS (khôi phục cơ sở dữ liệu) từ mỗi AG chính "tiềm năng" bằng cách sử dụng mã sau - hoặc một cái gì đó tương tự - - như thể hiện trong Liệt kê A.

Liệt kê A: Chỉ thực hiện gói SSIS (khôi phục cơ sở dữ liệu) khi Máy chủ SQL là chính - thông qua công việc Tác nhân SQL.

--If current server is the primary AG then run the legacy package

if (select a.role_desc FROM sys.dm_hadr_availability_replica_states AS a JOIN sys.availability_replicas AS b  ON b.replica_id = a.replica_id WHERE b.replica_server_name like @@Servername) like 'Primary' 
begin
            Declare @execution_id bigint  
            EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', @execution_id=@execution_id OUTPUT, @folder_name=N'AlwaysOn', @project_name=N'MyTestPackage', @use32bitruntime=False, @reference_id=Null  
                exec ssisdb.catalog.start_execution @execution_id 
end

Ghi chú:

Nếu tôi hiểu bạn đúng, các máy chủ dev sẽ luôn được đặt tên giống nhau. Đó chỉ là tên máy chủ sản xuất có tiềm năng thay đổi. Do đó, tôi tin rằng mã hiển thị trong Liệt kê A sẽ cho phép bạn hoàn thành những gì bạn cần với ít thời gian và công sức hơn một chút. Bạn thậm chí có thể cõng thực hiện việc thực hiện này vào cuối các bản sao lưu SQL của mình để có được sự làm mới ngay lập tức hơn cho các môi trường dev.

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.