PowerShell e o dia a dia do DBA – I


Continuação – I 

Todos os scripts eu criei um database chamado DBA no meu servidor central e um schema diario. As tabelas sermpre 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

Jobs/Backups

Verificar se todos os databases foram backapeados. Se algum novo database não foi, criar o plano de manutenção para ele.

Checar os Backups.Se algum falhou verificar causa da falha e garantir que será schedulado para noite.

Vamos lá

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 intaum 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, que tb faz parte destes artigos.

 

###########################################
# Criação das tabelas no SQL SREVER
###########################################

–Create table Diario.tb_backup (    Servidor varchar(50),
—                                data datetime default getdate (),
—                                Banco varchar(50),
—                                Lastbackupdate datetime ,
—                                Msg varchar(300)
—                               )

#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
            }               
    }               

Prontinho…agora é só gerar um .ps1 e rodar no shell do sql server 2008, caso queiram rodar no powershell mesmo temos que adicionar o provider do sql server

I´ll be back

About Laerte Junior

Laerte Junior Laerte Junior is a SQL Server specialist and an active member of WW SQL Server and the Windows PowerShell community. He also is a huge Star Wars fan (yes, he has the Darth Vader´s Helmet with the voice changer). He has a passion for DC comics and living the simple life. "May The Force be with all of us"
This entry was posted in Powershell. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s