SQL Server Agent là một thành phần được sử dụng để tự động hóa các tác vụ cơ sở dữ liệu. Ví dụ:chúng tôi chỉ cần thực hiện bảo trì Chỉ mục trên máy chủ Sản xuất trong giờ không phải làm việc. Vì vậy, chúng tôi tạo một công việc SQL Server chạy bảo trì chỉ mục và lên lịch cho các giờ "tắt".
Khi chúng tôi cài đặt SQL Server, dịch vụ SQL Server Agent bị tắt. Đầu tiên, chúng tôi kích hoạt nó và khởi động nó theo cách thủ công. Sau đó, chúng tôi định cấu hình công việc SQL Server, sử dụng SQL Server Management Studio và các thủ tục được lưu trữ hệ thống của cơ sở dữ liệu MSDB.
Bài viết này giải thích cách tạo Công việc máy chủ SQL bằng cách sử dụng các thủ tục được lưu trữ hệ thống của cơ sở dữ liệu MSDB.
Hệ thống lưu trữ các thủ tục của cơ sở dữ liệu MSDB
SQL Server sử dụng những cái sau:
- sp_add_job :thủ tục để tạo một công việc mới. Nếu thành công, nó sẽ trả về @job_id. Các đối số sau đây có thể áp dụng:
- @job_name:Đây là một tên công việc duy nhất.
- @enabled:Công việc được bật hoặc tắt. Sau khi công việc được tạo, bạn có thể đặt giá trị của thông số là 1 để kích hoạt công việc.
- @notify_level_eventlog:Tham số này được sử dụng để viết trạng thái của Công việc SQL trong trình xem sự kiện của Windows.
Value | Mô tả |
0 | Kết quả của công việc sẽ không được ghi vào nhật ký sự kiện. |
1 | Nếu công việc thực hiện thành công, kết quả sẽ được ghi cho người xem sự kiện |
2 (giá trị mặc định) | Nếu công việc không thành công, kết quả và thông báo lỗi sẽ được ghi cho người xem sự kiện |
3 | Kết quả của công việc được viết cho người xem sự kiện. |
- @notify_level_email:Tham số này dùng để gửi email về kết quả Công việc SQL. Giá trị hợp lệ của tham số giống với giá trị đối số @notify_level_eventlog.
- @notify_level_page:Tham số này dùng để gửi thông báo máy nhắn tin về kết quả Công việc SQL. Giá trị hợp lệ của các tham số giống với giá trị đối số @notify_level_eventlog.
- @delete_level:Tham số này dùng để xóa công việc sau khi hoàn thành. Trong trường hợp này, giá trị của tham số phải là 1. Lưu ý rằng giá trị mặc định là 0; sau đó, nó sẽ không xóa công việc sau khi hoàn thành.
- @category_level:Tham số này cho biết các giá trị của danh mục công việc. Giá trị mặc định là NULL.
- @owner_login_name:Giá trị là tên miền hoặc Tên đăng nhập SQL của chủ sở hữu công việc.
2. Sp_add_jobserver: Thủ tục được lưu trữ này dùng để chỉ định máy chủ đích cho việc thực thi Công việc SQL. Thủ tục chấp nhận các đối số sau:
- @job_id:Nó là một UNIQUEIDENTIFIER của SQL Job. Giá trị mặc định của đối số này là NULL.
- @job_name:Đây là tên của Công việc SQL.
- @server_name:Đây là tên của máy chủ mà bạn muốn chạy Công việc SQL. Giá trị đối số mặc định có thể là máy chủ cục bộ (LOCAL) hoặc tên máy chủ đích.
3. sp_add_jobstep: Thủ tục được lưu trữ này hoạt động để thêm bước công việc trong SQL Job. Thủ tục sử dụng các đối số sau:
- @job_name:Tên công việc mà bạn đang thêm bước. Đó là một SYSNAME với NULL là giá trị mặc định.
- @step_name:Tên của bước. Đó là một SYSNAME với NULL là giá trị mặc định.
- @step_id:ID tuần tự của bước công việc. Nó là một số tăng dần không có khoảng cách. Đây là giá trị INT và giá trị mặc định là NULL.
- @cmdexec_success_code:Giá trị này được trả về bởi hệ thống con CmdExec. Nó cho biết việc thực thi lệnh có thành công hay không. Mã là giá trị int với giá trị mặc định là 0.
- @on_sucess_action:Giá trị này cho biết hành động sẽ được thực hiện sau khi bước công việc hoàn thành thành công. Các giá trị có thể là bất kỳ giá trị nào sau đây:
Giá trị | Mô tả |
1 | Thoát khỏi công việc và trở lại thành công |
2 | Thoát khỏi công việc và không quay lại được |
3 | Chuyển sang bước công việc tiếp theo |
4 | Chuyển đến id bước của on_success_step_id |
- @on_fail_action:chỉ định hành động cần thực hiện nếu các bước công việc không thành công. Đây là giá trị INT và giá trị mặc định là NULL.
- @retry_attempt:chỉ định số lần thử lại sau khi bước công việc bị lỗi. Đây là giá trị INT và giá trị mặc định là NULL.
- @retry_interval:đặt khoảng thời gian (phút) giữa hai lần thử lỗi bước Công việc SQL. Đây là giá trị INT và giá trị mặc định là NULL.
- @os_run_priasty:
- @Subsystem:chỉ định tên của hệ thống con được SQL Server Agent sử dụng để thực thi lệnh. Các giá trị hợp lệ như sau:
Giá trị hệ thống con | Mô tả |
CmdExec | Lệnh hệ điều hành hoặc tệp thực thi (*. exe, *. bat) |
PHÂN TÍCH | Truy vấn dịch vụ phân tích SQL Server, ví dụ:MDX, DMX. |
PHÂN TÍCH | Lệnh dịch vụ phân tích SQL Server, ví dụ:XMLA. |
SSIS | Gói dịch vụ tích hợp SQL Server. |
PowerShell | Lệnh hoặc tập lệnh PowerShell. |
T-SQL | Truy vấn T-SQL hoặc quy trình đã lưu trữ |
Phân phối | Đại lý phân phối bản sao SQL Server. |
Ảnh chụp nhanh | Tác nhân chụp nhanh bản sao SQL Server. |
LogReader | Tác nhân đọc nhật ký sao chép SQL Server. |
Queuereader | Trình đọc hàng đợi sao chép SQL Server. |
- @command:chỉ định lệnh mà SQL Server Agent Service sẽ thực thi thông qua hệ thống con. Kiểu dữ liệu là varchar (max) và giá trị mặc định là NULL.
- @Database_name:Chỉ định tên của cơ sở dữ liệu mà bạn muốn chạy lệnh. Tham số này hữu ích khi bạn đang chạy tập lệnh T-SQL bằng SQL Server Agent.
4. Sp_add_jobschedule: thủ tục được lưu trữ phục vụ để tạo lịch công việc SQL. Quy trình này sử dụng các đối số sau:
- @job_name:chỉ định tên của Công việc SQL. Lịch trình sẽ được thực hiện cho công việc SQL được chỉ định trong đối số @job_name.
- @name:tên của lịch trình. Kiểu dữ liệu là varchar và giá trị mặc định là NULL.
- @enabled:đặt 1 để bật lịch hoặc 0 để tắt lịch.
- @freq_type:cho biết thời gian thực hiện lệnh SQL. Kiểu dữ liệu của tham số là INT và giá trị mặc định là 0. Giá trị hợp lệ là bất kỳ giá trị nào sau đây:
Giá trị | Mô tả |
1 | Công việc sẽ chỉ được thực hiện một lần. |
4 | Hàng ngày. |
8 | Hàng tuần |
16 | Hàng tháng |
64 | Thực thi công việc khi Dịch vụ tác nhân SQL Server khởi động |
128 | Thực thi công việc SQL khi máy chủ không hoạt động. |
- @freq_interval:cho biết ngày thực hiện công việc SQL. Kiểu dữ liệu là INT và giá trị mặc định là 0. Giá trị phụ thuộc vào giá trị được chỉ định trong tham số @freq_type. Các giá trị hợp lệ là bất kỳ giá trị nào sau đây:
Value | Ảnh hưởng đến lịch trình công việc |
1 (Một lần) | @Freq_interval sẽ không được sử dụng. |
4 (Hàng ngày) | Mọi @freq_interval ngày |
8 | Giá trị của @Freq_interval có thể là bất kỳ giá trị nào sau đây: 1 =Chủ nhật 2 =thứ hai 4 =Thứ Ba 8 =thứ tư 16 =thứ năm 32 =Thứ sáu 64 =Thứ Bảy |
16 | Chạy công việc trên @Freq_interval ngày trong tháng |
64 | @Freq_interval sẽ không được sử dụng |
128 | @Freq_interval sẽ không được sử dụng |
- @freq_subday_type:chỉ định đơn vị của freq_subday_interval. Kiểu dữ liệu là INT và giá trị mặc định là NULL.
- @active_start_date:đặt ngày bạn muốn bắt đầu thực hiện công việc. Kiểu dữ liệu là INT và nó không có giá trị mặc định. Định dạng ngày là YYYYMMDD. Giá trị phải lớn hơn hoặc bằng 19900101.
- @active_end_date:chỉ định ngày dừng thực hiện công việc. Kiểu dữ liệu là INT, không có giá trị mặc định. Định dạng ngày là YYYYMMDD và giá trị phải lớn hơn hoặc bằng 19900101.
- @active_start_time:chỉ định thời gian bạn muốn bắt đầu thực hiện công việc. Kiểu dữ liệu là INT, không có giá trị mặc định. Định dạng thời gian là HHMMSS.
- @active_end_time:chỉ định thời gian bạn muốn dừng thực hiện công việc. Kiểu dữ liệu là INT, không có giá trị mặc định. Định dạng thời gian là HHMMSS.
Mã T-SQL để tạo Công việc SQL
Để minh họa các quy trình, chúng tôi sử dụng SQL Server 2019 trên máy trạm với AdventureWorks2017 cơ sở dữ liệu, được khôi phục từ bản sao lưu. Chúng tôi tạo một Công việc SQL có tên Sao lưu toàn bộ hàng ngày - nó tạo một bản sao lưu của AdventureWorks2017 cơ sở dữ liệu và sao chép nó trên C:\ Backups vị trí.
Đầu tiên, chúng ta phải kích hoạt các XP của Đặc vụ. Nó là một tùy chọn nâng cao. Do đó, trước tiên, chúng tôi bật tùy chọn cấu hình nâng cao và thành phần Agent XPs.
Để làm điều đó, hãy chạy truy vấn sau:
EXEC Sp_configure
'Show advanced options',
1
go
RECONFIGURE WITH override
EXEC Sp_configure
'Agent XPs',
1
go
RECONFIGURE WITH override
Sau khi Đại lý được kích hoạt, chúng tôi bắt đầu dịch vụ Đại lý.
Mở SQL Server Management Studio và kết nối với phiên bản SQL Server. Sau đó, nhấp chuột phải vào SQL Server Agent và nhấp vào Bắt đầu .
Sau khi khởi động Tác nhân, chúng ta có thể tạo công việc tác nhân SQL Server.
Như đã đề cập, chúng tôi sẽ tạo một công việc SQL để tạo bản sao lưu của AdventureWorks2017 cơ sở dữ liệu. Đối với điều này, chúng tôi chạy lệnh sau bằng SQL Server Agent.
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
Để tạo một Công việc SQL mới có tên Sao lưu toàn bộ hàng ngày, thực thi tập lệnh sau:
USE [msdb]
go
DECLARE @jobId BINARY(16)
EXEC msdb.dbo.Sp_add_job
@job_name=N'Daily Full Backup',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_page=2,
@delete_level=0,
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'NISARG-PC\Nisarg',
@job_id = @jobId output
SELECT @jobId
go
Nó sẽ thực thi công việc trên máy trạm cục bộ của tôi. Do đó, chúng tôi thêm nó vào Máy chủ công việc.
Thực hiện truy vấn sau:
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
Bước công việc thực thi cơ sở dữ liệu sao lưu yêu cầu. Để định cấu hình bước công việc, hãy sử dụng mã sau:
USE [msdb]
go
EXEC msdb.dbo.Sp_add_jobstep
@job_name=N'Daily Full Backup',
@step_name=N'Generate Backup',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_fail_action=2,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0,
@subsystem=N'TSQL',
@command=
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
,
@database_name=N'master',
@flags=0
go
Công việc SQL sẽ chạy hàng ngày lúc 1:00 sáng. Để định cấu hình lịch biểu, hãy sử dụng mã sau:
USE [msdb]
go
DECLARE @schedule_id INT
EXEC msdb.dbo.Sp_add_jobschedule
@job_name=N'Daily Full Backup',
@name=N'Run Backup At',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=1,
@active_start_date=20200918,
@active_end_date=99991231,
@active_start_time=10000,
@active_end_time=235959,
@schedule_id = @schedule_id output
SELECT @schedule_id
go
Toàn bộ mã của công việc như sau:
USE [msdb]
go
DECLARE @jobId BINARY(16)
EXEC msdb.dbo.Sp_add_job
@job_name=N'Daily Full Backup',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_page=2,
@delete_level=0,
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'NISARG-PC\Nisarg',
@job_id = @jobId output
SELECT @jobId
go
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
USE [msdb]
go
EXEC msdb.dbo.Sp_add_jobstep
@job_name=N'Daily Full Backup',
@step_name=N'Generate Backup',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_fail_action=2,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0,
@subsystem=N'TSQL',
@command=
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
,
@database_name=N'master',
@flags=0
go
USE [msdb]
go
DECLARE @schedule_id INT
EXEC msdb.dbo.Sp_add_jobschedule
@job_name=N'Daily Full Backup',
@name=N'Run Backup At',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=1,
@active_start_date=20200918,
@active_end_date=99991231,
@active_start_time=10000,
@active_end_time=235959,
@schedule_id = @schedule_id output
SELECT @schedule_id
go
Trước tiên, chúng tôi chạy công việc theo cách thủ công cho phần trình diễn, bằng cách thực thi đoạn mã dưới đây:
use msdb
go
exec sp_start_job 'Daily Full Backup'
Bạn có thể xem trạng thái của công việc bằng cách chạy truy vấn sau:
SELECT NAME
AS [Job Name],
CONVERT(VARCHAR, Dateadd(s, ( run_time / 10000 ) * 60 * 60
+ ( ( run_time - ( run_time / 10000 ) *
10000 ) /
100 ) * 60
+ ( run_time - ( run_time / 100 ) * 100
), CONVERT(DATETIME, Rtrim(run_date), 113)), 100)
AS
[Job Executed Date and Time],
CASE
WHEN enabled = 1 THEN 'Enabled'
ELSE 'Disabled'
END
[Job Status],
CASE
WHEN JobHistory.run_status = 0 THEN 'Failed'
WHEN JobHistory.run_status = 1 THEN 'Succeeded'
WHEN JobHistory.run_status = 2 THEN 'Retry'
WHEN JobHistory.run_status = 3 THEN 'Cancelled'
ELSE 'Unknown'
END
[Job Outcome]
FROM sysjobhistory JobHistory
JOIN sysjobs Jobs
ON JobHistory.job_id = Jobs.job_id
WHERE NAME = 'Daily Full Backup'
Đầu ra:
Để xem tệp sao lưu, hãy mở C:\ Backups vị trí:
Như bạn có thể thấy, tệp sao lưu đã được tạo.