Webcast da comunidade MCITPSC

Olá Pessoal,

Na segunda-feira, dia 06/02, apresentei um webcast da comunidade MCITPSC, comunidade SQL Server de Santa Catarina. O evento foi organizado pelo Marcos Freccia ( twitter | blog ) e contou com as participações de Luciano Moreira, o Luti, Thiago Zavaschi, Viviane Ribeiro, e outros nomes da comunidade brasileira de SQL Server.

Estou disponibilizando aqui para vocês a minha apresentação, os scripts e bancos de dados corrompidos utilizados no meu webcast.

Apresentação: https://skydrive.live.com/view.aspx?cid=C30F9D171FC90421&resid=C30F9D171FC90421!245

Scripts: https://skydrive.live.com/embed?cid=C30F9D171FC90421&resid=C30F9D171FC90421%21244&authkey=AGMOpU-yj8lNo2s

Databases: https://skydrive.live.com/embed?cid=C30F9D171FC90421&resid=C30F9D171FC90421!246&authkey=AJK3oGUp5vI1R9o

Bons estudos!

[]’s
Erickson Ricci

Anúncios

Conhecendo a ferramenta Relog

Olá Pessoal,

No embalo do post anterior, onde falei da ferramenta Logman, vou aproveitar para falar também de outra ferramenta que podemos trabalhar em conjunto com a Logman que é a Relog. Com esta ferramenta você pode manipular os arquivos coletados com o Logman, gerando novos arquivos com períodos diferentes de coleta, unir vários arquivos em um só ou “quebrar” um grande arquivo em vários menores e por ai vai. Vamos ver como fazer isso.

A sintaxe completa com as descrições dos parâmetros do comando Relog segue abaixo:

Microsoft r Relog.exe (6.1.7601.17514)

Relog creates new performance logs from data in existing performance logs by
changing the sampling rate and/or converting the file format. Supports all
performance log formats, including Windows NT 4.0 compressed logs.

Usage:
relog <filename [filename …]> [options]

Parameters:
  <filename [filename …]>     Performance file to relog.

Options:
  -?                            Displays context sensitive help.
  -a                            Append output to the existing binary file.
  -c <path [path …]>          Counters to filter from the input log.
  -cf <filename>                File listing performance counters to filter
                                from the input log. Default is all counters
                                in the original log file.
  -f <CSV|TSV|BIN|SQL>          Output file format.
  -t <value>                    Only write every nth record into the output
                                file. Default is to write every record.
  -o                            Output file path or SQL database.
  -b <dd/MM/yyyy HH:mm:ss>      Begin time for the first record to write
                                into the output file.
  -e <dd/MM/yyyy HH:mm:ss>      End time for the last record to write into
                                the output file.
  -config <filename>            Settings file containing command options.
  -q                            List performance counters in the input file.
  -y                            Answer yes to all questions without prompting.

Na rotina de monitoramento que estou criando, eu quero carregas os dados coletados para dentro do SQL Server, e para isso vou utilizar a seguinte sintaxe:

relog “c:\PerfLogs\MyDataCollector_000001.blg” -f SQL -o SQL:DSN_SQL!SRVPROD

Com esta instrução estou informando que desejo que a saída do meu arquivo seja o SQL Server. Para me conectar a uma instância específica, temos antes de criar uma DSN no servidor que estamos trabalhando. No meu exemplo, minha DSN é a DSN_SQL e o servidor que estou trabalhando é o SRVPROD. Com isso, faremos a carga dos dados coletados no arquivo MyDataCollector_000001.blg para o SQL Server.

Quando os dados são carregados para o SQL Server são criadas 3 tabelas no banco de dados que você especificou para conexão na DSN. As tabelas são:

  • dbo.DisplayToID
  • dbo.CounterData
  • dbo.CounterDetails

A tabela DisplayToID possui informações da coleta como um todo como por exemplo servidor que foram coletadas as informações e início e fim da coleta. Já a tabela CounterDetails possui informações de cada contador utilizado na coleta como nome do objeto, nome do contador, instância do contador e assim por diante. Por fim, a tabela CounterData possui os dados efetivamente da coleta.

Com as informações destas três tabelas você consegue responder quando a coleta foi realizada, quais contadores, com detalhes, foram utilizados e quais os valores coletados. A cada coleta realizada é gerado um novo registro na tabela DisplayToID, com um novo código sequencial. Se novos contadores forem utilizados, estes são adicionados à tabela de detalhes, caso contrário, somente os dados de coleta são adicionados na tabela de dados.

Acho que por enquanto é isso. Boas coletas!

 

[]’s

Erickson Ricci

Conhecendo a ferramenta Logman

Olá pessoal,

Vocês sabiam que através da ferramenta logman nós podemos criar coletas de dados do Performance Monitor, mais conhecido como Perfmon?!

Com o logman nós podemos criar as coletas, iniciar e parar a coleta de dados e apagar a coleta criada. Como se trata de um comando de prompt, há diversos parâmetros que podem ser informados para se configurar o comando e gerar a coleta. A sintaxe completa do comando, extraída de um help do comando nós vemos abaixo:

Microsoft r Logman.exe (5.2.3790.3959)
c Microsoft Corporation. All rights reserved.

Logman manages the “Performance Logs and Alerts” service for creating and
managing Event Trace Session logs and Performance logs.

Usage:
logman VERB <collection_name> [options]

Verbs:
  create <counter|trace>        Create a new collection.
  start                         Start an existing collection and set the
                                begin time to manual.
  stop                          Stop an existing collection and set the end
                                time to manual.
  delete                        Delete an existing collection.
  query [collection_name|providers]  Query collection properties. If no
                                collection_name is given all collections are
                                listed. The keyword ‘providers’ will list
                                all of the registered Event Trace providers.
  update                        Update an existing collection properties.

Parameters:
  <collection_name>             Name of the collection.

Options:
  -?                            Displays context sensitive help.

  -s <computer>                 Perform the command on specified remote
                                system.

  -config <filename>            Settings file containing command options.

  -b <M/d/yyyy h:mm:ss[AM|PM]>  Begin the collection at specified time.

  -e <M/d/yyyy h:mm:ss[AM|PM]>  End the collection at specified time.

  -m <[start] [stop]>           Change to manual start or stop rather than a
                                scheduled begin or end time.

  -[-]r                         Repeat the collection daily at the specified
                                begin and end times.

  -o <path|dsn!log>             Path of the output log file or the DSN and
                                log set name in a SQL database.

  -f <bin|bincirc|csv|tsv|sql>  Specifies the log format for the collection.

  -[-]a                         Append to an existing log file.

  -[-]v [nnnnnn|mmddhhmm]       Attach file versioning information to the
                                end of the log name.

  -[-]rc <filename>             Run the command specified each time the log
                                is closed.

  -[-]max <value>               Maximum log file size in MB or number of
                                records for SQL logs.

  -[-]cnf [[[hh:]mm:]ss]        Create a new file when the specified time
                                has elapsed or when the max size is exceeded.

  -c <path [path …]>          Performance counters to collect.

  -cf <filename>                File listing performance counters to
                                collect, one per line.

  -si <[[hh:]mm:]ss>            Sample interval for performance counter
                                collections.

  -ln <logger_name>             Logger name for Event Trace Sessions.

  -[-]rt                        Run the Event Trace Session in real-time mode.

  -p <provider [flags [level]]> A single Event Trace provider to enable.

  -pf <filename>                File listing multiple Event Trace providers
                                to enable.

  -[-]ul                        Run the Event Trace Session in user mode.

  -bs <value>                   Event Trace Session buffer size in kb.

  -ft <[[hh:]mm:]ss>            Event Trace Session flush timer.

  -nb <min max>                 Number of Event Trace Session buffers.

  -fd                           Flushes all the active buffers of an
                                existing Event Trace Session to disk.

  -[-]u [user [password]]       User to Run As. Entering a * for the
                                password produces a prompt for the password.
                                The password is not displayed when you type
                                it at the password prompt.

  -rf <[[hh:]mm:]ss>            Run the collection for specified period of
                                time.

  -y                            Answer yes to all questions without prompting.

  -ets                          Send commands to Event Trace Sessions
                                directly without saving or scheduling.

  -mode <trace_mode [trace_mode …]>   Event Trace Session logger mode.

  -ct <perf|system|cycle>       Event Trace Session clock type.

Note:
  Where [-] is listed, an extra – negates the option.
  For example –r turns off the -r option.

Abaixo, vamos ver alguns exemplos simples de utilização deste comando.

Criando uma coleta de dados:

logman create counter MyDataCollector -s %computername% -cf “c:\counters_filtered.txt”

No exemplo acima, está sendo criada uma coleta chamada MyDataCollector, para o servidor local (parâmetro –s %computername% ) e utilizando um arquivo que contêm os contadores que desejo coletar. (parâmetro –cf “c:\counters_filtered.txt” ).

O arquivo com contadores nada mais é do que um arquivo texto com os contadores que vão ser coletados, um por linha. Abaixo, alguns contadores de exemplo:

\PhysicalDisk(*)\Avg. Disk sec/Read
\PhysicalDisk(*)\Avg. Disk sec/Write
\PhysicalDisk(*)\Current Disk Queue Length
\PhysicalDisk(*)\Disk Transfers/sec
\Processor(*)\% Privileged Time
\Processor(*)\% Processor Time
\Processor(*)\% User Time

Para iniciar a coleta, faremos desta forma:

logman MyDataCollector start

Se quisermos encerrar a coleta, basta substituir a palavra start por stop. Simples assim. =D

Caso queira apagar a coleta da máquina, faça:

logman delete MyDataCollector

Os exemplos são bem simples, admito. É só para ir se acostumando mesmo com a ferramenta! Winking smile

Com o logman você consegue controlar também o tempo de intervalo de cada coleta, intervalos de data para coleta, formato do arquivo de log, etc.

Mas se eu posso fazer isso tudo através do Performance Monitor, qual a vantagem de se utilizar o logman?

Resposta: imagine um cenário onde você quer automatizar a coleta de dados de diversos servidores, pretende armazenar estes dados dentro do SQL Server para uma análise mais detalhada, e para sua solução completa você vai utilizar jobs para disparar a criação e execução das coletas e para controlar o schedule das execuções. Hummm … está fazendo mais sentido agora?!

Este é um cenário que estou trabalhando aqui na empresa para o nosso cliente. Em breve, pretendo colocar mais informações sobre a rotina completa de coleta destes dados.

Boa coleta de dados a todos!

 

Abraços,

Erickson Ricci

[SQL Code] Mapeando tabelas e seus respectivos Filegroups

Olá pessoal,

Aqui na empresa nós temos um controle manual de todo o crescimento dos bancos de dados e seus arquivos, processo que chamamos de Volumetria. O tamanho máximo de cada banco de dados é controlado manualmente, ou seja, não deixamos habilitada a propriedade AUTOGROW dos bancos de dados.

Nosso cliente pediu para expandir o tamanho de um banco de dados que possui 4 Filegroups e para isso perguntamos quais tabelas iriam crescer para expandir os arquivos correspondentes ao Filegroup com a(s) tabela(s) que iriam crescer. A resposta do cliente foi: Quê?! Hã!?! ou poderia ser ainda um tremendo WTF!!!!???!?

Em resumo, os analistas da aplicação não sabiam dizer onde cada tabela estava localizada então, vamos ao nosso script.

Uma maneira bem simplista de verificar em que Filegroup uma tabela está localizada é executando a procedure sp_help, assim:

USE <seu database>
EXEC sp_help <sua tabela>

O único problema de se fazer isto é quando se tem 317 tabelas para verificar! Logo, é hora de fazer um script para isto. =D

Depois de pesquisar as System Views do SQL Server, cheguei neste resultado:

SELECT
    T.NAME AS TABLE_NAME,
    P.ROWS,
    FG.NAME AS FILEGROUP_NAME,
    FG.IS_DEFAULT
FROM
    SYS.PARTITIONS P
    JOIN SYS.TABLES T
        ON P.OBJECT_ID = T.OBJECT_ID
    JOIN SYS.ALLOCATION_UNITS AU
        ON AU.CONTAINER_ID = P.PARTITION_ID
    JOIN SYS.FILEGROUPS FG
        ON AU.DATA_SPACE_ID = FG.DATA_SPACE_ID        
WHERE
    P.INDEX_ID < 2
    AND T.NAME <> 'SYSDIAGRAMS'        
ORDER BY T.NAME

O resultado é o nome da tabela, quantidade de linhas, nome do Filegroup onde a tabela está alocada e se este Filegroup é ou não o default do banco de dados.

Curioso como sou, pensei, caramba, se a procedure sp_help retorna essa informação, de onde ela traz isso?!

EXEC sp_helptext sp_help

O trecho da procedure onde é retornada a informação do Filegroup é este:

EXEC sys.sp_objectfilegroup @objid

Fazendo um sp_helptext na procedure sys.dp_objectfilegroup chegamos finalmente à consulta realizada pelo SQL Server:

    if exists (select * from sysobjects
            where id = @objid
            and type in ('S ','U '))
        begin
            select Data_located_on_filegroup = d.name
            from sys.data_spaces d
            where d.data_space_id =
            (select i.data_space_id from sys.indexes i
             where i.object_id = @objid and i.index_id < 2)
        end

Um pouco diferente da que fiz “na unha”, deu menos voltas e chegou no mesmo resultado… Live and Learn!!!

Abraços,
Erickson