PowerShell e o dia a dia do DBA – VI


Continuação – VI  / Checar a conectividade entre os linked servers de todos os servidores

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

 

Conectividade

Checar a conectividade entre os linked servers de todos os servidores

Bom, continuando vamos agora testar a conectividade de todos os linked servers de todos os servidores previamente cadastrados no servidores.txt. Caso haja algum erro, vai ser inserido numa tabelinha com a msg de erro.

Este script é legal pois vamnos ver uma coisa nova, um tipo de tratamento de erro no PS, pois o metodo testconnection() da SMO não me traz resultado nenhum intaum temos que trabalhar com o erro que gerará.

Criar a tabela no SQL SERVER

Create table diario.tb_LinkeDServersErro
(servidor varchar(50),
data datetime,
NomeLInkedserver varchar(100),
msgerro varchar(500)
)

Script PS

[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null

$datas = [datetime] get-date -format "yyyy-mm-dd hh:mm:ss"

##########################################################
#Atribui o Dabatase e Server central que receberão os dados
##########################################################

$ServidorCentral = "SERVER1\MSSQLSERVER_1"
$DatabaseCentral = "DBA"

$sql = "truncate table diario.tb_LinkeDServersErro"
Invoke-Sqlcmd -ServerInstance $ServidorCentral -Database $DatabaseCentral -Query $sql

foreach ($svr in get-content "C:\dadosps\servidores.txt" )
{

    $Servidor=New-Object "Microsoft.SqlServer.Management.Smo.Server" "$svr"
    $data = $Servidor.linkedservers| where-object {$_.State -eq "Existing"} | foreach {
             trap [Exception] {
                 $erro =  $_.Exception.Message
                 $sql1 = "set dateformat dmy insert into diario.tb_LinkedServersErro(servidor,data,NomeLinkedServer,msgerro) values (‘$svr’,’$datas’,’$NomeLinkedServer’,’$erro’)"
                 Invoke-Sqlcmd -ServerInstance $ServidorCentral -Database $DatabaseCentral -Query $sql1
                 continue;
             }
             $NomeLInkedServer = $_.name
             $_.testconnection()

        }

}

 

Prontinho, assim ele andara em todos os linked servers de todos os servidores e testara a conectividade deles. Reparem que quem diz se esta com erro ou não é a exceção, tratada pelo trap[Exception].

Detalhe, todos os scripts que estou colocando funcionam nas versões 2000,2005 e 2008 do sql server. A intenção é essa, gerenciar multiplos servidores com versões de sql server diferentes.

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