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

 
Vamos lá

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.

 
Os outros servidores não precisam necessariamente ser 2008. Podem ser 2005 e 2000. O central que rodará o PS é interessante ser o 2008 para usarmos o PS do SQL SERVER. Digo isso pois podemos usar o Powershell normal sem o 2008, mas não vamos entrar no caso para não complicar.
 
###########################################
# 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 ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

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 OFF

GO

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

No meu primeiro Artigo eu mostro como rodar os scripts
 

Um abraço a Todos

 

Laerte Poltronieri Junior
PowerShell no Dia a Dia do DBA 
http://laertejuniordba.spaces.live.com