Sepopuler layanan cloud saat ini, masih ada sebagian besar penerapan SQL Server di tempat yang masih memerlukan layanan kami untuk mendukungnya. Salah satu area penyiapan lokal yang harus kita perhatikan adalah penyimpanan, tepat di mana data disimpan.
Saya akan menunjukkan kepada Anda Prosedur Tersimpan untuk memvisualisasikan informasi ruang penyimpanan utama dalam instance SQL Server Anda.
Pertimbangan Awal
- Pastikan bahwa akun yang menjalankan Prosedur Tersimpan ini memiliki hak istimewa yang cukup.
- Objek database (tabel database dan prosedur tersimpan) akan dibuat di dalam database yang dipilih pada saat skrip dijalankan, jadi pilihlah dengan hati-hati.
- Skrip dibuat sedemikian rupa sehingga dapat dieksekusi beberapa kali tanpa menimbulkan kesalahan pada Anda. Untuk Prosedur Tersimpan, saya menggunakan pernyataan CREATE OR ALTER PROCEDURE, tersedia sejak SQL Server 2016 SP1.
- Silakan mengubah nama objek database yang dibuat.
- Bila Anda memilih untuk mempertahankan data yang dikembalikan oleh Stored Procedure, tabel target akan dipotong terlebih dahulu sehingga hanya kumpulan hasil terbaru yang akan disimpan.
- Perlu diingat bahwa solusi ini tidak masuk akal dalam penerapan cloud di mana penyedia cloud mengelola berbagai hal untuk Anda dan Anda tidak memiliki akses ke sistem file.
Bagaimana Cara Menggunakan Prosedur Tersimpan?
- Salin &tempel Kode TSQL (tersedia dalam artikel ini).
- SP mengharapkan 2 parameter:
- @persistData:‘Y’ jika DBA ingin menyimpan output dalam tabel target, dan ‘N’ jika DBA hanya ingin melihat output secara langsung.
- @driveDetail:Meskipun opsional, jika Anda memasukkan huruf drive, maka parameter @persistData tidak akan berpengaruh apa pun.
Bidang yang Disajikan dan Maknanya
- mengemudi: huruf drive yang berisi file data untuk instance saat ini.
- total_spasi: ukuran drive, dalam GB.
- ruang_bebas: jumlah GB yang tersisa di drive.
- ruang_bekas: jumlah GB yang ditempati oleh semua database dalam instance.
- data_collection_timestamp: hanya terlihat jika 'Y' diteruskan ke parameter @persistData, dan digunakan untuk mengetahui kapan SP dijalankan dan informasi berhasil disimpan di tabel DBA_Storage.
Tes Eksekusi
Saya akan mendemonstrasikan beberapa eksekusi Stored Procedure sehingga Anda bisa mendapatkan gambaran tentang apa yang diharapkan darinya:
EXEC GetStorageData @persistData = 'N'
Karena saya menjalankan ini dalam contoh pengujian di mana saya memiliki semua yang dimasukkan ke dalam drive C:\ (saya tahu, praktik terburuk yang pernah ada), hanya satu baris yang dikembalikan. Sekarang, izinkan saya menunjukkan kepada Anda tangkapan layar dari penggunaan drive C:\ saya, seperti yang dilaporkan oleh Windows, hanya untuk melihat apakah SP tidak menggertak:
Kelihatannya bagus, untuk sebagian besar. Namun, jika Anda melihat lebih dekat, Anda akan melihat bahwa "Ruang yang digunakan" dalam grafik mengatakan 25GB dan SP mengatakan "0,170GB", itu aneh bukan? Nah, alasannya adalah arti dalam SP sedikit berbeda:di sini ia melaporkan jumlah GB yang hanya ditempati oleh file database, jadi ingatlah itu.
Sekarang, output itu tampaknya agak kering, bukan? Maksud saya, kami tidak tahu persis apa yang mengambil ruang bekas yang dilaporkan. Di situlah parameter lain berperan, jadi mari kita periksa:
EXEC GetStorageData @persistData = 'N', @driveDetail = 'C'
Menjalankannya seperti ini akan memberi Anda daftar database tertentu yang memiliki setidaknya 1 file database di drive yang dilewatkan sebagai parameter. Jika Anda menjumlahkan kolom “total spasi”, itu akan memberi Anda nilai yang sama persis dengan hasil ringkasan sebelumnya.
Biarkan saya mencoba satu hal lagi untuk melihat apa yang dikembalikan SP. Saya akan membuat database baru, tetapi saya akan menempatkan file database di drive lain yang telah saya letakkan. Saya memanggil database "test" dan saya akan menempatkannya di drive S:\.
Jadi sekarang SP juga mengeluarkan drive itu di set hasil. Tapi sekali lagi, mari kita lihat apa yang terjadi jika kita membuang parameter @driveDetail dengan 'S' sebagai nilai:
Bingo, ini melaporkan database 'tes' yang saya buat dengan ukuran yang saya pilih (1GB untuk file data dan 8MB untuk file log transaksi).
Kueri Samping
Sekarang, untuk memberikan nilai lebih kepada DBA, saya telah menyiapkan beberapa kueri yang dapat membantu Anda mendapatkan informasi yang berguna dari data yang disimpan dalam tabel.
*Kueri untuk menemukan database dengan setidaknya 1 file data yang dihosting di drive C:\.
SELECT * FROM DBA_Storage WHERE drive = 'C:\';
*Kueri untuk memvisualisasikan daftar drive yang diurutkan berdasarkan free_space, dari terendah hingga tertinggi. Dengan ini, Anda dapat mengetahui drive mana yang membutuhkan perhatian Anda sesegera mungkin.
SELECT * FROM DBA_Storage ORDER BY free_space;
*Permintaan untuk memvisualisasikan daftar drive yang diurutkan berdasarkan used_space, dari tertinggi ke terendah. Dengan ini, Anda dapat mengetahui mana yang memiliki data lebih banyak dari yang lain.
SELECT * FROM DBA_Storage ORDER BY used_space DESC;
Berikut kode lengkap Stored Procedure:
*Di awal skrip, Anda akan melihat nilai default yang diasumsikan oleh Prosedur Tersimpan jika tidak ada nilai yang diteruskan untuk setiap parameter.
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
Kesimpulan
- Anda dapat menerapkan SP ini di setiap instance SQL Server di bawah dukungan Anda dan menerapkan mekanisme peringatan di seluruh tumpukan instance yang didukung.
- Jika Anda menerapkan pekerjaan agen yang menanyakan informasi ini secara relatif sering, Anda dapat tetap menjadi yang teratas dalam hal mengambil langkah-langkah untuk menjaga penyimpanan setiap kali ambang batas tertentu terpenuhi, dalam lingkungan yang Anda dukung .
- Pastikan untuk memeriksa lebih banyak alat yang dipublikasikan di sini di CodingSight.