Job para verificar e salvar em uma tabela o resultado de todas as unidades de disco do servidor, informando quais estão formatadas em 64k ou não.
Um script faz a verificação em apenas um disco e o outro faz em diversos discos, criando steps no job conforme a quantidade de unidades informadas o ínicio do script
JOB PARA VERIFICAR SE O DISCO ESTÁ FORMATADO EM 64K E SALVAR O RESULTADO EM UMA TABELA.sql
--JOB PARA VERIFICAR SE UM DISCO ESPECÍFICO ESTÁ FORMATADO EM 64K E SALVAR O RESULTADO EM UMA TABELA
-- Informar na linha 56 o nome do servidor. $server = "DELL_G15\SQL2019"
-- O Script está fazedo a verificação do disco E, caso precise verificar outros discos, gerar outros steps para os outros discos
-- Verifica se o banco de dados DBA existe; caso contrário, cria o banco de dados
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'DBA')
BEGIN
CREATE DATABASE DBA;
END
GO
USE DBA;
GO
-- Cria a tabela FormatacaoDeDisco se não existir
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'FormatacaoDeDisco' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE dbo.FormatacaoDeDisco (
ExecutionTime DATETIME,
OutputMessage NVARCHAR(MAX)
);
END
GO
USE msdb;
GO
-- Cria um novo job
EXEC sp_add_job
@job_name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K',
@enabled = 1,
@description = N'Job para verificar se o disco E está formatado em 64k usando PowerShell',
@start_step_id = 1;
GO
-- Adiciona um step ao job
EXEC sp_add_jobstep
@job_name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K',
@step_name = N'Executar Script PowerShell',
@subsystem = N'PowerShell',
@command = N'
$drive = "E"
$volume = Get-Volume -DriveLetter $drive
if ($null -eq $volume) {
$message = "Não foi possível encontrar o volume com a letra de drive $drive"
} else {
$allocationUnitSize = $volume.AllocationUnitSize
if ($allocationUnitSize -eq 65536) {
$message = "O drive $drive está formatado com uma unidade de alocação de 64k."
} else {
$message = "O drive $drive NÃO está formatado com uma unidade de alocação de 64k. Unidade de alocação atual: $allocationUnitSize bytes."
}
}
$server = "DELL_G15"
$database = "DBA"
$query = "INSERT INTO DBA.dbo.FormatacaoDeDisco (ExecutionTime, OutputMessage) VALUES (GETDATE(), ''$message'')"
try {
Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $query
Write-Output "Dados inseridos com sucesso."
} catch {
Write-Output "Erro ao conectar ao SQL Server: $_"
}
',
@on_success_action = 1,
@on_fail_action = 2,
@output_file_name = N'C:\Temp\DBA - VERIFICAR FORMATACAO DE DISCO 64K.log';
GO
-- Adiciona o job ao servidor
EXEC sp_add_jobserver
@job_name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K';
GO
-- Define a programação do job (por exemplo, diariamente às 2h da manhã)
EXEC sp_add_jobschedule
@job_name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K',
@name = N'DailySchedule',
@freq_type = 4,
@freq_interval = 1,
@active_start_time = 020000;
GO
JOB PARA VERIFICAR SE O DISCO ESTÁ FORMATADO EM 64K E SALVAR O RESULTADO EM UMA TABELA v2.sql
-- JOB PARA VERIFICAR SE O DISCO ESTÁ FORMATADO EM 64K E SALVAR O RESULTADO EM UMA TABELA
/*
ATENÇÃO PARA ALTERAR OS ITENS ENTRE AS LINHAS 47 e 49
*/
-- Verifica se o banco de dados DBA existe; caso contrário, cria o banco de dados
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'DBA')
BEGIN
CREATE DATABASE DBA;
END
GO
USE DBA;
GO
-- Cria a tabela FormatacaoDeDisco se não existir
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'FormatacaoDeDisco' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
CREATE TABLE dbo.FormatacaoDeDisco (
ExecutionTime DATETIME,
OutputMessage NVARCHAR(MAX)
);
END
GO
USE msdb;
GO
-- Verifica se o job já existe; se existir, exclui o job
IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs WHERE name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K')
BEGIN
EXEC sp_delete_job @job_name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K';
END
GO
-- Cria um novo job
EXEC sp_add_job
@job_name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K',
@enabled = 1,
@description = N'Job para verificar se o disco está formatado em 64k usando PowerShell',
@start_step_id = 1,
@owner_login_name = N'sa'; -- Definindo o owner do job como 'sa';
GO
-- Declaração das variáveis
DECLARE @server NVARCHAR(100) = 'DELL_G15\SQL2019'; -- Alterar o Nome do servidor
DECLARE @drives NVARCHAR(MAX) = 'C,D,E,F'; -- Alterar as Unidades para verificar
DECLARE @qtd_steps INT = 4; -- Alterar a Quantidade de steps
DECLARE @step_id INT = 1;
DECLARE @drive NVARCHAR(1);
DECLARE @command NVARCHAR(MAX);
DECLARE @step_name NVARCHAR(50);
-- Preenche uma tabela temporária com as unidades
DECLARE @drive_list TABLE (Drive NVARCHAR(1));
WHILE LEN(@drives) > 0
BEGIN
SET @drive = LEFT(@drives, CHARINDEX(',', @drives + ',') - 1);
SET @drives = STUFF(@drives, 1, LEN(@drive + ','), '');
INSERT INTO @drive_list (Drive) VALUES (@drive);
END
-- Adiciona steps ao job para cada unidade a ser verificada
DECLARE @current_drive NVARCHAR(1);
DECLARE drive_cursor CURSOR FOR
SELECT Drive FROM @drive_list;
OPEN drive_cursor;
FETCH NEXT FROM drive_cursor INTO @current_drive;
WHILE @@FETCH_STATUS = 0
BEGIN
-- Monta o nome do step
SET @step_name = N'Step ' + CAST(@step_id AS NVARCHAR(10));
-- Monta o comando PowerShell
SET @command =
'$drive = "' + @current_drive + N'"; ' +
'if (-not (Test-Path "C:\Temp")) { New-Item -ItemType Directory -Path "C:\Temp" }; ' +
'$volume = Get-Volume -DriveLetter $drive; ' +
'if ($null -eq $volume) { $message = "Drive ${drive}: Não foi possível encontrar o volume com a letra de drive."; } ' +
'else { ' +
' $allocationUnitSize = $volume.AllocationUnitSize; ' +
' if ($allocationUnitSize -eq 65536) { $message = "Drive ${drive}: O drive está formatado com uma unidade de alocação de 64k."; } ' +
' else { $message = "Drive ${drive}: NÃO está formatado com uma unidade de alocação de 64k. Unidade de alocação atual: " + $allocationUnitSize + " bytes."; } ' +
'}; ' +
'$server = "' + @server + N'"; $database = "DBA"; ' +
'$query = "INSERT INTO dbo.FormatacaoDeDisco (ExecutionTime, OutputMessage) VALUES (GETDATE(), ''" + $message + "'' )" ; ' +
'try { Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $query; Write-Output "Dados inseridos com sucesso para $drive."; } ' +
'catch { Write-Output "Erro ao conectar ao SQL Server: $_"; }; ' +
'$logPath = "C:\Temp\DBA - VERIFICAR FORMATACAO DE DISCO 64K.log"; Add-Content -Path $logPath -Value $message;';
-- Se for o último step, define o comportamento de sucesso/erro para 1 e 2 (sucesso e falha)
IF @step_id = @qtd_steps
BEGIN
EXEC sp_add_jobstep
@job_name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K',
@step_name = @step_name,
@subsystem = N'PowerShell',
@command = @command,
@on_success_action = 1, -- Sucesso
@on_fail_action = 2; -- Falha
END
ELSE
BEGIN
-- Para os outros steps, continua para o próximo
EXEC sp_add_jobstep
@job_name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K',
@step_name = @step_name,
@subsystem = N'PowerShell',
@command = @command,
@on_success_action = 3, -- Próximo Step
@on_fail_action = 3; -- Próximo Step
END
FETCH NEXT FROM drive_cursor INTO @current_drive;
SET @step_id = @step_id + 1;
END
CLOSE drive_cursor;
DEALLOCATE drive_cursor;
GO
-- Adiciona o job ao servidor
EXEC sp_add_jobserver
@job_name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K';
GO
---- Define a programação do job (por exemplo, diariamente às 2h da manhã)
--EXEC sp_add_jobschedule
-- @job_name = N'DBA - VERIFICAR FORMATACAO DE DISCO 64K',
-- @name = N'DailySchedule',
-- @freq_type = 4,
-- @freq_interval = 1,
-- @active_start_time = 020000;
--GO
Σχόλια