Giới thiệu
Trong một bài viết trước, chúng tôi đã nhấn mạnh rằng cơ sở dữ liệu msdb thực tế lưu trữ tất cả các đối tượng liên quan đến tự động hóa. Trong bài viết này, chúng tôi sẽ xem xét trường hợp di chuyển các công việc và đối tượng giữa các phiên bản SQL Server.
Hãy bắt đầu với danh sách các đối tượng được lưu trữ trong msdb trên phiên bản SQL Server này.
Chúng tôi có một số công việc được tạo với kế hoạch bảo trì (xem bài viết Tạo kế hoạch bảo trì trong SQL Server). Chúng tôi cũng có hai cảnh báo và một nhà điều hành. Msdb cũng lưu trữ các cảnh báo và toán tử (xem Hình 1). Chúng tôi sẽ xóa các đối tượng này và sau đó khôi phục chúng bằng cách khôi phục bản sao lưu của cơ sở dữ liệu msdb.
Xem các đối tượng được lưu trữ trong msdb
Nếu chúng tôi truy vấn các đối tượng hệ thống có liên quan, chúng tôi cũng thấy các đối tượng này được trả về dưới dạng tập kết quả. (Xem Liệt kê 1, Hình 2). Msdb cũng lưu trữ danh mục hệ thống với hồ sơ công việc, nhật ký sao lưu, người vận hành, nơi bảo trì, thư cơ sở dữ liệu và các mục khác liên quan đến tự động hóa.
-- Listing 1: Check List of Jobs in the Instance
use msdb
go
select @@SERVERNAME as ServerName
select name from sysjobs;
msdb sao lưu
Để minh họa khái niệm cho một phiên bản SQL Server, trước tiên chúng tôi thực hiện một bản sao lưu của cơ sở dữ liệu msdb. Trong các tình huống sản xuất, việc sao lưu thường xuyên cơ sở dữ liệu hệ thống nên là một phần trong chiến lược của bạn. Chúng thường đủ nhỏ để phù hợp với lịch trình sao lưu đầy đủ hàng ngày một cách thoải mái.
Tất nhiên, khi tôi tham chiếu đến cơ sở dữ liệu hệ thống, điều này không bao gồm tempdb cần thiết. Hơn nữa, cũng có thể không cần sao lưu hàng ngày cho cơ sở dữ liệu mô hình - sao lưu hàng tuần là đủ. Để có bản sao lưu hàng ngày đầy đủ, hãy xem xét bản chính và msdb.
Sử dụng mã đơn giản trong Liệt kê 2, chúng tôi tạo một bản sao lưu của cơ sở dữ liệu msdb.
-- Listing 2: Backup msdb Database
backup database msdb to disk = 'E:\DriveF\msdb_18072020.bak';
Bỏ việc
Sau khi sao lưu đã sẵn sàng, chúng tôi bỏ các công việc trên phiên bản. Lưu ý rằng việc loại bỏ các công việc được tạo bởi một kế hoạch bảo trì đòi hỏi phải xóa các kế hoạch bảo trì đã tạo ra chúng (Xem Hình 3).
Các công việc thông thường có thể được loại bỏ bằng cách xóa chúng bằng GUI. Một cách khác là chạy mã từ Liệt kê 3, theo sau là mã từ Liệt kê 4.
Liệt kê 3 tạo tập hợp các tập lệnh cần thiết để bỏ các công việc. Sau đó, trong Liệt kê 4, chúng tôi thực thi các tập lệnh được tạo trong Liệt kê 3.
Bạn có thể sử dụng phương pháp này mặc dù tên công việc trong trường hợp của bạn có thể khác với tên của tôi.
-- Listing 3: Generate Script to Drop Jobs
USE [msdb]
GO
select 'EXEC msdb.dbo.sp_delete_job @job_name=N''' + [name] + ''', @delete_unused_schedule=1' from sysjobs;
GO
-- Listing 4: Drop SQL Agent Jobs
EXEC msdb.dbo.sp_delete_job @job_name=N'DB1_BackupTransactionLog', @delete_unused_schedule=1
EXEC msdb.dbo.sp_delete_job @job_name=N'syspolicy_purge_history', @delete_unused_schedule=1
Sau khi bỏ công việc, chúng tôi có thể xác minh rằng không còn công việc nào. Sử dụng cùng một tập lệnh, như được hiển thị trong Liệt kê 1. Chúng tôi xem xét hai cách cho kịch bản:
- Một người nào đó đã vô tình xóa công việc và các đối tượng tương tự trong một ví dụ.
- Chúng tôi muốn nhập các công việc từ một phiên bản này sang một phiên bản khác.
Khôi phục msdb
Chúng tôi bắt đầu hoạt động khôi phục bằng cách sử dụng tập lệnh từ Liệt kê 5. Trong tập lệnh đó, chúng tôi bắt đầu bằng cách đặt cơ sở dữ liệu thành chế độ người dùng đơn. Vì ai đó hoặc thứ gì đó (tài khoản SQL Agent?) Có thể đăng nhập vào cơ sở dữ liệu này, điều đó là cần thiết.
Sau đó, chúng tôi đưa ra lệnh “khôi phục” và đặt cơ sở dữ liệu msdb mới thành multi_user. Lưu ý rằng chúng tôi đã sử dụng tùy chọn REPLACE trong câu lệnh khôi phục. Nếu bạn đang di chuyển msdb sang một phiên bản mới, mệnh đề REPLACE sẽ là cần thiết. Nếu không có nó, SQL Server có thể trả về lỗi về bộ sao lưu không thuộc cơ sở dữ liệu msdb trên phiên bản.
-- Listing 5: Restore msdb database
use master
go
alter database msdb set single_user with rollback immediate;
GO
restore database msdb from disk = 'E:\DriveG\msdb_18072020.bak'
with replace;
GO
alter database msdb set multi_user;
GO
Khi hoạt động khôi phục hoàn tất, các công việc bị thiếu và các đối tượng khác sẽ trở lại. Họ hoàn chỉnh với lịch sử công việc tương ứng của họ. Tất cả các mối quan hệ giữa các công việc với cơ sở dữ liệu và các đối tượng khác đều nguyên vẹn. Các công việc hoạt động như thể không có ai và không có gì đã từng xóa chúng.
Kết luận
Chúng ta có thể dễ dàng di chuyển các công việc và các đối tượng tương tự từ phiên bản SQL Server này sang phiên bản SQL Server khác. Đối với điều đó, chúng tôi cần một quá trình sao lưu và khôi phục msdb. Tương tự, chúng tôi có thể khôi phục các đối tượng này trên phiên bản SQL Server nếu bị mất vì lý do nào đó.