Ferramentas para Migração: Upgrade advisor

Migrar um ambiente de banco de dados, mesmo que seja um upgrade de versão não é fácil e muitas vezes temos diversos problemas por features descontinuadas, sintaxes alteradas e assim por diante.
E achar ferramentas que auxiliem essas migrações de forma eficaz é complicado.
Vou aproveitar que estou no meio de um projeto de atualização de versão de um ambiente inteiro (win. Server 2003 para 2008 e 2012  / SQL Server 2005 para 2012 ) para passar algumas ferramentas que podem auxiliar nas migrações.
Começando pela mais simples: o Upgrade Advisor!
O upgrade é uma ferramenta para auxiliar na migração de Banco de Dados ao qual o maior segredo é onde baixa-lo. Ele fica dentro do Feature Pack, e você pode encontar aqui para o 2008 e aqui para o 2012 – nesta página, encontre o tópico que fala apenas de upgrade advisor. Caso decida baixar o pacote todo, o upgrade fica na pasta: \X64\Redist\Upgrade Advisor. Existem também versões x86 e Itanium do Upgrade Advisor sob as pastas \X86 e \IA64, respectivamente.

Após instala-lo (instalação padrão. Não vou demonstrar para não alongar muito), abra o upgrade advisor. Ele da a tradicional tela de boas vindas da microsoft e explica um pouco do que será analisado.
O Upgrade realiza uma avaliação de diversos objetos, configurações, DLL, etc em seu ambiente e gera um report com essas informações.

Aponte para o servidor que deseja analisar.

upgrade_tela1

 

Sim, voce pode ter o upgradeinstalado em 1 servidor e analisar outro. Mas atenção, alguns recursos como o Reporting services só podem ser analisados se a ferramenta for local.

Selecionado os recursos, você deve agora escolher a instância  a ser analisada.

Reporting_tela2

Escolha os databases que passarão pela análise. Você pode optar por escolher um trace ou algum script.

Reporting_tela3

Como escolhi analisar também meu Integration services, passo pela tela de configuração para ele também. Você pode escolher analisar todos,  ou algum específico. E vale lembrar que para analisar os encriptados, a senha deve ser colocada nesta tela.

Reporting_tela4

Verifico as informações e inicio a análise. O tempo de duração da análise é variável. Terminando a análise, ele nos informa o que está ok e o que não está.

Upgrade_tela5

Ele gera um report , ao qual podemos ver direto por essa tela.

Upgrade_tela6

O Report indica os pontos criticos, de atenção. Aponta em que momento essa solução precisará ser aplicada e descreve cada ponto de atencao.

Report_tela7

Abrindo o link de objetos afetados, ele lista base e campo ou objeto referente ao erro detectado.
E na sessão de “diga mais sobre isso” temos o link para o Books Online onde descreve o erro e ainda encontramos exemplos de código (se for o caso) para corrigirmos.

E assim conseguimos mapear diversos pontos que devem ser ajustados para uma atualização. Esse tipo de report, ajuda muito a minimizar problemas pós migração, deixando tudo alinhado com a nova versão.

Para mais informações: Acesse o MSDN

 

É isso pessoal.
Espero ter ajudado =)
Até mais !

Anúncios

MSDTC: O que é e como configura-lo

O MSDTC para muitos é algo completamente desconhecido, e que só virá a tona quando um erro referindo a ele vier na sua aplicação, gerando desespero na nação!

Antes de dar continuidade, uma aula básica:
TODA ação de MANIPULAÇÃO de dados dentro do SQL Server, são feitas com Transações. Mesmo que não explícitas, o SQL Abre uma transação, e realiza o auto commit caso dê tudo certo na operação.

Então, o que raios tem esse MSDTC de tão importante?

O MSDTC é o responsável por coordenar transações de banco de dados, sistemas de arquivos, filas de mensagem, etc. Ele normalmente está presente em arquiteturas .NET . Ele foi introdusido a partir do Windows 2000 ~história~
Quando o DTC não está configurado corretamente, e uma operação via LinkedServer tenta ser realizada, ocorre o seguinte erro:

The operation could not be performed because OLE DB provider “SQLNCLI” for linked server “SQL-DB-02\13_MIN_DBA” was unable to begin a distributed transaction. OLE DB provider “SQLNCLI” for linked server “SQL-DB-02\13_MIN_DBA” returned message “The transaction manager has disabled its support for remote/network transactions.”.

Sendo assim, as ações da manipulação entre servidores tornam-se impossíveis.
Então, vamos pelo começo: Onde está o MSDTC?

 Para acessar o MSDTC e suas configurações:

MSDTC_Conf_01

Inciar / Ferramentas administrativas / Componentes e serviços

MSDTC_Conf_03

Expanda a árvore: Computadores / Meu computador / DTC / . Botão direito no Local DTC e abra as propriedades. 

A Configuração não é difícil nem demorada.

 MSDTC_Conf_04

Na aba de trancing, temos as opções (resumidamente)

output options

  • output e transactions: habilite ambas para habilitar o rastreamento
  • All Transactions: Rastreia todas as transações. Pode impactar em seu ambiente.
  •  Aborted Transactions: Rastreia as transações abortadas.
  • Long-Lived Transactions: Transações de longa duração, por padrão, limite de 1 minuto.

Logging Options:

São as opções para iniciar/parar/atualizar os tracers.
Você pode alterar o máximo de buffer de memória também, sendo que por padrão o máximo é 25.

MSDTC_Conf_05

 Na aba Log Information, configure o local de armazenamento do arquivo de Log do DTC, e qual seu tamanho máximo (em MB).

MSDTC_Conf_06Na aba de segurança, temos as configurações que permitem as transações de rede.

Security settingts:

  •  Network DTC Access : permite o trafego via DTC. Sem essa opção, as transações via servidores ficarão indisponíveis.

– Remote Clients : Permite o DTC controlar acesso aos clientes remotos.
– Remote Administration: Permite a administração remota do DTC

  • Transaction Manager Communication

– Allow Inbound: Para permitir que um computador remoto, execute ações no servidor local. Necessária para servidores que hospedam o SQL Server, por exemplo, para permitir transações via linkedserver.
– Allow Outbound: Para permitir que sejam enviados comandos de transação para outros servidores.

Com essas opções habilitadas, é necessário escolher o modo de autenticação.

-Mutual Authentication Required: realiza a comunicação criptografada, e autenticação mútua (por um domínio).
– Incoming Caller Authentication Required: Caso a autenticação não possa ser mútua, mas quem envia o comando esteja autenticado.
-No Authentication Required: será uma transação não autenticada e não criptografada.

  • Enable XA Transactions: Permite transações no padrão XA. Padrão utilizado por SO diferentes.

DTC Logon Account:

  • Configure o usuário de serviço que irá executar o DTC. Normalmente usuário de Rede.

Concluindo as configurações, o DTC precisará de um restart para subir com as configurações corretas. Este restart é apenas no DTC.

Espero ter ajudado!
Até mais =)

Coletando Queries Lentas via SQL Profiler

Identificar query lenta é um ponto muito importante para mapearmos nosso ambiente, entender o comportamento e melhorar a performance de aplicações e do próprio ambiente de banco de dados.
Hoje vamos falar de um dos vários modos que existem para coletar query lentas: um profiler no SQL Server.
Vale lembrar que, o que pode ser lenta para um ambiente, pode não ser lenta para outros. Tudo depende de como o seu ambiente é utilizado e o quanto você gostaria que ele fosse otimizado.
E vale lembrar também que o profiler pode judiar da performance do servidor, então utilize com consciência!

Vamos ao que interessa!

Primeiro, abra o profiler do sql server.

image

Em seguida, abra um novo profile, e conecte-se ao servidor ao qual deseja realizar a coleta

image

Vamos começar a configurar! Atenção a alguns detalhes importantes: de um nome a seu profiler,  e eu recomendo que salve os resultados da coleta em uma tabela, para que possa consultar os dados posteriormente.
image

Ao solicitar para salvar em uma nova tabela, ele irá pedir uma nova conexão a um servidor, para que possa criar uma tabela e salvar os registros. Conecte-se a o ambiente que desejar (pode ser o mesmo ao qual quer realizar a coleta) e configure as informações de: database, schema e nome da tabela que será criada.
image

Vamos para a aba  ‘event information’ para realizar as configurações de coleta.
Esta aba é completamente personalizavel e permite que se defina diversos parâmetros para sua coleta ou qualquer outra função que esteja utilizando no profiler.
Para pegar os campos que queremos , selecionei os campos de ‘show all events’ e ‘show all columns’, abrindo assim todas as possibilidades de configuração.
image

Como farei apenas uma coleta basica, deixei apenas alguns eventos e campos selecionados. Para esse tipo de coleta, acredito que login, database name, hostname, aplication name, text e duration são fundamentais. Os demais depende da necessidade. Em seguida, já iremos configurar alguns filtros para a coleta.

image

Você irá observar que o campo de aplication name já está com um filtro configurado. É um filtro do nome do SQL Profiler, adicionado automaticamente para que o profiler que está sendo criado não fique aparecendo, juntando uma informação inútil à sua coleta.
Nesse caso adicionei um filtro apenas no campo ‘duration’ que é o campo que irá coletar as consultas de acordo com o tempo que estimarmos.
Vale lembrar que o duration é um campo em milissegundos, então atenção ao configurar este campo!

image

Todos os campos podem ser personalizados, de acordo com suas características e vocês podem implementsr filtros de acordo com a necessidade.
Após adicionar os filtros, hora de colocar nosso profiler para funcionar. No exemplo, executei uma query mais pesada para passar e 5 segundos e apsrecer no tracert. Ela me passa todas as informações que preciso para identificar e a partir dai realizar tunning em suas consultas.

image

Lembra no início do tutorial, onde pedimos para salvar o profiler em uma tabela? Pois bem, uma vez que a coleta seja concluída, pare o profiler e feche (por que ele também pode refletir na lentidão de um ambiente) mas os dados coletados estão a salvo na tabela, e uma simples consulta na tabela criada, e lá estao as informações que precisamos.
image

A partir dai, utiliza seus conhecimentos de tunning (e algumas dicas que passamos aqui) e deixe seu ambiente cada vez melhor!

Espero ter ajudado =)
Até mais!

Manutenção no distribution

Muitas vezes temos tantos problemas na administração dos bancos que utilizamos em aplicações que esquecemos os databases e sistema, fundamentais para o funcionamento de nossos servidores.
Eles são pequenos e não ficam gritando na sua frente, mas as vezes podemos ter problemas que envolvem o uso destes dbs e é fundamental para um dba conhecer cada detalhe e saber utiliza-los. São muitos os problemas que podemos ter, aos poucos vamos relatando alguns por aqui.

Recentemente, analisando alguns servidores, encontramos um comportamento anormal do database distribution. Seu tamanho estava em aproximadamente 90Gb.

Realizando uma análise nas tabelas e tamanhos (utilizando a proc que ensinamos aqui) encontramos a tabela “MSrepl_commands”. Pesquisas e mais pesquisas e descobrimos que essa tabela funciona como um log das replicações.
Ela armazena os comandos executados das replicações, armazenando um historico, que mais cedo ou mais tarde você terá problemas com ela.
Descobrimos então um modo de realizar esta limpeza garantindo o funcionamento das replicações, mas sem ter problemas.
Primeiramente verifique se a rotina ‘Distribution clean up: distribution” existe em sua intância.

Este job é o ressponsável pela limpeza e manutenção destas tabelas.
Caso o job não exista, experimente executar o comando:

EXEC dbo.sp_MSdistribution_cleanup @min_distretention = 0 , @max_distretention = 72

Go

 

Onde @max_distretention é o tempo máximo de tempo que os registros serão retidos pelo database. Esse número é representado em horas. (72 é um número padrão).
Caso sua tabela já esteja muito grande, este comando devera ser executado diversas vezes, baixando aos poucos o log, caso contrario você terá grandes problemas de performance. Deixe em tempo bem maior e va diminuindo aos poucos (ou seja, as 72h, podem ser valores maiores para diminuir aos poucos)

Recomendo adicionar esta execução em um job, e programa-lo para executar de acordo com sua necessidade. Assim você cria uma manutenção contante no seu database, o que te poupa de ter uma solução temporária, e passa a ter uma manutenção preventiva.

Espero ter ajudado =)
Até mais!

Rápidinha: usar (nolock) ou with (nolock) ?

Muita gente já me perguntou: da na mesma usar somente o (nolock) ou o with (nolock) né?
Pois bem, como sou formada pelo 2008, o correto é o uso do ‘with’. Mas já vi muito uso do (nolock) sozinho.

Então a resposta é, sim, tanto faz. Se você usar SQL 2000 ou anterior.
E não, não é a mesma coisa se usar o 2005 ou posterior.

O SQL aceitava e fazia funcionar o nolock sem o uso do with.
No 2005 ele aceita, mas não funciona. Ele gera lock ainda sim.

Então pessoal, vale a pena ficar ligeiro. Adotem o uso do with e garanta a performance das suas consultas usando o with (nolock)

Espero ter ajudado.
Até mais =)

Coletando tamanho de tabelas de um database – SQL Server

Pessoal, há algum tempo recebi um pedido de ajuda para realizarem uma coleta de informações do tamanho de tableas de um database.
Como sabem no SQL conseguimos executar um SP_DATABASES e conseguimos informações do tamanho de um database mas esse tipo de informação detalhada referente a tabelas não temos em uma proc de sistema.

Sabendo disso, encontramos uma procedure que faz esse trabalho, e ao executa-la saberemos o tamanho de cada tabela. Segue a proc:

create proc dba_sp_espacotabela
as

declare @vname sysname

declare @tmpTamTabela table (
name sysname null
, rows int null
, reserved varchar(25) null
, data varchar(25) null
, index_size varchar(25) null
, unused varchar(25) null
)

declare cp1 cursorlocalfast_forwardread_onlyfor
select name
from sysobjects
where type = ‘U’
order by name

open cp1

while 1 = 1

begin
fetchnextfrom cp1 into @vname
if @@fetch_status <> 0 
break

insertinto @tmpTamTabela (name, rows, reserved
, data, index_size, unused )
exec sp_spaceused @vname

end

close cp1
deallocate cp1

select name as ‘Nome’
rows as ‘Linhas’
convert (int,replace (reserved,‘ KB’,) ) as ‘Tamanho total’
convert (int,replace (data,‘ KB’,) ) as ‘Dados’
convert (int,replace (index_size,‘ KB’,) ) as ‘Index’
convert (int,replace (unused,‘ KB’,) ) as ‘Não utilizado’
from @tmpTamTabela
order by convert (intreplace (reserved,‘ KB’,) ) desc
go

See you amiguinhos.

Migrando Logins – SQL Server

Quando o assunto é ‘migração’, muitas possibilidades, mudanças e acima de tudo, problemas, surgem na cabeça de um DBA. Montar um banco do zero não é nada comparado ao processo de migrar um banco em funcionamento, com diversos processos executando e aplicações apontando.

Um dos grandes problemas que encontramos no SQL Server é justamente a migração de logins/senhas de usuários. E nesses problemas e dores de cabeça, encontramos a solução, vindo direto da microsoft, extremamente funcional!

Trata-se de uma procedure, que faz o link entre usuário e login, e caso o login não exista, ele trata de cria-lo, já com o hash que existia antes. Assim, ao migrar um database de servidor, ou criar um ambiente de testes, você não terá problemas em migrar os users. Segue a proc abaixo!

USE master
GO
IF OBJECT_ID (‘sp_hexadecimal’) IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = ‘0x’
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = ‘0123456789ABCDEF’
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint – (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GOIF OBJECT_ID (‘sp_help_revlogin’) IS NOT NULL
DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL
AS
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary  varbinary (256)
DECLARE @PWD_string  varchar (514)
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr  varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)
DECLARE @defaultdb sysnameIF (@login_name IS NULL)
DECLARE login_curs CURSOR FORSELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
sys.server_principalsLEFT JOIN sys.syslogins l
ON ( l.name = p.name ) WHERE p.type IN ( ‘S’, ‘G’, ‘U’ ) AND p.name <> ‘sa’
ELSE

DECLARE login_curs CURSOR FOR

SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principalsLEFT JOIN sys.syslogins l
ON ( l.name = p.name ) WHERE p.type IN ( ‘S’, ‘G’, ‘U’ ) AND p.name = @login_name
OPEN login_curs

FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
  PRINT ‘No login(s) found.’
CLOSE login_curs
DEALLOCATE login_curs
RETURN -1
END
SET @tmpstr = ‘/* sp_help_revlogin script ‘
PRINT @tmpstr
SET @tmpstr = ‘** Generated ‘ + CONVERT (varchar, GETDATE()) + ‘ on ‘ + @@SERVERNAME + ‘ */’
PRINT @tmpstr
PRINT
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT
SET @tmpstr = ‘– Login: ‘ + @name
PRINT @tmpstr
IF (@type IN ( ‘G’, ‘U’))
BEGIN — NT authenticated account/group

SET @tmpstr = ‘CREATE LOGIN ‘ + QUOTENAME( @name ) + ‘ FROM WINDOWS WITH DEFAULT_DATABASE = [‘ + @defaultdb + ‘]’
END
ELSE BEGIN — SQL Server authentication
— obtain password and sid
SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, ‘PasswordHash’ ) AS varbinary (256) )
EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT

— obtain password policy state
SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN ‘ON’ WHEN 0 THEN ‘OFF’ ELSE NULL END FROM sys.sql_logins WHERE name = @name
SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN ‘ON’ WHEN 0 THEN ‘OFF’ ELSE NULL END FROM sys.sql_logins WHERE name = @name

SET @tmpstr = ‘CREATE LOGIN ‘ + QUOTENAME( @name ) + ‘ WITH PASSWORD = ‘ + @PWD_string + ‘ HASHED, SID = ‘ + @SID_string + ‘, DEFAULT_DATABASE = [‘ + @defaultdb + ‘]’

IF ( @is_policy_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ‘, CHECK_POLICY = ‘ + @is_policy_checked
END
IF ( @is_expiration_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ‘, CHECK_EXPIRATION = ‘ + @is_expiration_checked
END
END
IF (@denylogin = 1)
BEGIN — login is denied a ccess
SET @tmpstr = @tmpstr + ‘; DENY CONNECT SQL TO ‘ + QUOTENAME( @name )
END
ELSE IF (@hasaccess = 0)
BEGIN  — login exists but does not have access
SET @tmpstr = @tmpstr + ‘; REVOKE CONNECT SQL TO ‘ + QUOTENAME( @name )
END
IF (@is_disabled = 1)
BEGIN — login is disabled
SET @tmpstr = @tmpstr + ‘; ALTER LOGIN ‘ + QUOTENAME( @name ) + ‘ DISABLE’
END
PRINT @tmpstr
END

FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO

—- EXECUTAR —-
EXEC sp_help_revlogin
Espero ter ajudado!
Até mais pessoal =)