Trong các bài trước của loạt bài Cơ sở dữ liệu hệ thống SQL Server, chúng ta đã xem qua Cơ sở dữ liệu hệ thống được cài đặt theo mặc định trong quá trình Cài đặt SQL Server, hiểu mục đích của từng cơ sở dữ liệu hệ thống đó và khám phá cơ sở dữ liệu Tempdb và việc bảo trì nó một cách chi tiết hơn. Trong bài viết này, chúng ta sẽ khám phá cơ sở dữ liệu MSDB chi tiết hơn cùng với các vấn đề thường gặp xung quanh cơ sở dữ liệu MSDB và cách giải quyết chúng đúng cách.
Cơ sở dữ liệu MSDB
MSDB Cơ sở dữ liệu hệ thống SQL Server lưu trữ tất cả thông tin cấu hình quan trọng và thông tin lịch sử liên quan đến SQL Server Agent Service, SQL Server Service Broker, Database Mail, Log Shipping, Database Mirroring, v.v.:
- Dịch vụ tác nhân SQL Server
- Công việc Tác nhân SQL Server - Dữ liệu cấu hình và chi tiết Lịch sử
- Cảnh báo tác nhân SQL Server - Dữ liệu cấu hình
- Toán tử Tác nhân SQL Server - Dữ liệu cấu hình
- Proxy của SQL Server Agent - Dữ liệu cấu hình
- Thông tin liên quan
- Thư cơ sở dữ liệu SQL Server, bao gồm Nhà môi giới dịch vụ - Dữ liệu cấu hình và chi tiết nhật ký Thư lịch sử.
- Chi tiết về Sao lưu và Khôi phục Máy chủ SQL - Dữ liệu lịch sử của tất cả các sự kiện Sao lưu và Khôi phục Cơ sở dữ liệu xảy ra trong phiên bản của SQL Server.
- Kế hoạch bảo trì, Gói SSIS và thông tin liên quan - Dữ liệu cấu hình, dữ liệu liên quan và dữ liệu về việc thực thi tất cả các mục này thông qua SQL Server Agent Jobs.
- Cấu hình vận chuyển nhật ký, Hồ sơ tác nhân sao chép, Công việc của người thu thập dữ liệu - Dữ liệu cấu hình của tất cả các kỹ thuật Tính sẵn sàng cao đã đề cập.
Bất cứ khi nào bất kỳ cấu hình quan trọng nào ở trên được sửa đổi, bạn nên sử dụng Đầy đủ sao lưu cơ sở dữ liệu MSDB để tránh mất mát dữ liệu nếu xảy ra lỗi.
Mặc dù SQL Server Agent Service lưu trữ các chi tiết cấu hình quan trọng trên các bảng trong MSDB cơ sở dữ liệu, SQL Server cũng lưu trữ một số chi tiết cấu hình trong Windows Registry. Đối với điều đó, nó sử dụng Thủ tục được lưu trữ mở rộng có tên sp_set_sqlagent_properties .
Hãy xem nhanh vị trí Đăng ký nơi SQL Server lưu trữ các cấu hình Dịch vụ tác nhân SQL Server. Quan trọng :Điều này chỉ dành cho mục đích học tập và chúng tôi không khuyên bạn nên thay đổi bất kỳ giá trị cấu hình nào. Nếu không, nó có thể dẫn đến các lỗi kỳ lạ liên quan đến Dịch vụ tác nhân máy chủ SQL.
Mở Trình chỉnh sửa sổ đăng ký bằng cách nhập regedit trong dấu nhắc lệnh:
Nhấp vào Enter để mở Trình chỉnh sửa sổ đăng ký :
Bây giờ, điều hướng đến đường dẫn:
Máy tính \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ MSSQL13.MSSQLSERVER \ SQLServerAgent
Xem chi tiết cấu hình bên dưới. Phân đoạn được đánh dấu đề cập đến tên phiên bản SQL Server và nó có thể khác nhau trong môi trường của bạn dựa trên phiên bản SQL Server và tên phiên bản.
Xem nhanh sổ đăng ký chỉ ra rằng có một số tham số nhất định liên quan đến SQL Server Agent Service được lưu trữ. Vì chúng tôi không khuyên bạn nên thay đổi bất kỳ thông số nào liên quan đến Dịch vụ tác nhân máy chủ SQL và được chia sẻ ở trên chỉ cho mục đích tìm hiểu, chúng tôi sẽ không đi sâu vào nó ở đây.
Tuy nhiên, nếu bạn định thay đổi bất kỳ thuộc tính nào trong số các thuộc tính của SQL Server Agent Service để đáp ứng các yêu cầu của Doanh nghiệp hoặc Sản xuất, thì bạn có thể sửa đổi nó bằng cách Nhấp chuột phải vào SQL Server Agent Service và chọn Thuộc tính như hình bên dưới.
Mặc dù có rất nhiều tham số có sẵn liên quan đến SQL Server Agent Service và phạm vi của bài viết này liên quan đến cơ sở dữ liệu msdb, tôi đã loại trừ những tham số đó và chỉ bao gồm các tùy chọn cụ thể cho cơ sở dữ liệu msdb bằng cách nhấp vào menu Lịch sử như được hiển thị bên dưới nơi chúng tôi có thể định cấu hình kích thước của Nhật ký lịch sử công việc và Lịch sử tác nhân.
Các vấn đề thường gặp trong Cơ sở dữ liệu MSDB
Trong bất kỳ phiên bản sản xuất nào của SQL Server, chúng tôi sẽ bật rất nhiều Công việc tác nhân SQL Server, Thư cơ sở dữ liệu, kế hoạch bảo trì và sao lưu Nhật ký giao dịch / đầy đủ. Tùy thuộc vào không. của cơ sở dữ liệu trong trường hợp hoặc không. của các công việc SQL Server Agent có sẵn hoặc sử dụng Thư cơ sở dữ liệu, Máy chủ SQL của chúng tôi sẽ bắt đầu ghi lại thông tin lịch sử của tất cả các tính năng đã bật, do đó tăng kích thước của MSDB cơ sở dữ liệu. Nếu không được bảo trì đúng cách, điều này sẽ ảnh hưởng đến hiệu suất cơ sở dữ liệu MSDB và các hoạt động liên quan đến điều đó.
Hãy để chúng tôi xem xét các tính năng đã thảo luận trước đó và các bảng được sử dụng để lưu trữ dữ liệu lịch sử để hiểu cách chúng tôi có thể kiểm soát kích thước của các bảng đó.
- Lịch sử sao lưu
- Lịch sử công việc của SQL Server Agent
- Kế hoạch Bảo trì
- Lịch sử Thư của Cơ sở dữ liệu SQL Server
- Các gói SSIS
Để tìm hiểu bảng nào trong cơ sở dữ liệu MSDB chiếm nhiều dung lượng hơn, chúng tôi có thể sử dụng Báo cáo sử dụng đĩa theo bảng trên cùng là một phần của báo cáo mặc định của SQL Server trong SQL Server Management Studio.
Mở SSMS và nhấp chuột phải vào MSDB cơ sở dữ liệu> Báo cáo > Báo cáo Chuẩn > Sử dụng đĩa của các bảng trên cùng để tạo báo cáo về các bảng được sắp xếp theo Mức sử dụng đĩa:
Nhấp vào Sử dụng đĩa theo các bảng trên cùng để xem báo cáo. Vì ví dụ của tôi là phiên bản phát triển nên không có bảng lớn, nhưng báo cáo này có thể hiển thị kích thước của tất cả các bảng trong cơ sở dữ liệu được sắp xếp theo thứ tự giảm dần.
Chúng tôi cũng có thể sử dụng truy vấn dưới đây để lấy kích thước của bảng trong cơ sở dữ liệu.
SELECT -- TOP(10)
SCHEMA_NAME(o.[schema_id]) Schema_name
, o.name object_name
, total_size = CAST(SUM(au.total_pages) * 8. / 1024 AS DECIMAL(18,2))
, total_rows = SUM(CASE WHEN i.index_id IN (0, 1) AND au.[type] = 1 THEN p.[rows] END)
FROM sys.objects o
JOIN sys.indexes i ON o.[object_id] = i.[object_id]
JOIN sys.partitions p ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id
JOIN sys.allocation_units au ON p.[partition_id] = au.container_id
WHERE i.is_disabled = 0
AND i.is_hypothetical = 0
AND o.Type in ('S','U','V')
GROUP BY o.name, SCHEMA_NAME(o.[schema_id])
ORDER BY 3 DESC
Khi chúng tôi biết bảng nào chiếm nhiều không gian hơn, chúng tôi có thể sử dụng các thủ tục được lưu trữ liên quan để kiểm soát kích thước của chúng.
Lịch sử sao lưu
Trách nhiệm chính của DBA là đảm bảo rằng Bản sao lưu đầy đủ và Nhật ký giao dịch được bật trên tất cả các phiên bản Máy chủ SQL sản xuất để khôi phục cơ sở dữ liệu tại một thời điểm.
SQL Server lưu trữ chi tiết Sao lưu và thông tin Khôi phục trong bảng cơ sở dữ liệu MSDB sau :
- backupfile
- nhóm tập tin sao lưu
- backupmediafamily
- backupmediaset
- bộ sao lưu
- restorefile
- restorefilegroup
- khôi phục lịch sử
Đối với một không đáng kể. của cơ sở dữ liệu trong phiên bản SQL Server được định cấu hình với bản sao lưu Toàn bộ và sao lưu Nhật ký giao dịch, các bản ghi trên các bảng trên có thể tăng nhanh hơn.
Do đó, SQL Server cung cấp hai thủ tục được lưu trữ hệ thống trong MSDB cơ sở dữ liệu để kiểm soát kích thước của các bảng trên:
- sp_delete_backuphistory - xóa dữ liệu lịch sử sao lưu trên 8 bảng trên dựa trên ngày cũ nhất tham số.
- sp_delete_database_backuphistory - xóa dữ liệu lịch sử sao lưu trên 8 bảng trên dựa trên tên cơ sở dữ liệu .
Cú pháp để thực hiện các thủ tục được lưu trữ trong hệ thống ở trên:
exec msdb.dbo.sp_delete_backuphistory @oldest_date = 'oldest_date'
exec msdb.dbo.sp_delete_database_backuphistory @database_name = 'database_name'
Khi chúng tôi thực thi bất kỳ quy trình được lưu trữ nào được mô tả ở trên trên cơ sở dữ liệu chứa các bản ghi khổng lồ trên các bảng lịch sử sao lưu, chúng tôi có thể bị chặn hoặc nhận thấy rằng các bản ghi bị xóa rất chậm. Để giải quyết vấn đề này, chúng tôi tạo chỉ mục bị thiếu bên dưới trên bộ sao lưu bàn. Nó có thể được xác định thông qua kế hoạch thực thi của thủ tục được lưu trữ để thực thi bất kỳ thủ tục nào được lưu trữ của chúng tôi nhanh hơn.
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE OBJECT_ID = OBJECT_ID('[dbo].[backupset]') AND name = 'IX_BackupSet_FinDate_MediaSet')
CREATE NONCLUSTERED INDEX IX_BackupSet_FinDate_MediaSet ON backupset(backup_finish_date)
INCLUDE (media_set_id)
GO
Lịch sử công việc của SQL Server Agent
SQL Server lưu trữ tất cả lịch sử công việc của SQL Server Agent trong msdb.dbo.sysjobhistory bàn. Ngoài ra, SQL Server có một thủ tục được lưu trữ hệ thống có tên msdb.dbo.sp_purge_jobhistory giúp duy trì sysjobhistory kích thước bảng trong tầm kiểm soát.
Cú pháp để chạy sp_purge_jobhistory thủ tục được lưu trữ sẽ là:
exec msdb.dbo.sp_purge_jobhistory @job_name = 'job_name', @job_id = 'job_id', @oldest_date ='oldest_date'
Tất cả 3 tham số đều là tùy chọn và chúng tôi khuyên bạn nên thực hiện quy trình trên bằng cách chuyển old_date tham số để giữ sysjobhistory kích thước bảng trong tầm kiểm soát.
Kế hoạch Bảo trì
SQL Server lưu trữ chi tiết của tất cả các kế hoạch Bảo trì trong bảng dưới đây:
- msdb.dbo.sysmaintplan_log
- msdb.dbo.sysmaintplan_logdetail
SQL Server có một thủ tục được lưu trữ sẵn có tên là msdb.dbo.sp_maintplan_delete_log để kiểm soát kích thước của 2 bảng này.
Cú pháp để thực hiện thủ tục sẽ là:
exec msdb.dbo.sp_maintplan_delete_log @plan_id = '', @subplan_id = '', @oldest_Time = 'oldest_datetime'
Cả 3 thông số đều là tùy chọn. Chúng tôi khuyên bạn nên thực hiện quy trình trên, chuyển tham số old_time để kiểm soát kích thước của hai bảng trên.
Lịch sử thư của cơ sở dữ liệu SQL Server
SQL Server lưu trữ tất cả nhật ký lịch sử Thư cơ sở dữ liệu qua các bảng dưới đây:
- sysmail_mailitems
- sysmail_log
- sysmail_attachments
- sysmail_attachments_transfer
Để kiểm soát các kích thước bảng lịch sử này, SQL Server cung cấp 2 quy trình được lưu trữ hệ thống có tên là msdb.dbo.sysmail_delete_mailitems_sp và msdb.dbo.sysmail_delete_log_sp.
Cú pháp để thực hiện các thủ tục được lưu trữ này sẽ là:
exec msdb.dbo.sysmail_delete_mailitems_sp @sent_before = 'oldest_datetime', @sent_status = NULL
exec msdb.dbo.sysmail_delete_log_sp @logged_before = 'oldest_datetime', @event_type = NULL
Đối với cả hai thủ tục, tất cả các tham số là tùy chọn. Tuy nhiên, bạn nên sử dụng sent_before hoặc logged_befor đ tham số để xóa các bản ghi cũ hơn dựa trên khoảng thời gian lưu giữ.
Trong một số trường hợp, nếu tất cả các bảng liên quan đến Thư cơ sở dữ liệu đều rất lớn, hãy chạy xóa thủ tục sẽ chạy mãi mãi. Một cách nhanh hơn để xử lý sự cố là xóa ràng buộc Khóa ngoại trên sysmail_attachments và sysmail_send_retries bảng, cắt 4 bảng trên và tạo lại 2 khóa ngoại trên sysmail_attachments và sysmail_send_retries bảng như hình dưới đây:
USE MSDB;
ALTER TABLE [dbo].[sysmail_attachments] DROP [FK_sysmail_mailitems_mailitem_id];
GO
ALTER TABLE [dbo].[sysmail_send_retries] DROP [FK_mailitems_mailitem_id];
GO
TRUNCATE TABLE [dbo].[sysmail_attachments];
TRUNCATE TABLE [dbo].[sysmail_send_retries];
TRUNCATE TABLE [dbo].[sysmail_mailitems];
TRUNCATE TABLE [dbo].[sysmail_log];
ALTER TABLE [dbo].[sysmail_attachments] WITH CHECK ADD CONSTRAINT [FK_sysmail_mailitems_mailitem_id] FOREIGN KEY([mailitem_id])
REFERENCES [dbo].[sysmail_mailitems] ([mailitem_id])
ON DELETE CASCADE;
ALTER TABLE [dbo].[sysmail_attachments] CHECK CONSTRAINT [FK_sysmail_mailitems_mailitem_id];
GO
ALTER TABLE [dbo].[sysmail_send_retries] WITH CHECK ADD CONSTRAINT [FK_mailitems_mailitem_id] FOREIGN KEY([mailitem_id])
REFERENCES [dbo].[sysmail_mailitems] ([mailitem_id])
ON DELETE CASCADE;
ALTER TABLE [dbo].[sysmail_send_retries] CHECK CONSTRAINT [FK_mailitems_mailitem_id];
GO
Gói SSIS
SQL Server lưu trữ tất cả SSIS (*. Dtsx) gói trong msdb.dbo.sysssispackages bàn. Bảng này là một bảng cấu hình, tuy nhiên, trong các trường hợp ngẫu nhiên, rất có thể có rất nhiều gói SSIS được đặt trên bảng. Nó làm cho kích thước của bảng này tăng lên rất lớn.
Trong những trường hợp đó, chúng tôi cần xác định xem có bất kỳ gói nào không mong muốn hay không và xóa các gói đó để giữ nguyên sysssispackages kích thước bảng trong tầm kiểm soát.
Điểm mấu chốt
SQL Server không có công việc tích hợp để xử lý tác vụ xóa trên tất cả các bảng Thảo luận ở trên. Tuy nhiên, chúng tôi có thông số ngày cũ nhất có sẵn cho tất cả các thủ tục trên.
Do đó, phương pháp được đề xuất để xử lý kích thước bảng MSDB trong tầm kiểm soát sẽ là xác định khoảng thời gian lưu giữ dựa trên số ngày và tạo một công việc SQL Server Agent mới để thực thi tập lệnh dưới đây theo lịch trình:
declare @retention_date datetime = '2021-04-01'
exec msdb.dbo.sp_delete_backuphistory @oldest_date = @retention_date;
exec msdb.dbo.sp_purge_jobhistory @oldest_date = @retention_date;
exec msdb.dbo.sp_maintplan_delete_log @oldest_Time = @retention_date;
exec msdb.dbo.sysmail_delete_mailitems_sp @sent_before = @retention_date;
exec msdb.dbo.sysmail_delete_log_sp @logged_before = @retention_date;
Kết luận
Chúng tôi đã tìm hiểu về danh sách các bảng có thể phát triển nhanh hơn trong MSDB cơ sở dữ liệu và cách giữ kích thước của các bảng này trong tầm kiểm soát. Chúng tôi đã tạo ra một tập lệnh hữu ích với danh sách các thủ tục cần thực thi thường xuyên để ngăn chặn MSDB cơ sở dữ liệu cũng đang phát triển với kích thước khổng lồ. Hy vọng rằng bài viết này sẽ hữu ích cho quá trình tự động hóa của bạn và thông tin này sẽ giúp bạn giải phóng tâm trí khỏi việc bảo trì cơ sở dữ liệu MSDB và tập trung vào các hoạt động khác.