Cách tốt để gọi nhiều công việc Đại lý SQL Server liên tục từ một công việc chính?


11

Tôi đã có một số công việc SQL Server Agent nên chạy tuần tự. Để giữ một cái nhìn tổng quan tốt đẹp về các công việc nên thực hiện, tôi đã tạo một công việc chính gọi các công việc khác bằng một cuộc gọi đến EXEC msdb.dbo.sp_start_job N'TEST1'. Kết sp_start_jobthúc ngay lập tức (Công việc Bước 1), nhưng sau đó tôi muốn công việc chính của mình phải đợi cho đến khi công việc TEST1kết thúc trước khi gọi công việc tiếp theo.

Vì vậy, tôi đã viết kịch bản nhỏ này bắt đầu thực thi ngay sau khi công việc được gọi (Công việc Bước 2) và buộc công việc chính phải đợi cho đến khi công việc phụ kết thúc:

WHILE 1 = 1
  BEGIN
    WAITFOR DELAY '00:05:00.000';

    SELECT *
    INTO   #jobs
    FROM   OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;',
           'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'',
           @execution_status = 0, @job_aspect = N''JOB''');

    IF NOT (EXISTS (SELECT top 1 * FROM #jobs))
      BEGIN
        BREAK
      END;

    DROP TABLE #jobs;

  END;

Điều này hoạt động đủ tốt. Nhưng tôi có cảm giác thông minh hơn và / hoặc an toàn hơn ( WHILE 1 = 1?) Nên có thể.

Tôi tò mò về những điều sau đây, hy vọng bạn có thể cung cấp cho tôi một số hiểu biết:

  • Các vấn đề với phương pháp này là gì?
  • Bạn có thể đề xuất một cách tốt hơn để làm điều này?

(Tôi đăng câu hỏi này StackOverflow đầu tiên, bởi vì tôi đã tập trung vào cải thiện của mã này. Tuy nhiên hợp lệ. Nhưng tôi đoán là người dân ở đây sẽ nói chung có điều thông minh hơn để nói về lý do tại sao tôi không nên cố gắng làm điều này theo cách tôi' m đang làm điều đó ngay bây giờ, hoặc cung cấp các lựa chọn thay thế tốt.)

EDIT (25 tháng 7)
Rõ ràng không có quá nhiều sai với kịch bản của tôi, theo số lượng câu trả lời thấp chỉ ra vấn đề với nó :-) Cách thay thế cho loại kịch bản này dường như là sử dụng một công cụ được thiết kế cho những điều này các tác vụ (như SQL Sentry Event Manager hoặc ...) - hoặc tự viết một công cụ như vậy. Chúng tôi sẽ không mua một công cụ như vậy tại công ty hiện tại của tôi, vì vậy bây giờ tôi sẽ chỉ sử dụng kịch bản.


Bạn đã xem việc có những công việc này là các bước trong công việc chính thay vì các công việc độc lập? Điều đó sẽ làm giảm sự phức tạp, đặc biệt nếu họ chỉ được gọi với nhau theo trình tự theo cách này ...
Aaron Bertrand

Đó là một sự cân bằng. Sẽ là bảo trì 'sạch hơn' nếu chúng ta thêm tất cả các công việc như các bước vào công việc chính, nhưng chúng ta sẽ mất rất nhiều tổng quan và khả năng chạy các công việc cụ thể theo cách thủ công khi chúng ta làm điều đó. Vì vậy, tôi chắc chắn đã xem xét nó, nhưng 'giải pháp' hiện tại có quá nhiều lợi thế - miễn là nó hoạt động.

Câu trả lời:


9

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc cho SQL Sentry.

Sản phẩm Trình quản lý sự kiện SQL Sentry của chúng tôi có một phương tiện được xây dựng chính xác cho việc này: để xâu chuỗi các công việc và sắp xếp chúng theo các đơn đặt hàng quy trình công việc khác nhau.

Tôi đã bắt đầu sử dụng SQL Sentry từ nhiều năm trước, trước khi tôi gia nhập công ty, để làm chính xác điều này. Điều tôi muốn là một cách để bắt đầu công việc khôi phục trên máy chủ thử nghiệm của chúng tôi ngay sau khi quá trình sao lưu sản xuất kết thúc.

Những gì tôi đã thực hiện ban đầu chỉ là một bộ đệm đáng kể giữa thời gian bắt đầu công việc sao lưu và thời gian bắt đầu khôi phục. Điều này không chính xác hoàn toàn; vì thời gian sao lưu thay đổi, bộ đệm thường khiến chúng ta lãng phí thời gian khi việc khôi phục không bắt đầu mặc dù nó có thể có. Và đôi khi bộ đệm không đủ.

Những gì tôi đã thực hiện tiếp theo tương tự như những gì bạn có - Tôi đã viết một công việc trên máy chủ thử nghiệm bắt đầu ngay sau khi sao lưu theo lịch trình và tiếp tục bỏ phiếu để xem khi nào công việc kết thúc. Điều đó sau đó đã được sửa đổi để chỉ có một bước thứ hai trong công việc sao lưu đã cập nhật một bảng trên máy chủ thử nghiệm. Không thực sự khác biệt nhiều, ngoại trừ công việc khôi phục chỉ phải xem một bảng cục bộ thay vì theo dõi lịch sử công việc từ xa. Nghĩ lại điều này có thể là một kích hoạt trên bảng đó được gọi là sp_start_jobvì vậy công việc không phải chạy mỗi n phút (hoặc được lên lịch cả).

Giải pháp cuối cùng là xâu chuỗi các công việc lại với nhau ... khi sao lưu trên máy chủ A kết thúc, Trình quản lý sự kiện bắt đầu công việc khôi phục trên máy chủ B. Và nếu có công việc thứ ba và công việc thứ tư hoặc logic có điều kiện dựa trên những việc cần làm khi một công việc thất bại so với thành công, v.v., tất cả điều này có thể được tính đến. Trình thiết kế quy trình công việc sẽ nhắc nhở bạn khá nhiều về SSIS:

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

Tất nhiên, cơ chế cơ bản của những gì tôi mô tả không phải là phẫu thuật tên lửa. Bạn có thể tự viết kiểu quấn dây xích này nếu bạn ngồi xuống và làm nó. Chỉ cần cung cấp cho bạn một giải pháp thay thế mà bạn không cần phải làm.


2

Vấn đề chính với cách tiếp cận của bạn là bạn phải liên tục lặp vòng cho đến khi điều gì đó xảy ra (có thể là một thời gian rất dài hoặc thậm chí không bao giờ) và điều đó không hoàn toàn đúng. Đó là lý do tại sao tôi đoán bạn đang đặt câu hỏi.

Vì vậy, làm thế nào về việc sử dụng một cách tiếp cận dựa trên dữ liệu cho vấn đề của bạn? Ví dụ: tạo bảng 'kiểm toán' mà mỗi công việc ghi vào khi nó bắt đầu và kết thúc:

Tên công việc | Thời gian bắt đầu | Thời gian kết thúc
--------- + ------------------- + ------------------
Kiểm tra1 2012-07-26 07:30 2012-07-26 07:35

Tạo bảng 'xử lý' liệt kê tất cả các công việc và thứ tự mà chúng cần được thực hiện trong:

Tên công việc | Chạy lệnh
--------- + ---------
Kiểm tra1 | 1
Kiểm tra2 | 2
Kiểm tra 3 | 3

Tạo một trình kích hoạt chèn trên bảng kiểm toán, để khi một công việc hoàn thành và bản ghi kiểm toán được chèn, trình kích hoạt sẽ truy vấn bảng xử lý cho công việc tiếp theo (bằng Run Order) và sau đó khởi chạy nó.

Những lợi ích của phương pháp này là:

  1. Nó khá đơn giản để phát triển và duy trì.
  2. Nó cung cấp khả năng thêm các công việc mới hoặc thay đổi thứ tự các công việc hiện có thông qua bảng xử lý mà không phải thay đổi một dòng mã.
  3. Bảng kiểm toán cung cấp một số khả năng hiển thị khi mọi thứ đã xảy ra.
  4. Nó không lãng phí chu kỳ CPU. Kích hoạt sẽ chỉ bắn khi có điều gì đó đã xảy ra.
  5. cảm thấy 😉 đúng

HTH


1
Cảm ơn rất nhiều, yêu câu trả lời của bạn! Tôi chắc chắn sẽ thử cái này!
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.