Hiện nay, các dịch vụ đám mây phổ biến như các dịch vụ đám mây, vẫn còn một số lượng lớn các triển khai tại chỗ của SQL Server vẫn yêu cầu các dịch vụ của chúng tôi hỗ trợ chúng. Một trong những lĩnh vực thiết lập tại chỗ mà chúng ta phải theo dõi là lưu trữ, ngay tại nơi dữ liệu được lưu.
Tôi sẽ trình bày cho bạn Quy trình đã lưu trữ để trực quan hóa thông tin không gian lưu trữ chính trong phiên bản SQL Server của bạn.
Cân nhắc ban đầu
- Đảm bảo rằng tài khoản thực hiện Quy trình đã lưu trữ này có đủ đặc quyền.
- Các đối tượng cơ sở dữ liệu (bảng cơ sở dữ liệu và thủ tục được lưu trữ) sẽ được tạo bên trong cơ sở dữ liệu được chọn tại thời điểm tập lệnh được thực thi, vì vậy hãy chọn cẩn thận.
- Tập lệnh được tạo theo cách có thể được thực thi nhiều lần mà không gây ra lỗi cho bạn. Đối với Quy trình đã lưu trữ, tôi đã sử dụng câu lệnh CREATE OR ALTER PROCEDURE, có sẵn kể từ SQL Server 2016 SP1.
- Thoải mái thay đổi tên của các đối tượng cơ sở dữ liệu đã tạo.
- Khi bạn chọn duy trì dữ liệu do Thủ tục đã lưu trữ trả về, bảng đích trước tiên sẽ bị cắt bớt để chỉ tập kết quả gần đây nhất mới được lưu trữ.
- Xin lưu ý rằng giải pháp này không có ý nghĩa trong việc triển khai đám mây khi nhà cung cấp dịch vụ đám mây quản lý mọi thứ cho bạn và bạn không có quyền truy cập vào hệ thống tệp.
Cách sử dụng quy trình đã lưu trữ?
- Sao chép và dán Mã TSQL (có sẵn trong bài viết này).
- SP mong đợi 2 tham số:
- @ persData:‘Y’ nếu DBA muốn lưu kết quả đầu ra trong bảng đích và ‘N’ nếu DBA chỉ muốn xem trực tiếp kết quả đầu ra.
- @driveDetail:Mặc dù là tùy chọn, nhưng nếu bạn chuyển một ký tự ổ đĩa, thì thông số @persistData sẽ không có tác dụng gì.
Các trường được trình bày và ý nghĩa của chúng
- lái xe: ký tự ổ đĩa chứa các tệp dữ liệu cho phiên bản hiện tại.
- total_space: kích thước của ổ đĩa, tính bằng GB.
- free_space: số GB còn lại trong ổ đĩa.
- used_space: lượng GB được chiếm bởi tất cả các cơ sở dữ liệu trong ví dụ.
- data_collection_timestamp: chỉ hiển thị nếu ‘Y’ được chuyển cho tham số @persistData và nó được sử dụng để biết khi nào SP được thực thi và thông tin đã được lưu thành công trong bảng DBA_Storage.
Kiểm tra thực thi
Tôi sẽ trình bày một số cách thực thi của Thủ tục được lưu trữ để bạn có thể biết được những gì sẽ xảy ra từ nó:
EXEC GetStorageData @persistData = 'N'
Vì tôi đã chạy điều này trong một trường hợp thử nghiệm nơi tôi có mọi thứ được nhồi vào ổ C:\ (tôi biết, đây là phương pháp tồi tệ nhất từ trước đến nay), chỉ có một hàng được trả về. Bây giờ, hãy để tôi cho bạn xem ảnh chụp màn hình về việc sử dụng ổ C:\ của tôi, như được báo cáo bởi Windows, chỉ để xem liệu SP có lừa đảo không:
Nó có vẻ tốt, đối với hầu hết các phần. Tuy nhiên, nếu bạn xem xét kỹ hơn, bạn sẽ nhận thấy rằng "Dung lượng đã sử dụng" trong hình ảnh cho biết 25GB và SP cho biết "0,170GB", điều đó thật kỳ lạ phải không? Chà, lý do là ý nghĩa trong SP hơi khác một chút:ở đây nó báo cáo lượng GB chỉ bị chiếm bởi các tệp cơ sở dữ liệu, vì vậy hãy ghi nhớ điều đó.
Bây giờ, đầu ra đó có vẻ hơi khô, phải không? Ý tôi là, chúng tôi không biết chính xác điều gì đang chiếm dụng không gian đã sử dụng được báo cáo. Đó là lúc thông số khác phát huy tác dụng, vì vậy hãy cùng khám phá:
EXEC GetStorageData @persistData = 'N', @driveDetail = 'C'
Thực thi nó như vậy sẽ cung cấp cho bạn danh sách các cơ sở dữ liệu cụ thể có ít nhất 1 tệp cơ sở dữ liệu trong ổ đĩa được truyền dưới dạng tham số. Nếu bạn tính tổng cột "tổng không gian", nó sẽ cung cấp cho bạn giá trị chính xác giống như kết quả tóm tắt trước đó.
Hãy để tôi thử một điều nữa để xem những gì SP trả về. Tôi sẽ tạo một cơ sở dữ liệu mới, nhưng tôi sẽ đặt các tệp cơ sở dữ liệu vào một ổ đĩa khác mà tôi đã đặt xung quanh. Tôi đang gọi cơ sở dữ liệu là "test" và tôi sẽ đặt nó vào ổ đĩa S:\.
Vì vậy, bây giờ SP cũng xuất ra ổ đĩa đó trong tập kết quả. Nhưng một lần nữa, hãy xem điều gì sẽ xảy ra nếu chúng ta ném tham số @driveDetail với ‘S’ làm giá trị:
Bingo, nó báo cáo cơ sở dữ liệu ‘thử nghiệm’ mà tôi đã tạo với kích thước mà tôi đã chọn (1GB cho tệp dữ liệu và 8MB cho tệp nhật ký giao dịch).
Truy vấn bên
Bây giờ, để mang lại nhiều giá trị hơn cho DBA, tôi đã chuẩn bị một số truy vấn có thể giúp bạn thu được thông tin hữu ích từ dữ liệu được lưu trong bảng.
* Truy vấn tìm cơ sở dữ liệu có ít nhất 1 tệp dữ liệu được lưu trữ trong ổ C:\.
SELECT * FROM DBA_Storage WHERE drive = 'C:\';
* Truy vấn để trực quan hóa danh sách các ổ đĩa được sắp xếp theo free_space, từ thấp nhất đến cao nhất. Với điều này, bạn có thể biết ổ đĩa nào cần bạn chú ý càng sớm càng tốt.
SELECT * FROM DBA_Storage ORDER BY free_space;
* Truy vấn để trực quan hóa danh sách các ổ đĩa được sắp xếp theo used_space, từ cao nhất đến thấp nhất. Với điều này, bạn có thể biết cái nào có nhiều dữ liệu hơn những cái khác.
SELECT * FROM DBA_Storage ORDER BY used_space DESC;
Đây là mã hoàn chỉnh của Quy trình đã lưu trữ:
* Ở phần đầu của tập lệnh, bạn sẽ thấy giá trị mặc định mà Thủ tục được lưu trữ giả định nếu không có giá trị nào được chuyển cho mỗi tham số.
CREATE OR ALTER PROCEDURE [dbo].[GetStorageData]
@persistData CHAR(1) = 'Y',
@driveDetail CHAR(1) = NULL
AS
BEGIN
SET NOCOUNT ON
DECLARE @command NVARCHAR(MAX)
DECLARE @Tmp_StorageInformation TABLE(
[drive] [CHAR](3) NOT NULL,
[total_space] [DECIMAL](10,3) NOT NULL,
[free_space] [DECIMAL](10,3) NOT NULL,
[used_space] [DECIMAL](10,3) NOT NULL
)
IF NOT EXISTS (SELECT * FROM dbo.sysobjects where id = object_id(N'DBA_Storage') and OBJECTPROPERTY(id, N'IsTable') = 1)
BEGIN
CREATE TABLE DBA_Storage(
[drive] [CHAR](3) NOT NULL,
[total_space] [DECIMAL](10,3) NOT NULL,
[free_space] [DECIMAL](10,3) NOT NULL,
[used_space] [DECIMAL](10,3) NOT NULL,
[data_collection_timestamp] [DATETIME] NOT NULL
)
END
IF(@driveDetail IS NOT NULL)
BEGIN
SELECT DB_NAME(mf.database_id) AS 'database',CONVERT(DECIMAL(10,3),SUM(size*8)/1024.0/1024.0) AS 'total space'
FROM sys.master_files mf
WHERE SUBSTRING(mf.physical_name,0,4) = CONCAT(@driveDetail,':\')
GROUP BY mf.database_id
RETURN
END
INSERT INTO @Tmp_StorageInformation
SELECT
drives.drive,
drives.total_space,
drives.free_space,
(SELECT CONVERT(DECIMAL(10,3),SUM(size*8)/1024.0/1024) FROM sys.master_files WHERE SUBSTRING(physical_name,0,4) = drives.drive) AS 'used_space'
FROM(
SELECT DISTINCT vs.volume_mount_point AS 'drive',CONVERT(DECIMAL(10,3),(vs.available_bytes/1048576)/1024.0) AS 'free_space',CONVERT(DECIMAL(10,3),(vs.total_bytes/1048576)/1024.0) AS 'total_space'
FROM sys.master_files mf
CROSS APPLY sys.dm_os_volume_stats(mf.database_id,mf.file_id) vs
) AS drives
IF @persistData = 'N'
SELECT * FROM @Tmp_StorageInformation
ELSE
BEGIN
TRUNCATE TABLE DBA_Storage
INSERT INTO DBA_Storage
SELECT *,GETDATE() FROM @Tmp_StorageInformation ORDER BY [drive]
END
END
Kết luận
- Bạn có thể triển khai SP này trong mọi phiên bản SQL Server dưới sự hỗ trợ của bạn và triển khai cơ chế cảnh báo trên toàn bộ ngăn xếp các phiên bản được hỗ trợ của bạn.
- Nếu bạn triển khai một công việc đại lý truy vấn thông tin này tương đối thường xuyên, bạn có thể luôn dẫn đầu trò chơi về việc thực hiện các bước để quản lý bộ nhớ bất cứ khi nào đạt được các ngưỡng nhất định, trong (các) môi trường được hỗ trợ của bạn .
- Hãy nhớ xem thêm các công cụ khác được xuất bản tại đây tại CodingSight.