Laerte's profile$hell Your Experience !!...PhotosBlogListsMore ![]() | Help |
|
November 18 Lendo, Filtrando, Salvando numa tabela do SQL ou em XML…Sushi…Enfim..Fazendo peripécias com o arquivo de trace do SQL Server Profiler usando POWERSHELL!!!!
(english version post below) Requer Powershell V2.0 Eu tinha um grande problema para ser resolvido. Meus arquivos de trace do profiler eram separados por folder, servidor, nome do trace mas a grande maioria tinha o “enable file rollover” selecionado gerando varias divisões do mesmo arquivo. Eramos em três turnos de DBA´s. Cada um gerava seus arquivos de trace conforme precisasse, mas várias vezes tive que acessar os traces gerados pelos outros dba´s juntando algumas colunas que com certeza não eram comuns entre os arquivos. Um era SP_locks por exemplo, o outro duration. Por que eu fazia isso ? Um duration alto que foi pego num trace, eu queria cruzar com o de locks do dia anterior para análise, entre vários outros cruzamentos. Isto era realmente complicado de se fazer de uma forma automatizada, uniforme e repetitiva. Até mesmo juntar todos os arquivos do mesmo trace era um trabalho chato. Eu poderia usar a fn_trace_gettable sem problema algum, mas quando falamos em automatizar este processo a coisa ficava grande em TSQL. Pior ainda se eu precisasse juntar, como eu disse, arquivos de traces diferentes. Foi quando resolvi usar powershell Um dos parâmetros da função quando comecei a pensar na solução foi gerar os arquivos em tabelas no SQL Server ($filetotable). Este parametro me fala pra pegar cada arquivo e gerar uma tabela. Mas e se eu quisesse todos em uma só tabela ? Eu precisava centralizar em uma tabela somente e como eu disse poderiam ser vários arquivos e com eventos e colunas diferentes entre eles. Isto começou a se tornar um problema quando eu vi o tamanho do código e das condições que estava ficando minha função. Na verdade eu estava pensando procedural, como eu montava minhas funções em Visual basic. Eu tinha esquecido umas das principais caraterísticas do powershell : Consistência. Para que eu ia fazer este esfardefuncio pandemonium de código, se a saída de um cmdlet é um objeto (TUDO NO POWERSHELL é objeto) e este pode ser a entrada de outro cmdlet ? Vamos ao código e alguns exemplos : Primeiramente os parâmetros : A função trabalha com 4 sendo que somente o primeiro é mandatório.
Get-SQLProfiler Script Code 1: Function Get-SQLProfiler ()2: <#3: ----------------------------------------------------------4: Load SQL SERVER Profiler Traces Files. (.trc)5: ----------------------------------------------------------6: Version 1.07: Laerte Poltronieri Junior8: www.laertejuniordba.spaces.live.com9:10: $TraceFileName = MANDATORY String Full SQL SERVER Trace File Path "C:\Temp\Profiler.trc" or "C:\temp\*.trc" Vamos fazer alguns testes : Eu criei um powershell módulo de função (.psm1) contendo somente este arquivo, para nossos testes correrem bem. No seu Powershell Profiler digite ? Import-Module -Name C:\temp\Get-SQLProfiler.psm1 -WarningAction SilentlyContinue -ErrorAction Stop
Eu tenho este arquivo de trace C:\Temp\ProfilerTraces\TSQL.trc O arquivo tem as colunas e eventos do SQL Server Profiler template TSQL. Execute : Get-SQLProfiler "C:\TEMP\ProfilerFiles\TSQL.TRC"
E o resultado será : As propriedades LineNumber e TraceFile sempre estarão em qualquer resultado desta função. LineNumber é um incremento e TraceFile é o nome do arquivo de trace. Lembre-se que todo resultado será com base nas colunas do tracem independente dos arquivos terem colunas diferentes. Vamos ver o mesmo resultado só que selecionando as propriedades LineNumber, TraceFile ,EventClass and TextData, filtrando pelo Linenumber menor que 5. Get-SQLProfiler "C:\TEMP\ProfilerFiles\TSQL.TRC" | where-object {$_.LineNumber -le 5} | select LineNumber, TraceFile ,EventClass ,TextData | format-table
Vamos usar o exemplo enterior só que $FiletoTable agora é $true, isso quer dizer que teremos uma tabela no SQL. Se não for informado server e database, uma mensagem de warning será exibida dizendo que os valores default serão usados. 1: Get-SQLProfiler "C:\TEMP\ProfilerFiles\TSQL.TRC" $true | where-object {$_.LineNumber -le 5} | select LineNumber, TraceFile ,EventClass ,TextData | format-table E a tabela no SQL SERVER
Digamos que temos varios árquivos SQL Server Profiler trace com rollover. Se quisermos juntá-los simplesmente passe o path dos traces .
A figura abaixo mostra quando o arquivo muda : Serão criadas uma tabela para cada arquivo. Se você quiser todos os arquivos em uma tabela somente, simplesmente salve esta saida num XML e importe depois (mais 2 linhas). Veremos abaixo como fazer isso .
Podemos também juntar arquivos de trace com diferente colunas e eventos. No exemplo abaixo eu juntei um trace TSQL_SP com TSQL_Locks. Bom Laerte mas se eu juntar vários arquivos com colunas diferentes como eu vou saber as propriedades que estão nele. Simples, se você não quiser usar o get-member, ponha um filtro com linenumber = 1 LINENUMBER e TRACEFILE sempre serão retorno na Get-SQLProfiler. 1: Get-SQLProfiler "C:\TEMP\ProfilerFiles\Merge\*.TRC" | where-object {$_.LineNumber -le 1} | format-table Now just get the list, choose the fields and put in | select. Lembre-se que com a opção $FiletoTable true, serão criadas tabelas para cada arquivo de trace. “Ha Laerte, mas eu quero centralizar todos meus traces em uma tabela somente”. Eu confesso que primeiramente eu queria fazer isso por parâmetro, mas para que se posso com mais duas linhas fazer isso. Powershell resolve isso para mim e eu não preciso “Engessar” minha função. Primeirament eu crio uma tabela com coluna XML USE [tempdb]
GO /****** Object: Table [dbo].[PowershellProfileTable_XML] Script Date: 11/18/2009 02:27:39 ******/ If EXISTS (Select * FROM sys.objects WHERE Object_id = Object_ID(N'[dbo].[PowershellProfileTable_XML]') And type In (N'U')) DROP TABLE [dbo].[PowershellProfileTable_XML] GO USE [tempdb] GO /****** Object: Table [dbo].[PowershellProfileTable_XML] Script Date: 11/18/2009 02:27:42 ******/ Set ANSI_NULLS On GO Set QUOTED_IDENTIFIER On GO CREATE TABLE [dbo].[PowershellProfileTable_XML]( [XML] [xml] NULL ) On [PRIMARY] GO
Agora o powershell vai trabalhar. Somente salvamos em XML…e podemos escolher quais propriedades (colunas). (Get-SQLProfiler "C:\TEMP\*.TRC" | Select LIneNumber,EventClass,TextData,NTUserName,LoginName | ConvertTo-Xml -NoTypeInformation).save("c:\temp\teste.xml")
$XML= "insert into PowershellProfileTable_XML values ('" + ((Get-Content "C:\Temp\teste.xml") -replace "'", "''") + "')" invoke-sqlcmd -ServerInstance $env:COMPUTERNAME -database "master" -query $xml
E com umas simples Xquery tiramos os dados do campo XML : Select t2.Col1.value('(Property[@Name="LineNumber"]/text())[1]', 'int') LineNumber,
t2.Col1.value('(Property[@Name="EventClass"]/text())[1]', 'nvarchar(255)') EventClass, t2.Col1.value('(Property[@Name="TextData"]/text())[1]', 'nvarchar(max)') TextData, t2.Col1.value('(Property[@Name="NTUserName"]/text())[1]', 'nvarchar(255)') NtUserName, t2.Col1.value('(Property[@Name="LoginName"]/text())[1]', 'nvarchar(255)') LoginName FROM dbo.testeXML CROSS APPLY xml.nodes('/Objects/Object') As t2(Col1) where t2.Col1.value('(Property[@Name="LoginName"]/text())[1]', 'nvarchar(255)') Like '%laerte%'
Eu não preciso criar mais um parâmetro para fazer esta operação. A característica de CONSISTÊNCIA do powershell faz isso pra mim. Eu simplesmente coloco o pipe (|) e posso gravar em XML, filtrar por qualquer propriedade , importar pra tabela SQL, exportar pra TXT..e porque não SUSHI..hehehe. Muito obrigado ao meu amigo Shay Levy que sempre tem tempo para me passar seus grandes conhecimentos. Jeffrey Hicks também, com várias dicas de como usar mandatory parameters,meu amigo e companheiro de SQL SERVER DAY Felipe Ferreira no XQuery e óbvio o mestre do POWERSHELL com SQL SERVER Chad Miller. Bom são 2 da manhã e eu estou ouvindo um som fantástico ( dica de Thomas - @doctordns) POWERSHELL ROCKS !!!!!
Dancing In The StreetGrateful Dead
Read, Filter,Save to SQL Table or XML…Sushi..Anyway FUN with SQL Server Profiler Trace Files in POWERSHELL
Excuse me for English, is by google. Requires Powershell V2.0 It was an annoying proceeding to be done. I had my trace files separated by folder, but as I check Enable File Rollover and it was raised many divisions of the same trace. There were three shifts of DBAs. Each placed the need to trace your problem. Sometimes I also look to bring together various files needed to trace the events and different columns in the same. It was really hard to do this Some of our servers were very busy and put the trace file for SQL Server table was negated by the overhead generated, so I've had to import to SQL Server later. A simple procedure for fn_trace_gettable to one file, but when you have multiple files becomes complicated to generate a uniform and repetitive script. And worse if I had to join the trace files in a single file .. It was then that I decided to use powershell. One of the parameters when I began to think of the solution was to be generated tables to the SQL Server ($filetotable) There was no problem in setting this parameter . But I wanted to centralize all the files in a table and as I said, these files could come with different events and columns. This became a problem when I began to see as many lines of code and conditions that would have this function. Actually I was thinking procedural, as I did my functions in Visual Basic. I forgot one of the main features of Powershell: Consistency. Why would I do all this code, if the output of a cmdlet is an object and can be the input of the next cmdlet? So..lets go the code and examples : First the parameters. The functions works with 4 parameters being one (the first) mandatory.
Get-SQLProfiler Script Code 1: Function Get-SQLProfiler ()2: <#3: ----------------------------------------------------------4: Load SQL SERVER Profiler Traces Files. (.trc)5: ----------------------------------------------------------6: Version 1.07: Laerte Poltronieri Junior8: www.laertejuniordba.spaces.live.com9:10: $TraceFileName = MANDATORY String Full SQL SERVER Trace File Path "C:\Temp\Profiler.trc" or "C:\temp\*.trc"
Let´s do some tests : I created a function module with only this function and import it in my powershell profile. Only for our test be better !!!! At powershell profiler type : Import-Module -Name C:\temp\Get-SQLProfiler.psm1 -WarningAction SilentlyContinue -ErrorAction Stop
We have this SQL Server Profiler trace C:\Temp\ProfilerTraces\TSQL.trc This File contains the events and columns of the SQL Server Profiler template TSQL. Execute : Get-SQLProfiler "C:\TEMP\ProfilerFiles\TSQL.TRC"
and the result : The properties LineNumber and TraceFile will be in any resulting object of this function. LineNumber is the line number (increment) and TraceFile is the name of the trace. Remember, these properties match the columns in the trace file. Even if I'm merging files with different columns and events. Let´s see only the properties LineNumber, TraceFile ,EventClass and TextData, filtering the lines smaller than or equal to 5 Get-SQLProfiler "C:\TEMP\ProfilerFiles\TSQL.TRC" | where-object {$_.LineNumber -le 5} | select LineNumber, TraceFile ,EventClass ,TextData | format-table
With the previous example we have the same result with $FiletoTable parameter $true, but means now we have a SQL Server Table. As not informed as the server and database, a warning message was displayed that would be used default values : 1: Get-SQLProfiler "C:\TEMP\ProfilerFiles\TSQL.TRC" $true | where-object {$_.LineNumber -le 5} | select LineNumber, TraceFile ,EventClass ,TextData | format-table And the SQL Server table :
Let´s say we have a SQL Server Profiler trace file rollover. If you want to merge result simply enter the path that are the trace files.
The figure below shows when the file changes : Will be created one SQL table for each trace file. If you want all trace files are placed in one table, save the result of the cmdlet in XML (or txt) to import soon after the invoke-sqlcmd. Below I have one example.
We can also merge two files of traces with different columns. In the example I merge a file TSQL_SP with TSQL_Locks. Well Laerte, but if I merge multiples files with different set up, how can I now the properties from Get-SQLProfiler ? Simple, put a filter to one row or linenumber = 1 LINENUMBER and TRACEFILE Always be at Get-SQLProfiler. 1: Get-SQLProfiler "C:\TEMP\ProfilerFiles\Merge\*.TRC" | where-object {$_.LineNumber -le 1} | format-table Now just get the list, choose the fields and put in | select. Remember that for multiple files with the option $FiletoTable true, it creates several tables, one for each file. First I Create a table with XML colum. For tests I Put at tempdb : USE [tempdb]
GO /****** Object: Table [dbo].[PowershellProfileTable_XML] Script Date: 11/18/2009 02:27:39 ******/ If EXISTS (Select * FROM sys.objects WHERE Object_id = Object_ID(N'[dbo].[PowershellProfileTable_XML]') And type In (N'U')) DROP TABLE [dbo].[PowershellProfileTable_XML] GO USE [tempdb] GO /****** Object: Table [dbo].[PowershellProfileTable_XML] Script Date: 11/18/2009 02:27:42 ******/ Set ANSI_NULLS On GO Set QUOTED_IDENTIFIER On GO CREATE TABLE [dbo].[PowershellProfileTable_XML]( [XML] [xml] NULL ) On [PRIMARY] GO
and let´s wait Powershell to work. We just save to XML …and we can choose de properties too!!! (Get-SQLProfiler "C:\TEMP\*.TRC" | Select LIneNumber,EventClass,TextData,NTUserName,LoginName | ConvertTo-Xml -NoTypeInformation).save("c:\temp\teste.xml")
$XML= "insert into PowershellProfileTable_XML values ('" + ((Get-Content "C:\Temp\teste.xml") -replace "'", "''") + "')" invoke-sqlcmd -ServerInstance $env:COMPUTERNAME -database "master" -query $xml
And with a simple Xquery we list all data into XML .Let’s See ? Select t2.Col1.value('(Property[@Name="LineNumber"]/text())[1]', 'int') LineNumber,
t2.Col1.value('(Property[@Name="EventClass"]/text())[1]', 'nvarchar(255)') EventClass, t2.Col1.value('(Property[@Name="TextData"]/text())[1]', 'nvarchar(max)') TextData, t2.Col1.value('(Property[@Name="NTUserName"]/text())[1]', 'nvarchar(255)') NtUserName, t2.Col1.value('(Property[@Name="LoginName"]/text())[1]', 'nvarchar(255)') LoginName FROM dbo.testeXML CROSS APPLY xml.nodes('/Objects/Object') As t2(Col1) where t2.Col1.value('(Property[@Name="LoginName"]/text())[1]', 'nvarchar(255)') Like '%laerte%'
I do not need to put more parameters to add a table…etc. The consistency characteristic of powershell does it for me. I just need to pipe and save. We can Read, save to XML, filter by any property, import to SQL Table…and Sushi. Thanks to my friend Shay Levy as always has time to share his great knowledge. Jeffrey Hicks too, with a lot of tips to mandatory parameters in functions ,my SQL SERVER DAY fellow Felipe Ferreira in XQuery and obvius Chad Miller, the master in powershell with SQL Server opinions to optimize this code are welcome! Well It's 2 o'clock in the morning and I hear a sound very good (tip from Thomas - doctordns) ... POWERSHELL ROCKS !!!!!
Dancing In The StreetGrateful Dead
November 14 Check/Fix Usuários Órfãos após Restore com PowershellPessoal, No artigo que sairá no simple-talk, fiz uma pequena alteração para contemplar usuários órfãos depois de um restore e o que coloquei aqui não tem, então segue o código. Meu cenário na época era o seguinte. Eu tinha aquele problema que alguns usuários das empresas que cuidávamos podiam alterar/Dropar, por contrato, os logins. Nunca entrei no mérito de saber porque,não era da mina conta isso. Eu tinha que fazer a coisa funcionar até se o Papa fosse o usuário principal. Meu problema era que o pessoal ,muito bem capacitado não posso dizer o contrário, infelizmente não se preocupava com os usuários. E isso era constante. Tínhamos muitos servidores deste gigante cliente. Digamos que eu fazia esta checagem todo dia. Resolvi centralizando um script que coletava estes usuários órfãos em todos os servidores. Após isso o User ou era dropado ou criávamos o login. Mas também tínhamos o caso do restore. Todo domingo restaurávamos por JOBs, bases de produção pra desenvolvimento. Mas acontecia que o Servidor de Produção X tinha N bases a serem restauradas pro servidor de desenvolvimento Y, O servidor H mais N bases pra desenvolvimento. Definimos que os usuários que não possuíam login seriam dropados após o restore e os outros mapeados. Uma padronização que tínhamos : Os logins criados possuíam o mesmo nome de usuários. Pelo menos !!!! Vamos lá. Primeira coisa é criar um TXT chamado ServersRestored.txt (ou qq outro nome..podemos passar o nome do script) que terá o nome dos servidores que terão o restore e logo a frente os bancos separados por vírgula. Usaremos o Powershell 2.0, pois trabalharemos agora não mais com arquivo de funções e sim com Windows Powershell Script Module , Advanced Functions e Tratamento de Erros baseados em Try Catch. Um Windows Powershell Script Module é um módulo de funções (Extensão .PSM1) que contém Advanced Functions e pode ser facilmente adicionado ao seu Arquivo de Profiler. As Advanced Functions são funções que possuem comandos e características avançadas, podendo assim ser colocadas num .ps1, no seu Arquivo de Profiler, ou digitadas em linha de comando mesmo. Quer saber mais ?
Voltando a nosso script, o txt será assim: Colocamos na nossa pasta de scripts C:\PS\Servers o Script FixLoginsByrestore.ps1 1:2: <#3:4: $FileListName = Name of FileList that contains servers and db will be restored5: Server1,db2,db36: Server2,db1,db27: Server3\Instace1,db2,db3,db4,db5,db68:9: $DropUserNotLogin = Flag to Drop a user withou login. default = true10:11: $PathServerList = Path that have a $FileListName12:13: $PathLogFile = Path to log error file14: $PathFunctionFile = Path constains Function File15:16: #>17:18:19: param ( [String]$FileListName,20: [bool]$DropUserNotLogin = $true,21: [string]$PathServerList = "C:\PS\servers",22: [string]$PathLogFile = "C:\PS\logs",23: [string]$PathFunctionFile = "C:\PS\PSScripts"24:25: )26:27: Como podemos ver no script, temos os parâmetros :
Nome do TXT a ser lido com a lista dos servidores e bancos que serão restaurados.
Flag que informa se o user vai ser dropado se não tiver o Login
Path que está a lista
Path que será gerado o LOG. Neste script TUDO é logado. Se mapeou, dropou o login ou mensagens de erro
Path que está o modulo de funções (.PSM1) Vamos colocar o modulo de funções : 1:2: Function Save-Log ()3: <#4: ---------------------------------------------------------- Baixar Functions.psm1 (functions.rar)
Com tudo pronto, deixávamos um Job para rodar as 6 da manhã de segunda (após todos os restores terem sido feitos) que fazia o trabalho pra gente.
A chamada era simples. Num Job CMDEXEC colocávamos :
Show de Bola !!!!
Com a passagem do arquivo txt que quisermos pro script, damos a flexibilidade de alterar para um servidor somente ou o numero de servidores e databases que você quiser. Este script serve para 1 ou 1000 servidores..
Um dos inúmeros recursos que temos no powershell é produtividade. Mas você deve estar pensando : Mas estes scripts estão um pouco maior dos que você colocava. Sim estão . Quando temos muitos servidores (ou até um…como eu disse no artigo o que diferenciará você dos outros é sua maneira de pensar : Grande ou Pequena) tudo tem que ser repetitivo, uniforme, consistente automatizado e PRINCIPALMENTE com tratamento de erros. Reparem que a maioria do código é tratamento de erros.
Tente fazer este mesmo script, com os recursos que tem nele (dropar ou mapear usuário, gerar arquivo de log para cada ação executada, verificar se o login existe pro usuário..etc) em TSQL e me diga, caso consiga fazer , o número de linhas que terá. Além do que você teria que gerar este script TSQL em cada servidor e assim, não centralizando o processo.
Como o som que finalizo este post, eu na minha humilde opinião tenho um pensamento sobre administração centralizada :
AP/DP – Antes de Powershell e Depois de Powershell
POWERSHEL ROCKS !!!
Highway To HellAC/DC
Apresentação Powershell & SQL Server na ETEC Antonio Devisate de Marília
Pessoal, Com bastante satisfação aceitei um convite para fazer uma apresentação de duas horas sobre Powershell & SQL Server para as três turmas de Tecnologia da Informação da ETEC Antonio Devisate de Marília. ( e já temos uma em andamento para a ETEC de Garça) Acontecerá dia 24/11/2009 e novamente temos o apoio do CEA. (comunidade em ação) Acho que consegui passar, apesar do pouco tempo e imprevistos, a fantástica tecnologia que é o Powershell no SQL SERVER DAY e felizmente a comunidade está aderindo a este modelo de administração. Haaaa..Marília e Região..aguardem…teremos Grandes Novidades no ano que vem !!!! Galerinha da ETEC..já veremos o Powershell 2.0 ..!!!!!!! POWERSHELL & CEA ROCKS !!!!!!!
Take A PictureFilterNovember 10 Alterando o Collation de Colunas das Tabelas com Powershell
Tarde gente.. Vai mais um script que acredito ser útil : Alterar Collations das colunas de tabelas. Pra começar, aquele nosso arquivinho servers.txt com todos os servidores a serem alterados. No meu caso fica em C:\PS\Servers E também usamos o arquivo functions.ps1 que pode ser baixado aqui.(lembre-se de deixar o functions.ps1 no mesmo path do script principal)A SMO também possui as restrições que TSQL tem (PK, FK, Indice..ect) mas estes campos que não se consegui alterar serão logados. Vamos ao Script :
Baixe ele aqui Bom, este script te gera um arquivo de erro (um log) com as colunas que ele não conseguiu alterar, informando o server, database, tabela, coluna e mensagem de erro. Por ali você pode pegar os caras que não funcionaram e alterar na mão. Este arquivo, o path dele você passa na chamada do ps1, juntamente com o collation novo. Digamos que eu queria trocar o collation de todas as tabelas, em todos os databases, na lista do servers.txt para Latin1_General_CS_AI C:\ps\psscripts\SetCollation.ps1 “Latin1_General_CS_AI” “C:\temp” Aonde o primeiro parâmetro é o Collation Novo e o Segundo o path do arquivo de erro. QQ dúvida …tumm.tum..tumtum..tum POWERSHELL ROCKS !!!!!
Second ChanceShinedownNovember 09 Demos e PPT da apresentação de POWERSHELL & SQL Server
Pessoal , segue o link da apresentação Quem quiser baixar fique a vontade !!!! QQ duvida nos exemplos..já sabem..msn, email,skype, twitter, sinal de fumaça, tambor…. agente dá um jeito de compartilhar a informação A apresentação está em PPT, PDF…escolham a que quiserem !!!! Também coloquei o POWERGUI, ferramenta que uso para meus scripts POWERSHELL. Baixar Apresentação e Demos POWERSHELL & SQLServer MSN : laertejuniordba@hotmail.comEmail : laertejuniordba@hotmail.comSkype : laertejuniordbaTwitter : www.twitter.com/laertejuniordbaBlog Simple-Talk :www.simple-talk.com/community/blogs/laerte/Tambor : Tum tum tum …tumtutum..tumtumtumSinal de fumaça : Só vendo
Into The OceanBlue OctoberSQL SERVER DAY …conseguimos !!!!Pessoal, Vou contar um pouquinho como foi a noite de sexta para sábado e durante o evento.Pra quem não sabia, eu o Fabiano e o Thiago fizemos as apresentações presencial na ETEC Antônio Devisate de Marília.Novamente agradecimentos ao meu amigo de longa data Professor Arnaldo , Diretoria e coordenação.
Sexta :6 da manhã : Após revisar pela 72346723647823 vez minha apresentação e scripts, resolvi montar mais um script.11 da noite : Fui revisar novamente meus scripts. Uma chuva maravilhosa e caiu a força. Meu note estava na tomada. Tentei ligar o note, PUFFF..Nada. Pensei, vou esperar a força voltar. Alguns minutos depois voltou…..e meu note nada.,.ligava..mas não saia da tela de entrada do windows. Não pensei duas vezes, peguei meu WINDOWS ORIGINAL e comecei o trabalho. Formatar e instalar TUDO.
Sabado4 da manhã : Eu , o professor Arnaldo e o Mateus (Grande Mateus) fomos buscar o Thiago Zavaschi que estava chegando de Curitiba7 da manhã : Finalizei tudo e meu note estava pronto. TEstei de novo tudo ate as 8 da manhã8 da manha : Fomos para ETEC30 minutos antes de começar minha apresentação , fui testar meus scripts. (Mateus ainda disse : “cara tu ja testou o dia inteiro, não se preocupe..vai dar tudo certo”..mas alguma coisa não estava certa ,seilá..!!!!)Minha máquina começou a rebootar sozinha. Uma vez, duas vezes…Pensei já era. Não podia usar o note do Zavaschi por conta que ele estava em apresentação.Bom, resolvido como ?Peguei o note de um aluno que estava vendo a apresentação lá. E comecei a instalar as coisas.Terminei 5 minutos antes do Zavaschi acabar.Fui me conectar …sem áudio. Pegamos o 3G do Zavaschi e conectamos. O som saiu dali e a apresentação do note do aluno.Imaginem meu nervoso de querer compartilhar com vocês o pouco que sei de POWERSHELL e tudo dando errado.Thiagão..o que você fez, eu sabia que teu 3G estava com o limite free estourado e ia começar a pagar a partir dali, mas tu não pensou duas vezes..”Cara..vai no 3G…”. O que eu posso dizer ? TU É O CARA, seja pela seu extenso conhecimento técnico , seja pela sua humildade e companheirismo.Em suma…apesar de imprevistos o show tem que continuar, e se por acaso alguém não gostou me desculpem, não foi esta intenção.Eu tinha que mostrar pra vocês POWERSHELL, nem que fosse por sinal de fumaça.Acho que consegui.Finalizei minha apresentação e ficamos até quase as 10, mas eu estava a quase 39 horas sem dormir e não tinha mais condição alguma de continuar e a escola precisava fechar as 10 horas.Chegamos em casa e eu ainda tentei pegar o final…mas o cansaço não deixava !!!! O Zavaschi viu tudo e me disse depois como foi e eu fiquei muito feliz por conta que TODOS foram excepcionais em suas apresentações e principalmente o Vladimir.VLADIMIR…CARA VOCE É O HEROI DESSE SQL SERVER DAY. NÃO DEIXOU A PETECA CAIR A TARDE !!!Alexandre, eu não tenho como lhe agradecer. Você acreditou em mim desde o começo e espero que tenha pelo menos chegado perto de suas expectativas na minha apresentação.Professor Arnaldo..não é por que você é meu amigo a tantos anos,…mas você é uma pessoa única. O que você fez pela gente e principalmente pelo Thiago não se compra !!!!! Mateus..nosso fotógrafo, infra,mecânico..enfim tudo…MUITO OBRIGADO me sinto feliz de ter um novo amigo ..conte comigo para o que você precisar !!!!!!..Continue sempre ouvindo esse cara chamado Arnaldo…você vai longe assim garoto !!!!! Fabiano e Thiago. Obrigado por terem vindo. Fabiano estava trabalhando e mesmo assim veio até Marilia para fazer sua apresentação. Thiago viajou 600 KM SÓ PARA VIR APRESENTAR !!!..Esses são os tipos de pessoas que fazem parte desseFANTÁSTICO GRUPO do sql server day.
ETEC Antonio Devisate de Marília. Muito obrigado por todo apoio técnico. Realmente os alunos tem que se orgulhar da infra estrutura que vocês possuem !!!! Meus amigos e o publico de quase 100 pessoas ONLINE que estavam lá, eu não via, mas meu moderador me disse das palavras de carinho de vocês.MUITO OBRIGADO !!!!! Se eu consegui passar esse pouco de powershell, foi graças a vocês que também acreditaram em mim.
O que eu tirei disso tudo ?
SE TU TIVER FORÇA DE VONTADE, SOUBER DO SEU COMPROMISSO COM A COMUNIDADE E PRINCIPALMENTE TIVER AMIGOS COMO EU TIVE EM TODOS OS MOMENTOS…..NADA TE SEGURA !!!!! Novamente obrigado THIAGO…o som foi graças a teu 3G. Algumas fotos do que foi para gente esse SQL SERVER DAY , pelo menos pra mim…é algo que não vou esquecer….. Não sei se estarei nos próximos..mas NESSE EU ESTIVE !!!!
ALMOÇO MAIS DO Q BOM !!! (casa do Prof Arnaldo) PEROLAS SQL SERVER DAY ROCKS !!!!
Girl, You'll Be A Woman SoonUrge OverkillNovember 06 SQL SERVER DAY ……AMANHÃ !!!!
Pessoal, Falta 1 dia pro MAIOR EVENTO de SQL SERVER que o Brasil já viu. CEA Sem vocês nada disso estaria acontecendo . Obrigado !!!!!!!!!!!!!!!!!!!!! (Andressa você é um anjo) Luciano Palma mesmo estando em outro evento, abrirá o nosso. Obrigado !!!!!!! Eu queria agradecer ao Nilton Pinheiro (MCDBABRASIL), meu site de coração. Sem palavras o que você fez pela gente !!!! Annabel, Andrew, Chris, Brad McGehee e todo pessoal da REDGATE (Simple-Talk, SQLServerCentral) que não mediu esforços também para nos ajudar !!! Pessoal do forum MCITP Brasil , vocês são demais. Mais um ótimo fórum de tecnologia para ajudar a comunidade !!!! Miguel Reina da Consultoria Nextsys , o que posso dizer meu amigo ? OBRIGADO !!!!! Não é a toa que a Nextsys é uma das melhores consultorias que tive o prazer de trabalhar !!! Tiago Baeta e Rina Noronha do Imasters . Bastou estrar em contato somente !!!!!! Obrigado !!!!!! Dmitry Sotnikov (PowerGUI – A FERRAMENTA GRAFICA DE POWERSHELL) e Susan Roper (Manager Product Marketing), ambos da QUEST. Comentei num dia e no mesmo já tinha aprovação de apoio!!!! Pessoal da ETEC Antonio Devisate de Marilia, Professor Arnaldo Hidalgo Junior, Diretor João Antônio de Oliveira Barbosa, coordenação e a todos professores que estão nos apoiando com toda estrutura técnica . OBRIGADO !!!! AO TIME do SQL SERVER DAY (Organização, Palestrantes,e moderadores) um grande parabéns !!!!!! E PRINCIPALMENTE A VOCÊS GALERA !!!! MAIS DE 600 inscritos !!!! SQL SERVER DAY ROCKS !!!!!!!
Seize the DayAvenged SevenfoldNovember 02 “How To Became an Exceptional DBA” usando Powershell Parte IVersão português !!! A ingrêis ta saindo….sabe como é ..se português já é complicado, o editor fica de cabelo em pé quando vê meu inglês… "How to Became an Exceptional DBA" é um daqueles handbooks que estão em minha coleção privada, ao lado no “Inside SQL Server 2000” da Kalen Dalaney. São exemplos de livros que mudam seu jeito de pensar, trabalhar e entender as coisas. Para ser sincero, a primeira vez que li pensei : “A maioria é utopia”. Mas utópico era minha organização. Eu não conseguia ver fora daquele “mundinho” que eu tinha criado com minhas ações profissionais que eu pensava não precisar de mais . Estava bom daquele jeito. Hoje eu vejo que cada palavra que Brad McGehee escreveu neste sensacional handbook é perfeitamente aplicável a qualquer organização que você trabalhe. Seja pequena ou grande o que diferenciará , depois de ler, é seu jeito de pensar : Pequeno ou grande. O ensinamentos deste handbook me influenciaram tanto que quando comecei a aprender o pouco que eu sei de Powershell eu pensei :
E hoje meus amigos, eu compartilho com vocês alguns destes scripts que uso diariamente baseado neste handbook . Para não ser entediante a leitura ele foi dividido, e esta é a primeira parte. How to Became an Exceptional DBA using Powershell Parte ICheck/Fix Usuários órfãos
O cenário John IDontKnow, Robert IDontknowEither e você são DBAs de um grande datacenter em 3 turnos diários. O seu é das 7:00 AM as 16:00 PM. Todos os 3 tem autonomia suficiente para tomar decisões e medidas necessárias para o funcionamento do parque de servidores SQL Server do principal cliente da companhia, que compreende uma complexa estrutura OLTP e OLAP. Seu gerente, um antigo DBA da companhia (sim, ele é técnico e dos bons) em uma reunião pediu para você procurar por usuários órfãos no ambiente para implementarem uma politica de segurança adequada. Você responde :
Mas não seria melhor responder :
Você é um “Exceptional DBA” e usa Powershell !!! Check/Fix Usuários órfãos Neste script, trabalharemos com tratamento de erros, no caso de algum servidor estar offline.Infelizmente este script está na versão 1.0 e o tratamento de erros nesta versão não é tão avançado quanto a 2.0.Os próximos artigos da série provavelmente serão na 2.0Nós trabalharemos com 2 funções. Uma para gerar o arquivo de log do tratamento de erros e outra para verificar se o login existe ou tem que ser criado. A primeira coisa a ser fazer é criar 3 folders que terão o TXT com a lista de servidores, o arquivo de log e os scripts ps1 respectivamente. Neste caso :Lista de servidores –> “C:\PS\Servers\Servers.txt”,Log estará --> “C:\PS\Logs\OrphanedUsers”Scripts ps1 --> “C:\PS\PSScripts”O Arquivo TXT que terá a lista de servidores , deverá conter TODOS os servidores a serem monitorados e caso haja mais de uma instância , também deverá ser colocada :
Se você não tem o SQL Server 2008 instalado mas quer usar o provider, está é uma boa referência : Installing SQL Server 2008 PowerShell snap-ins for SQL Server 2005 - Tim Benninghoff Profile
Ou seja, como veremos a execução do job tipo powershell e cmdexec, precisamos adicionar os providers doSQL SERVER 2008 no powershell.exe. Lembre-se o host do SQL SERVER 2008 já vem, mas o shell normal não.Olhe no path :
Abra este arquivo, se ele não existe crie com o nome acima.
Desta maneira todos os shells e usuários estarão habilitados a usar o SQL SERVER provider. Com isto pronto, vamos a função que gerará o log se tivermos problema e procurará pelos logins.
O próximo passo é salvar este script no mesmo path para todos .ps1 . C:\PS\PSScripts\Functions.ps1 Pronto podemos criar a tabela no repositório.
E AGORA O SCRIPT PARA CHECAGEM :
O próximo passo é gravar este script em C:\PS\PSScripts\OrphanedUsers.ps1 A função Save-Log gera um arquivo de LOG com os erros encontrados e grava na pasta C:\PS\Logs\OrphanedUsers com o mesmo nome do .ps1 mais data e hora , que neste caso é OrphanedUsers.ps1. A figura abaixo mostra isso : (CLIQUE NELAS PARA AUMENTAR) Agora se quisermos ver os dados que foram logados na tabela : Mas se percebermos no código em powershell eu coloquei esta linha Insert = !(Get-Login $Server $user.name) Isso se deve ao fato que podemos ter dois tipos de usuários órfãos :
E clicando na coluna Users abrirá o XML e no nó CreateLogin eu tenho esta informação. Se preciso criar ou mapear. Agora para visualizarmos os dados com a ultima coleta, usamos :
Mapeando User com LoginComo já temos a informação dos logins a serem criados antes de mapear pela coluna CreateLogin , vamos gerar os comandos para mapear os que não precisam ser criados ou seja, já existem. (createlogin = false) Podemos fazer em TSQL (Visualizar em Modo Texto)
O resultado será :
Podemos usar a opção AUTO_FIX na sp_change_users_login,mas eu acredito ser melhor por questões de segurança analisar primeiro antes de criar o Login. Mais sobre sp_change_users_login ? (eu coloquei por questões de compatibilidade , procure por alter login)
OU PODEMOS REPARAR USANDO POWERSHELL (não se esqueça, você é um “Exceptional DBA” e usa powershell) Poderíamos alterar o script powershell para que depois de inserido na tabela, já mapeasse o login.Mas eu particularmente prefiro ver antes. Então após analisar, vamos na tabela que está logado os users : tblOrphanedUsers
Baixar este script FixUserLogin.ps1 Na linha :$SqlConn1.ConnectionString = "Server=<ServerRepository>;Database= <DatabaseRepository>;Integrated Security=True"
Alterar para para o nome de seu servidor e database.Este script eu não trato erros, pois rodo manualmente sem jobs .
Schedulando a Checagem Se você estiver usando o SQL Server 2008 somente basta criar um job com step tipo powershell e executar o script. A figura abaixo demonstra isso : Command :
Se estiver usando versões anteriores (inclusive a 2000 depois de ter adicionado os providers e baixado o powershell), basta criar um job com step cmdexec conforme mostra figura abaixo : Command :
Depois é só schedular conforme sua necessidade !!!!!!! Bom pessoal, vimos nesta primeira parte como checar e reparar usuários órfãos. Eu particularmente quando preciso de um processo que seja repetido várias vezes uniformemente e gerenciando múltiplos servidores (isto serve para 1 ou 1000 servidores) não consigo mais ver outra maneira sem ser com a consistência e produtividade do Powershell . Nos próximos artigos veremos mais checagens, fazendo de você um “Exceptional DBA” usando Powershell !!!!! Hahaaaaa acharam que eu ia esquecer néééééé !!!! POWERSHELL ROCKS !!!! Finalizei a versão em português ouvindo Ramones……E este som merece estar inteiro :
Poison HeartRamones
Tks a meu amigo Felipe Ferreira que me ajudou no Xquery !!!! October 28 SQL SERVER DAY !!!REDGATE , SIMPLE-TALK APOIAM !!!!!
IMASTERS e MCDBABRASIL APOIAM !!! “!I saw him dancing there by the record machine Singin' I love rock and roll *OWWW*” I Love Rock 'N RollJoan JettOctober 27 POWERSHELL V2.0 pro nosso querido e amado XP !!!!
Galera, saiu FINALMENTE o PS V2.0 pro nosso XP.. Na verdade é um “pacotão” chamado Windows Management Framework, que vem com :
Para baixar e maiores informações !!!Windows Management Framework is here!
FIX !!!! Fix for PowerShell v2 on XP related crashes in MSCORSVW.DLLhttp://halr9000.com/article/833
“And to love, a god It is known, just scream it from the wall Selling The DramaLiveJÁ RODEI REBUILD MAS MEU ÍNDICE NÃO DESFRAGMENTA !!!!
Pessoal, uma pergunta que vejo frequentemente em fóruns é : Já rodei rebuild, reorganize…coloquei até galinha preta na encruzilhada….e meu índice não desfragmenta. Porque ? Galera, tudo se baseia no número de páginas do índice. Rode a sys.dm_db_index_physical_stats e procure na coluna pagecount.
Se estiver abaixo de 1000 páginas (ou próximo..caso seja acima), não se preocupe.O Engine não vai se dar ao trabalho de desfragmentar pois provavelmente o índice inteiro está em cache, e então a fragmentação passa a ser irrelevante.Lembre-se Page Split é operação de IO.
Outra coisa, tabelas heap dificilmente tem fragmentação, pois não tem uma ordem física definida e as páginas vão pro final do arquivo.Quando uma uma coluna é atualizada e não tem espaço na página, cria-se ponteiros. Então cria-se uma nova página, a linha vai pra ela e é colocado uma referência a este ponteiro na nova página.Eu vejo bastante dizer que basta colocar o índice cluster e dropar depois pra desfragmentar, mas isso é considerado uma prática ruim pelo Paul Randal … ele não fala porque.
Mais uma, se você reorganizar precisa atualiza estatísticas. Rebuild não precisa !!!! Quer ler mais sobre o assunto ? Vai que esse louuuuuuco tá falando besteira né!!! (eu posso ate falar, mas o carinha ai do link não) http://www.sqlskills.com/blogs/paul/
“Tudo bem se não deu certo Mas você lembra! Você Vai Lembrar De MimNenhum de NósDica Rápida !!! Um pouco de Teclado no SSMS
Pessoal, que não lembra do SQL2000 o CTRL+SHIFT+C para comentar as linhas no QA. No 2005 e 2008 não tiraram isso não. Basta colocarmos o teclado em compatibilidade SQL2000 Vá em Tools->Options->keyboard E também podemos adicionar comandos novos !!!. Nesta imagem quando teclo CTRL+F1 rodo o sp_helpindex , CTRL+3 é a sp_spaceused. Basta configurar da maneira que quiser !!! E essa ..olha só a imagem a baixo e me digam como consegui selecionar somente o meio das linhas !!!
Tente com SHIFT+ALT e as setinhas….!!!!
“I got to have a shot of what you got is oh so sweet.You got to make it hot, like a boomerang I need a repeat,Gimme all your lovin', all your hugs and kisses too,Gimme all your lovin', don't let up until we're through,”
Gimme All Your Lovin'ZZ TopOctober 26 Executando uma Query em Múltiplos Servidores
Se eu quiser trocar a senha de SA de todos os meus servidores ? Posso usar o Central Management Server do SSMS ? Com certeza …. MAS POWERSHELL ROCKS !!!!!! (gostei de ficar falando isso né..esquenta não..tem dia que não tomo meu remédio ..UHAAA.UHAAA (risada macabra) !!!!) 1 - Se eu tenho uma senha somente para todos os servidores. Crie um .txt com o nome de todos os servidores e, por exemplo, coloque na pasta C:\PS\Servers.txt.
2 -
E mais um script ao som de : “Every breath you takeEvery move you makeEvery bond you breakEvery step you takeI'll be watching you”
Every breath you take The PoliceOctober 25 SQL SERVER DAY !!!!!!.
“Theres a lady whos sure Stairway To HeavenLed ZeppelinFinalizando PPT de Powershell !!!! E com muito ROCK !!!!!!!!
6 da manhã…acordei inspirado !!!!!O dia promete !!! Testar 1 mol de scripts powershell pra hoje !!! 1 Mol ? ..HAHHAHHA…QUIMICA 1 mol é um número dinossauricamente grande !!!! 6,02 x 10 a 23Primeiro meu cérebro teve que pegar… Formula de Error Handling Cerebral !!!
Try { ACORDA_CARA !!!!!}-Catch {10_minutos_por_favor !!!!!!}-finally { JA_ERA_O_DIA PROMETE !!! }
Seleção Musical de Hoje !!! 80s,70s e METAL !!!!
Joan JettNenaOzzy OsborneACDCGunsLed ZeppelinYardbirsPeter FramptonGratefuldeadSister of MercyEchoRushIRONNNNNNNNNNNNNN
Começando com “Do you wanna touch me” Joan Jett….Pra dar um baculejo nas idéias !!!!
“Weve been here too long Do you wanna touch (yeah) ANOTHER DAY IN PARADISE FOLKS !!!!! Índice Cluster+identity = 100% fillfactor e sem Page Splits ?
Pessoal, vejo dizer bastante que para não gerar page splits, basta colocar o índice cluster num campo identity e pode deixar o fillfactor com 100%. Verdade ?…. NÃO !!!!!!!!!!. A resposta correta é…Depende dos tipos de colunas que terão sua tabela e principalmente se estas terão atualizações no tamanho do seu conteúdo. Page Splits ocorrem no update também !!!! Vamos lá ?
Criamos uma tabela com 50 linhas continuas (indentity, com CIX no campo ID). Teoricamente não teria de haver Page Splits. Será ?
PERFEITO NÃO VEJO “PAGE SPLIIIIIIIIIIIIIIITSSSSSSSSSSSSS” Vamos alterar o conteúdo dos campos ?
Vamos ver como ficou ? Bom..Uma civilização de Page Splits !!!! Certeza Laerte ?…Apesar do campo NextPageId já me mostrar isso, mas vamos ver…. Peguei a Página 7548..O próximo deveria ser a Página 7549
Errado !!!!! Segundo o NextPageID a Próxima Página é a 8174, que tá lá embaixo e nem aparece na imagem por não caber !!!
Agora sim!!!!!!!…. Ou seja da página 7548 pulou para a página 817 para continuar a ordem do CIX (clustered index)!!!! CONCLUSÃO …… LENDA !!!!!..
A colocação do identity no índice cluster e FILLFACTOR 100%:
Não é uma regra que se eu colocar o CIX num campo identity posso deixar meu fillfactor a 100% pois não terei Page Split. Vimos que em alguns casos o update também pode gerar Page Splits !!!! A Laerte, mas no exemplo tu preencheu os campos com o valor completo deles. Se por acaso você tiver 1 byte disponível na pagina e der um update pra 2 bytes..Já era..Page Split tio !!! (fillfactor 100%) Este registro passará inteiro para outra página e o espaço remanescente desta página será perdido!!!! E Tô ouvindo AC/DC “Jailbreak, let me out of here October 24 Alterando um valor fixo em Muitas Procedures !!!!
Pessoal, Teve uma pergunta bem legal no ask.sqlservercentral.com (diga-se que eu e o Felipe Ferreira estamos batendo ponto lá hahahaahah) que era assim : O cara precisava alterar um valor em mais de 300 procs, um valor fixo. Algo como Raiserror(876…) trocar por Raiserror(666…) E que são 8 da manhã e eu estou ouvindo um Iron - The number of the beast "Woe to you, Oh Earth and Sea, Mas voltando ao assunto, poderia ser feito com Powershell !!!!!!!!!!!!!!!!!!!!!!! Eu não costumo usar a maneira que vou mostrar, foi somente para resolver o problema. Estou usando como file system (NÃO PERCAM MINHA APRESENTAÇÃO), eu costumo usar a SMO.
4 LINHAAAAAAAAAAAAAAAAAAASSSSSSSSS !!!!!!!!!!!!!!!!!!(e isso porque AINDA não babo colorido em powershell, porque tem uns caras aí que fazem isso numa linha só)
SEUSERVIDOR = Nome do servidordefault = Nome da instância, se não tiver deixe defaultSEUDATABASE = Nome do seu bancoSEUPATH = Path que será gerado os .sql (scripts das procs)OLDVALUE = Valor AntigoNEWVALUE = Valor NovoEste script pega proc a proc, troca o create por alter e no OLDVALUE coloco o valor a procurar. No NEWVALUE o valor a ser colocado. Ai eu gero um .sql no caminho c:\SEUPATH de cada proc, somente para pegar uma amostra e verificar se está tudo ok. Estando tudo certinho :
Troque o NOMESEVIDOR pelo nome do seu servidor e o NOMEDATABASE pelo nome do seu database !!! Será alterado !!!!
“Six, six, six the number of the beast.
POWERSHELL ROCKS !!!!!! October 22 How to Became an Exceptional DBA using Powershell ?
Do you want to became an Exceptional DBA ? First, read this amazing FREE ebook from Brad McGehee How to Became an Exceptional DBA AND Powershell can help you too !!!
Soon…at simple-talk October 18 REGISTRO DO SQL SERVER DAY – LINKS OFICIAIS !!!!!!!
Galera, saiu os links oficiais do SQL SERVER DAY 2009
SITE OFICIAL COM OS LINKS
Foi dividido em 3 links para melhor organização e segue :
Community Webcast: SQL Server Day - Parte I 09:30 - 10:00 - Abertura do Evento Community Webcast: SQL Server Day - Parte II 14:00 - 15:00 - Compressão de Dados e Backup no Microsoft SQL Server 2008 - Pedro A. G. Junior Community Webcast: SQL Server Day - Parte III 19:00 - 20:00 - Disaster Recovery - Backup, Restore e Tópicos Avançados - Gustavo Maia Aguiar Agora só fazer o registro !!!!! Quem quiser ver tudo, faz o registro nos 3 links !!!!!
Abraços !!!! |
|
|