PowerShell e o dia a dia do DBA SQL SERVER
(verificando se todos os database foram becapeados)
Todos os scripts eu criei um database chamado DBA no meu servidor central e um schema diario. As tabelas sempre serão criadas neste schema e database.
Para todos os scripts, gerar um txt com os nomes dos servidores envolvidos. Eu o chamei de servidores.txt e fica assim :
SERVER1\MSSQLSERVER_1
SERVER2\MSSQLSERVER_2
SERVER3\SQL2005
Os dois primeiros são 2008 e o terceiro 2005
Eu o gravo numa pasta chamada c:\dadosps, vocês irão ver esta chamada em todos os scripts
Verificar se todos os databases foram beckapeados.
Aqui eu ja mato um coelho com duas tacadas só Este script pega todos os databases de todos os servidores (menos os de sistema) verifica se estão online e pega a ultima data de backup efetuada. Quando não foi feito nenhum backup ainda, é retornado a data de 1/1/0001. Por esta data eu sei então que o database PODE SER novo (poderia ver pela data de criação , mas este escopo esta me servindo) e provavelmente não existe nenhum plano de manutenção pra ele ainda. Caso a data do ultimo backup seja < do que o dia de hoje (coloquei assim mas pode ser mudado, pois no exemplo este script roda de manhã e os backups rodam depois da meia noite) eu coloco como possível falha de ´job de backup, que tb faz parte destes artigos.
# Criação das tabelas no SQL SREVER
###########################################
USE
[DBA]GO
/****** Object: Schema [Diario] Script Date: 11/11/2008 09:31:09 ******/
CREATE
SCHEMA [Diario] AUTHORIZATION [dbo]GO
USE
[DBA]GO
/****** Object: Table [Diario].[tb_backup] Script Date: 11/11/2008 09:31:40 ******/
SET
ANSI_NULLS ONGO
SET
QUOTED_IDENTIFIER ONGO
SET
ANSI_PADDING ONGO
CREATE
TABLE [Diario].[tb_backup]([Servidor] [varchar]
(50) NULL,[data] [datetime]
NULL,[Banco] [varchar]
(50) NULL,[Lastbackupdate] [datetime]
NULL,[Msg] [varchar]
(300) NULL)
ON [PRIMARY]GO
SET
ANSI_PADDING OFFGO
ALTER
TABLE [Diario].[tb_backup] ADD DEFAULT (getdate()) FOR [data]GO
Script em PS[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
$datas = (get-date).toshortdatestring()
###########################################
#Atribui o Dabatase e Server central que receberão os dados
###########################################
$ServidorCentral = "SERVER1\MSSQLSERVER_1"
$DatabaseCentral = "DBA"
##########################################
#Checagem 1
#Verifica Se os Backups foram feitos corretamente e se existe #algum database novo
#A data é comparada com a data de hoje, pois os backups são #feitos após a meia noite
##########################################
$sql = "truncate table diario.tb_backup"
Invoke-Sqlcmd -ServerInstance $ServidorCentral -Database $DatabaseCentral -Query $sql
foreach ($svr in get-content "C:\dadosps\servidores.txt" )
{
$data = ""
$Servidor=New-Object "Microsoft.SqlServer.Management.Smo.Server" "$svr"
$data = $Servidor.Databases| where-object {$_.IsSystemObject -eq $FALSE -and
$_.IsAccessible -eq $TRUE -and $_.name -ne "DBA" } | foreach {
$DultimoBackup = [datetime] $_.lastbackupdate
$DultimoBackup = $DultimoBackup.toshortdatestring()
if ($DultimoBackup -lt $datas)
{
if ($DultimoBackup.substring(0,8) -eq "1/1/0001")
{
$DBrasilUltimoBackup = "01/01/1900"
$msg = "Verifique se o Database é novo e possui plano de backup"
}
else
{
$DBrasilUltimoBackup = [string] $_.lastbackupdate
$DBrasilUltimoBackup = $DBrasilUltimoBackup.substring(3,2) + "/" + $DBrasilUltimoBackup.substring(0,2) + "/" + $DBrasilUltimoBackup.substring(6)
$msg = "Verifique se houve erro em job de backup"
}
$sql = "set dateformat dmy insert into Diario.tb_backup(servidor,Data,Banco,lastbackupdate,Msg)
values ('$svr','$datas','$_.nome','$DBrasilUltimoBackup','$msg')"
Invoke-Sqlcmd -ServerInstance $ServidorCentral -Database $DatabaseCentral -Query $sql
}
}
}
Um abraço a Todos
Laerte Poltronieri Junior
PowerShell no Dia a Dia do DBA
http://laertejuniordba.spaces.live.com