Giới thiệu
Điều quan trọng là người quản trị cơ sở dữ liệu phải biết khi nào không còn dung lượng trên đĩa. Vì vậy, tốt hơn là nên tự động hóa quy trình để họ không phải làm việc đó theo cách thủ công trên mỗi máy chủ.
Trong bài viết này, tôi sẽ mô tả cách triển khai thu thập dữ liệu hàng ngày tự động về ổ đĩa logic và tệp cơ sở dữ liệu.
Giải pháp
Thuật toán:
1. Tạo bảng lưu trữ dữ liệu:
1.1. cho các tệp cơ sở dữ liệu:
SỬ DỤNG [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER BẢNG ONGOCREATE [srv]. [DBFile] ([DBFile_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Server] [nvarchar] (255) NOT Nvar, [Name] 255) NOT NULL, [Drive] [nvarchar] (10) NOT NULL, [Physical_Name] [nvarchar] (255) NOT NULL, [Ext] [nvarchar] (255) NOT NULL, [Growth] [int] NOT NULL, [IsPercentGrowth] [int] NOT NULL, [DB_ID] [int] NOT NULL, [DB_Name] [nvarchar] (255) NOT NULL, [SizeMb] [float] NOT NULL, [DiffSizeMb] [float] NOT NULL, [InsertUTCDate ] [datetime] NOT NULL, [UpdateUTCdate] [datetime] NOT NULL, [File_ID] [int] NOT NULL, CONSTRAINT [PK_DBFile] PRIMARY KEY CLUSTERED ([DBFile_GUID] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DORECOMPUTE =OFF, IGNORE_D OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] GOALTER TABLE [srv]. [DBFile] ADD CONSTRAINT [DF_DBFile_DBFile_GUID] DEFAULT (newid ()) CHO [DBFile_GUID] GOALTER TABLE [srALTER TABLE [srALTER TABLE] DBFile] THÊM CONSTRAINT [DF_DBFile_InsertUTCDate] DEFAULT (getutcdate ()) FOR [InsertUTCDate] GOALTER TABLE [srv]. [DBFile] ADD CONSTRAINT [DF_DBFile_UpdateUTCdate] DEFAULT (getutcdate ()predate) FOR [Update1.2. cho các ổ đĩa logic:
SỬ DỤNG [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER BẢNG ONGOCREATE [srv]. [Trình điều khiển] ([Driver_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Server] [nvarchar] (255) NOT NULL, [Name] [nvarchar] 8) KHÔNG NULL, [TotalSpace] [float] NOT NULL, [FreeSpace] [float] NOT NULL, [DiffFreeSpace] [float] NOT NULL, [InsertUTCDate] [datetime] NOT NULL, [UpdateUTCdate] [datetime] NOT NULL, CONSTRAINT [PK_Drivers] ĐÃ ĐIỀU CHỈNH TỪ KHÓA CHÍNH ([Driver_GUID] ASC) VỚI (PAD_INDEX =TẮT, STATISTICS_NORECOMPUTE =TẮT, IGNORE_DUP_KEY =TẮT, ALLOW_ROW_LOCKS =BẬT, ALLOW_PAGE_LOCKS =BẬT) BẬT [CHÍNH] [Trình điều khiển] THÊM CONSTRAINT [DF_Drivers_Driver_GUID] DEFAULT (newid ()) CHO [Driver_GUID] BẢNG MỤC TIÊU [srv]. [Trình điều khiển] THÊM CONSTRAINT [DF_Drivers_Server] DEFAULT (@@ servername) CHO [Máy chủ] BẢNG MỤC TIÊU [srv] ] THÊM CONSTRAINT [DF_Drivers_TotalSpace] DEFAULT ((0)) CHO [TotalSpace] BẢNG MỤC TIÊU [srv]. [Trình điều khiển] THÊM CONSTRAINT [DF_Drivers_Fr eeSpace] DEFAULT ((0)) FOR [FreeSpace] GOALTER TABLE [srv]. [Drivers] ADD CONSTRAINT [DF_Drivers_DiffFreeSpace] DEFAULT ((0)) FOR [DiffFreeSpace] GOALTER TABLE [srv]. [Drivers] ADD CONSTRAINT [DF_Drivers] ADD CONSTRAINT [DF_Drivers] DEFAULT (getutcdate ()) FOR [InsertUTCDate] GOALTER TABLE [srv]. [Drivers] ADD CONSTRAINT [DF_Drivers_UpdateUTCdate] DEFAULT (getutcdate ()) FOR [UpdateUTCdate] GONgoài ra, bạn cần điền trước vào bảng các ổ đĩa logic theo cách sau:
Tên máy chủ - nhãn ổ đĩa2. tạo một dạng xem cần thiết để thu thập dữ liệu về các tệp cơ sở dữ liệu:
SỬ DỤNG [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE chế độ xem [inf]. [ServerDBFileInfo] asSELECT @@ Tên máy chủ AS Máy chủ, File_id, - file_id trong cơ sở dữ liệu. Giá trị chính của nó luôn bằng 1 Type_desc, - mô tả về loại tệp Tên là [Tên tệp], - tên tệp logic trong cơ sở dữ liệu LEFT (Tên_vật_lý, 1) Ổ AS, - nhãn ổ chứa tệp cơ sở dữ liệu Tên_tệp, - tên đầy đủ của tệp trong hệ điều hành RIGHT (physical_name, 3) AS Ext, - phần mở rộng tệp Kích thước dưới dạng CountPage, - kích thước tệp hiện tại trong các trang 8 Kb tròn ((cast (Kích thước * 8 dưới dạng float) ) / 1024,3) dưới dạng SizeMb, - kích thước tệp tính bằng Mb Growth, --growth is_percent_growth, --growth trong% database_id, DB_Name (database_id) dưới dạng [DB_Name] FROM sys.master_files - database_filesGOỞ đây, chế độ xem hệ thống sys.master_files được sử dụng.
3. Tạo một thủ tục được lưu trữ trả về thông tin trên một ổ đĩa logic:
USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOcreate thủ tục [srv]. [sp_DriveSpace] @DrivePath varchar (1024) --device (có thể đặt nhãn âm lượng 'C:'), đầu ra float @TotalSpace - tổng khối lượng tính bằng byte, đầu ra @FreeSpace float - không gian đĩa miễn phí tính bằng byteasbegin DECLARE @fso int, @Drive int, @DriveName varchar (255), @Folder int, @Drives int, @source varchar (255), @desc varchar (255), @ret int, @Object int - Tạo một đối tượng của hệ thống tệp thực thi @ret =sp_OACreate 'Scripting.FileSystemObject', bộ đầu ra @fso @Object =@fso if @ret! =0 goto ErrorInfo - Lấy một thư mục trên đường dẫn được chỉ định execute @ret =sp_OAmethod @fso, 'GetFolder', đầu ra @Folder, @DrivePath set @Object =@fso if @ret! =0 goto ErrorInfo - Nhận thiết bị thực thi @ret =sp_OAmethod @ Thư mục, 'Ổ đĩa', tập hợp đầu ra @Drive @Object =@Folder if @ret! =0 goto ErrorInfo - Xác định toàn bộ thiết bị rage không gian thực thi @ret =sp_OAGetProperty @Drive, 'TotalSize', @TotalSpace tập hợp đầu ra @Object =@Drive if @ret! =0 goto ErrorInfo - Xác định dung lượng trống trên đĩa thi hành @ret =sp_OAGetProperty @Drive, 'AvailableSpace ', Tập hợp đầu ra @FreeSpace @Object =@Drive nếu @ret! =0 goto ErrorInfo DestroyObjects:nếu @Folder không phải là rỗng thực thi sp_OADestroy @Folder nếu @Drive không phải là null thực thi sp_OADestroy @Drive nếu @fso không phải là null thực thi sp_OADestroy @ fso return (@ret) ErrorInfo:execute sp_OAGetErrorInfo @Object, @source output, @desc output print 'Source error:' + isnull (@source, 'n / a') + char (13) + 'Description:' + isnull (@desc, 'n / a') goto DestroyObjects; endGOĐể biết thông tin chi tiết về quy trình này, hãy tham khảo bài viết sau:Dung lượng đĩa trong T-SQL.
4. Tạo một thủ tục được lưu trữ để thu thập dữ liệu:
4.1. cho các tệp cơ sở dữ liệu:
SỬ DỤNG [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER THỦ TỤC ONGOCREATE [srv]. [MergeDBFileInfo] ASBEGIN ĐẶT SỐ TÀI KHOẢN BẬT; THIẾT LẬP MỨC ĐỘ CỰC KỲ GIAO DỊCH ĐỌC KHÔNG ĐƯỢC ĐỀ XUẤT;; hợp nhất [srv]. [DBFile] thành f bằng cách sử dụng [inf]. [ServerDBFileInfo] thành ff trên f.File_ID =ff.File_ID và f.DB_ID =ff. [database_id] và f. [Server] =ff. [Server ] khi khớp thì cập nhật đặt UpdateUTcDate =getUTCDate (), [Name] =ff. [FileName], [Drive] =ff. [Drive], [Physical_Name] =ff. [Physical_Name], [Ext] =ff. [Ext ], [Growth] =ff. [Growth], [IsPercentGrowth] =ff. [Is_percent_growth], [SizeMb] =ff. [SizeMb], [DiffSizeMb] =round (ff. [SizeMb] -f. [SizeMb], 3) khi mục tiêu không khớp thì chèn ([Máy chủ], [Tên], [Ổ đĩa], [Tên_vật_thư], [Số người dùng thêm], [Sự phát triển], [Sự phát triển], [DB_ID], [Tên_bạn] ], [SizeMb], [File_ID], [DiffSizeMb]) giá trị (ff. [Server], ff. [FileName], ff. [Drive], ff. [Physical_Name], ff. [Ext], ff. [Growth ], ff. [is_percent_growth], ff. [database_id], ff. [DB_Name], ff. [SizeMb], ff. [File_id], 0) khi không khớp với nguồn và f. [Server] [email protected] @SERVERNAME sau đó xóa; ENDGO4.2. cho các ổ đĩa logic:
SỬ DỤNG [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER QUY TRÌNH ONGOCREATE [srv]. [MergeDriverInfo] ASBEGIN ĐẶT SỐ TÀI KHOẢN BẬT; THIẾT LẬP MỨC ĐỘ CỰC KỲ GIAO DỊCH ĐỌC KHÔNG ĐƯỢC ĐỀ XUẤT; khai báo bảng @Drivers ([Máy chủ] nvarchar (255), Tên nvarchar (8), TotalSpace float, FreeSpace float, DiffFreeSpace float NULL); insert vào @Drivers ([Server], Name, TotalSpace, FreeSpace) chọn [Server], Name, TotalSpace, FreeSpace từ srv.Drivers trong đó [Server] example @ sqldat.com @ SERVERNAME; khai báo @TotalSpace float; khai báo @FreeSpace float; khai báo @DrivePath nvarchar (8); while (tồn tại (chọn top (1) 1 từ @Drivers trong đó DiffFreeSpace là null)) bắt đầu chọn top (1) @ DrivePath =Tên từ @Drivers trong đó DiffFreeSpace là null; executive srv.sp_DriveSpace @DrivePath =@DrivePath, @TotalSpace =@TotalSpace out, @FreeSpace =@FreeSpace out; cập nhật @Drivers đặt [email protected], example @ sqldat.com, DiffFreeSpace =case when FreeSpace> 0 then round (example @ sqldat.com, 3) else 0 end where [email protected]; end; merge [srv]. [Drivers] as d sử dụng @Drivers as dd trên d.Name =dd.Name và d. [Server] =dd. [Server] khi khớp thì cập nhật đặt UpdateUTcDate =getUTCDate (), [TotalSpace ] =dd. [TotalSpace], [FreeSpace] =dd. [FreeSpace], [DiffFreeSpace] =dd. [DiffFreeSpace]; ENDGO5. Tạo chế độ xem cho đầu ra dữ liệu:
5.1. cho các tệp cơ sở dữ liệu:
USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOcreate view [srv]. [vDBFiles] asSELECT [DBFile_GUID], [Server], [Name], [Drive], [Physical_Name], [Ext], [Growth], [ IsPercentGrowth], [DB_ID], [File_ID], [DB_Name], [SizeMb], [DiffSizeMb], tròn ([SizeMb] / 1024,3) là [SizeGb], tròn ([DiffSizeMb] / 1024,3) là [ DiffSizeGb], tròn ([SizeMb] / 1024 / 1024,3) là [SizeTb], tròn ([DiffSizeMb] / 1024 / 1024,3) là [DiffSizeTb], tròn ([DiffSizeMb] / ([SizeMb] / 100) , 3) dưới dạng [DiffSizePercent], [InsertUTCDate], [UpdateUTCdate] FROM [srv]. [DBFile]; GO5.2. cho đĩa logic:
USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOcreate view [srv]. [vDrivers] chọn [Driver_GUID], [Server], [Name], [TotalSpace] as [TotalSpaceByte], [FreeSpace] as [FreeSpaceByte] DiffFreeSpace] là [DiffFreeSpaceByte], round ([TotalSpace] / 1024, 3) as [TotalSpaceKb], round ([FreeSpace] / 1024, 3) as [FreeSpaceKb], round ([DiffFreeSpace] / 1024, 3) as [DiffFreeSpaceKb ], vòng ([TotalSpace] / 1024/1024, 3) là [TotalSpaceMb], vòng ([FreeSpace] / 1024/1024, 3) là [FreeSpaceMb], vòng ([DiffFreeSpace] / 1024/1024, 3) là [ DiffFreeSpaceMb], round ([TotalSpace] / 1024/1024/1024, 3) as [TotalSpaceGb], round ([FreeSpace] / 1024/1024/1024, 3) as [FreeSpaceGb], round ([DiffFreeSpace] / 1024/1024 / 1024, 3) dưới dạng [DiffFreeSpaceGb], vòng ([TotalSpace] / 1024/1024/1024/1024, 3) dưới dạng [TotalSpaceTb], vòng ([FreeSpace] / 1024/1024/1024/1024, 3) là [FreeSpaceTb ], vòng ([DiffFreeSpace] / 1024/1024/1024/1024, 3) là [DiffFreeSp aceTb], round ([FreeSpace] / ([TotalSpace] / 100), 3) là [FreeSpacePercent], round ([DiffFreeSpace] / ([TotalSpace] / 100), 3) là [DiffFreeSpacePercent], [InsertUTCDate], [ UpdateUTCdate] FROM [srv]. [Drivers] ĐI6. Tạo một tác vụ trong SQL Server Agent và chạy nó mỗi ngày một lần:
SỬ DỤNG [DATABASE_NAME]; GOexec srv.MergeDBFileInfo; execute srv.MergeDriverInfo;7. Thu thập tất cả dữ liệu đầu ra từ máy chủ. Bạn có thể làm điều đó bằng cách sử dụng SQL Server Agent, chẳng hạn.
8. Tạo một thủ tục được lưu trữ để tạo báo cáo và gửi cho quản trị viên. Vì có thể triển khai nó theo nhiều cách khác nhau, tôi sẽ xem xét nó trên ví dụ cụ thể sau:
SỬ DỤNG [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER QUY TRÌNH ONGOCREATE [srv]. [GetHTMLTableShortInfoDrivers] @body nvarchar (max) OUTPUTASBEGIN BẬT SỐ KHOẢN; THIẾT LẬP MỨC ĐỘ CỰC KỲ GIAO DỊCH ĐỌC KHÔNG ĐƯỢC ĐỀ XUẤT; khai báo bảng @tbl (Driver_GUID uniqueidentifier, [Name] nvarchar (255), [TotalSpaceGb] float, [FreeSpaceGb] float, [DiffFreeSpaceMb] float, [FreeSpacePercent] float, [DiffFreeSpacePercent] float, UpdateUTCDate datetime, [Server] nvarchar (255 ), ID int ID (1,1)); khai báo @Driver_GUID uniqueidentifier, @ Name nvarchar (255), @ TotalSpaceGb float, @ FreeSpaceGb float, @ DiffFreeSpaceMb float, @ FreeSpacePercent float, @ DiffFreeSpacePercent float, @ UpdateUTCDate datetime, @ Server nvarchar (255), @ ID int; insert vào @tbl (Driver_GUID, [Name], [TotalSpaceGb], [FreeSpaceGb], [DiffFreeSpaceMb], [FreeSpacePercent], [DiffFreeSpacePercent], UpdateUTCDate, [Server]) chọn Driver_GUID, [Name], [TotalSpaceGb], [FreeSpaceGb] ], [DiffFreeSpaceMb], [FreeSpacePercent], [DiffFreeSpacePercent], UpdateUTCDate, [Server] từ srv.vDrivers trong đó [DiffFreeSpacePercent] <=- 5 hoặc [FreeSpacePercent] <=15 đặt hàng bởi [Máy chủ] asc, [Tên] asc; if (being (select top (1) 1 from @tbl)) begin set @ body ='Khi phân tích, tôi nhận thấy thiết bị lưu trữ dữ liệu có dung lượng ổ đĩa trống dưới 15% hoặc dung lượng trống giảm hơn 5% một ngày :
'+''; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ' '; while ((chọn top 1 1 từ @tbl)> 0) begin set @ example @ sqldat.com + ''; set @ example @ sqldat.com + '№ p / p'; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'GUID'; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'SEVER'; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'TOM'; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'VOLUME, GB.'; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'MIỄN PHÍ, GB.'; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'THAY ĐỔI KHÔNG GIAN MIỄN PHÍ, MB.'; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'MIỄN PHÍ,%'; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'THAY ĐỔI KHÔNG GIAN MIỄN PHÍ,%'; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'THỜI GIAN PHÁT HIỆN UTC'; set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; chọn đầu tiên 1 @Driver_GUID =Driver_GUID, @ Name =Name, @ TotalSpaceGb =TotalSpaceGb, @ FreeSpaceGb =FreeSpaceGb, @ DiffFreeSpaceMb =DiffFreeSpaceMb, @ FreeSpacePercent =FreeSpacePercent, @ DiffFreeSpace, @ Update =Diff, Server @ Server =Diff @ID =[ID] từ @tbl; set @ example @ sqldat.com + ' '; end set @ example @ sqldat.com + ''; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + cast (@ID as nvarchar (max)); set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + cast (@Driver_GUID as nvarchar (255)); set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + thanesce (@Server, ''); set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + thanesce (@Name, ''); set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + cast (@TotalSpaceGb as nvarchar (255)); set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + cast (@FreeSpaceGb as nvarchar (255)); set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + cast (@DiffFreeSpaceMb as nvarchar (255)); set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + cast (@FreeSpacePercent as nvarchar (255)); set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + cast (@DiffFreeSpacePercent as nvarchar (255)); set @ example @ sqldat.com + ' '; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + rep.GetDateFormat (@UpdateUTCDate, default) + '' + rep.GetTimeFormat (@UpdateUTCDate, default); set @ example @ sqldat.com + ' '; xóa khỏi @tbl nơi [email protected]; set @ example @ sqldat.com + '
'; Để có thông tin chi tiết, hãy tham khảo chế độ xem SRV.srv.vDrivers
Để xem thông tin về tệp cơ sở dữ liệu, hãy tham khảo chế độ xem DATABASE_NAME.srv.vDBFiles '; endENDGOQuy trình được lưu trữ này tạo báo cáo HTML về các ổ đĩa logic có dung lượng ổ đĩa trống dưới 15% hoặc dung lượng trống giảm hơn 5% một ngày. Phần sau cho thấy một hoạt động kỳ lạ của các bản ghi có nghĩa là ai đó lưu trữ quá nhiều thông tin trên đĩa này rất thường xuyên. Nó có thể xảy ra vì những lý do sau:
- Đã đến lúc mở rộng ổ đĩa;
- Cần phải xóa các tệp không sử dụng trên ổ đĩa logic;
- Xóa và giảm các tệp nhật ký, cũng như các tệp thông tin và các bảng khác.
Giải pháp
Trong bài viết này, tôi đã phân tích một ví dụ về việc thực hiện một hệ thống thu thập dữ liệu tự động hàng ngày về các ổ đĩa cục bộ và các tệp cơ sở dữ liệu. Thông tin này cho phép tìm ra trước đĩa nào có ít dung lượng trống hơn, cũng như những tệp cơ sở dữ liệu nào phát triển mạnh mẽ. Nó cho phép tránh trường hợp không có dung lượng trên đĩa và tìm ra lý do tại sao một quá trình chiếm nhiều dung lượng trên đĩa.
Cũng đọc:
Thu thập dữ liệu tự động của các thay đổi lược đồ cơ sở dữ liệu trong MS SQL Server
Thu thập dữ liệu tự động về các công việc đã hoàn thành trong MS SQL Server