O blog em números em 2012!

Esse ano foi o primeiro que eu “bloguei” regularmente.

Fiquei muito satisfeito por ter conseguido compartilhar por aqui pelo menos em parte o que vivenciei durante o ano e algumas coisas que eu já conhecia.

Como sempre há uma coisa ou outra para corrigir ou melhorar, mas acredito que o resultado foi muito bom e pelos números de acesso acho que o conteúdo tem sido útil para algumas pessoas!

Foram mais de 10.000 acessos e visitas de 100 países além do Brasil!

Agora é esperar 2013 e preparar muito mais conteúdo para compartilhar por aqui!

Visitas no blog

Visitas no blog

Publicado em Virtual PASS BR | 2 Comentários

Cost Threshold for Parallelism – Como configurar?

Entre profissionais que trabalham com SQL Server muito se conversa sobre paralelismo e sobre os seus benefícios e malefícios (quando mal utilizado!).

Existem diversas formas de lidar com ele, mas muitas vezes a conversa se resume a configurar o Max Degree of Parallelism (MAXDOP) da instância ou a nível de comando T-SQL através de hints.

A questão é que existem outras formas de lidar com o paralelismo e hoje vou escrever sobre uma configuração a nível de instância que muitas vezes é esquecida, mas que tem uma grande influência sobre ele.

A configuração em questão é a opção “Cost threshold for parallelism” (CTP) que você pode configurar tanto pela GUI como através de T-SQL.

Pela GUI basta acessar as propriedades de servidor, ir na guia advanced e alterar o valor, que por padrão é 5, dentro da sessão “Parallelism”

Cost Threshold for Parallelism

Cost Threshold for Parallelism

Já através de T-SQL basta utilizar o comando abaixo, onde estou alterando o valor para 10:

EXEC sys.sp_configure N’show advanced options’, N’1′ RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’cost threshold for parallelism’, N’10′
GO
RECONFIGURE WITH OVERRIDE
GO

Nesse ponto você deve estar se perguntando o que é na verdade esse CTP e qual valor deve utilizar nessa configuração.

Bem, para falarmos de CTP precisamos antes entender alguns conceitos relacionados ao Query Optimizer do SQL Server.

De uma forma BEM RESUMIDA o SQL Server utiliza um modelo baseado no “custo” de cada consulta para definir se a mesma deve ser executada ou não utilizando paralelismo, ou seja, múltiplas threads.

Obviamente isso depende de como está configurado o Max Degree of Parallelism da instância e outros fatores. Para quem quiser maiores detalhes sobre o tema, indico o blog do Fabiano que é especialista no assunto.

Então, caso a sua consulta tenha custo estimado superior ao valor indicado na opção de CTP de sua instância a mesma terá um plano de execução utilizando paralelismo gerado, caso contrário haverá apenas um plano serial.

Ai vem a questão, será que todas as consultas com custo maior que 5 devem realmente executar em paralelo? Será que o valor 5, que é default já há alguns anos no SQL Server, é o valor ideal para utilizarmos? E afinal, devo ter consultas utilizando paralelismo em meu ambiente OLTP?

Não há resposta ideal para nenhuma dessas perguntas, mas podemos aqui iniciar um raciocínio que deve ser adaptado para cada ambiente!

Há uma linha (mais radical na minha opinião) que defende que em ambientes OLTP deve-se evitar paralelismo, pois o mesmo seria voltado a consultas pesadas, normais de ambientes OLAP. Eu sou contra esse raciocínio, pois ele se baseia na ideia, bem antiga, de que o uso de múltiplos núcleos de CPU para uma consulta OLTP é um luxo/desperdício.

Ora, se temos muitas CPUs hoje em dia e as consultas em ambientes OLTP são muito mais “pesadas”, por que não se beneficiar do paralelismo e executar as consultas de forma mais rápida?

Obviamente, devemos monitorar o paralelismo para que não se torne um mal no servidor e permita situações onde uma consulta utiliza todos os núcleos e outras fiquem esperando por CPU, é a velha regra do “nem 8 nem 80″. Ou seja, monitore os waits por CXPACKET e tenha calma antes de assumir que, se 80% dos seus waits são desse tipo você tem um “problema” com o paralelismo.

Já há outra linha de raciocínio que defende que devemos utilizar o paralelismo ao máximo, mas para as consultas que realmente precisam de tal recurso. O problema aqui é, como defino quais consultas precisam realmente de paralelismo?

Aqui não há resposta pronta, vai muito do quanto o DBA conhece seu ambiente e de uma análise do plan cache verificando as consultas que estão executando com paralelismo com as configurações atuais.

Seguindo essa linha de raciocínio uma boa ideia seria analisar o plan cache, ver o padrão das consultas que executam em seu servidor e a partir dai definir um valor de CTP que faça com que consultas relativamente simples não executem com paralelismo, mas sem evitar que consultas mais pesadas possam usufruir de tal recurso.

Aqui um ponto de grande importância é a quantidade de vezes que a consulta é executada dentro de um determinado período de tempo. Não adianta impedir que consultas leves que executam uma vez por mês deixem de executar com paralelismo e ao mesmo tempo impedir que uma consulta pesada que é executada várias vezes também deixe de utilizar tal recurso.

Sendo assim um bom padrão seria elevar o valor do CTP, talvez gradativamente, a um valor que, no seu ambiente, atenda a essas características citadas acima de permitir paralelismo para as consultas mais “pesadas”.

Uma ótima forma de iniciar sua análise seria utilizar o script abaixo, retirado desse ótimo artigo do Jonathan Kehayias. Ele exibe as consultas do plan cache do seu servidor que executaram com paralelismo, o custo da consulta e o número de execuções, entre outras informações.

Vale lembrar que antes de definir um novo valor para o CTP, uma boa opção é analisar os planos de execução das consultas e fazer as devidas otimizações, como criação de índices, por exemplo.

Segue o script:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

WITH XMLNAMESPACES
(DEFAULT ‘http://schemas.microsoft.com/sqlserver/2004/07/showplan’)
SELECT
query_plan AS CompleteQueryPlan,
n.value(‘(@StatementText)[1]‘, ‘VARCHAR(4000)’) AS StatementText,
n.value(‘(@StatementOptmLevel)[1]‘, ‘VARCHAR(25)’) AS StatementOptimizationLevel,
n.value(‘(@StatementSubTreeCost)[1]‘, ‘VARCHAR(128)’) AS StatementSubTreeCost,
n.query(‘.’) AS ParallelSubTreeXML,
ecp.usecounts,
ecp.size_in_bytes
FROM sys.dm_exec_cached_plans AS ecp
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS eqp
CROSS APPLY query_plan.nodes(‘/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple’) AS qn(n)
WHERE n.query(‘.’).exist(‘//RelOp[@PhysicalOp="Parallelism"]‘) = 1

E você, como costuma lidar com essa configuração em seu servidor? Deixe um comentário!

Referências:

Publicado em Artigos, Virtual PASS BR | Deixe um comentário

Recovering data from expired tape on DPM 2012

System Center Data Protection Manager (DPM) allows you to configure a retention period when doing tape backups.

This is the date until when this tape will be considered “valid” and won’t be overwritten.

After this date you won’t be able to recover backups from this tape* and in the case this tape is put in a drive from the tape library it may be overwritten.

*it is possible to recover data from this tape using this procedure, but those backups will be recognized as being from an external source and procedures in DPM’s GUI may not work.

The problem is when you make a backup with the wrong retention period or, for some reason, you want to change the expiration date from a tape. You will notice there is no way to do this using DPM’s GUI.

Even worse, you may have an important tape that is expired and you need to recover data from one of its backup but it won’t be available.

After doing a lot of research on the web, joining pieces of information and code from here and there I have managed to write a script that updates the needed fields about an expired tape on DPM’s database, making it available again!

I must remember that this procedure IS NOT SUPPORTED by Microsoft and you should do this by your own risk, since it may cause unexpected impacts on your DPM server.

You should only do this procedure if you are absolutely sure about what you are doing and its possible impacts!

Here is the script with a few explanations:

USE DPMDB

GO

UPDATE tbl_MM_ArchiveMedia
SET
DatasetsState = 2,
IsOmidChangeNeeded = 0
FROM dbo.tbl_MM_Media AS Media
INNER JOIN dbo.tbl_MM_ArchiveMedia AS ArchiveMedia ON ArchiveMedia.MediaId = Media.MediaId
WHERE Media.Label = ‘Your_Tape_Label’
UPDATE tbl_MM_PhysicalDataset
SET
LifeStatus = 1,
ExpiryDate = dateadd(yy,1,Dataset.ExpiryDate)
FROM dbo.tbl_MM_Media AS Media INNER JOIN
dbo.tbl_MM_ArchiveMedia AS ArchiveMedia ON ArchiveMedia.MediaId = Media.MediaId
INNER JOIN dbo.tbl_MM_MediaMap AS MediaMap ON MediaMap.MediaId = ArchiveMedia.MediaId
INNER JOIN dbo.tbl_MM_PhysicalDataset AS Dataset ON Dataset.DatasetId = MediaMap.DatasetId
WHERE Media.Label = ‘Your_Tape_Label’

Explanations about table’s fields:

–tbl_MM_ArchiveMedia

  • DatasetsState: 2 = not expired/reclaimed, 3 = expired
  • IsOmidChangeNeeded: 0 = NO / 1 = YES

–tbl_MM_PhysicalDataset

  • LifeStatus: 1 = Created, 2 = Expired
  • ExpiryDate = Expiration Date

Source for this article:

I hope this script helps you all! In the case you have some suggestion or concern about this script please leave a comment!

Publicado em Artigos, backup, System Center | Deixe um comentário

Recuperando fita expirada no DPM 2012

No System Center Data Protection Manager (DPM) ao fazer um backup para fita definimos o seu tempo de retenção, que é a data até quando essa fita será considerado “válida” e até quando a fita não poderá ser reescrita.

Após essa data, os backups dessa fita não poderão mais ser recuperados* e caso a fita seja disponibilizada na tape library poderá ser sobrescrita.

*Você até pode recuperar os dados da fita através desse procedimento alternativo, mas os backups serão reconhecidos como sendo de fontes externas ao DPM e nenhum procedimento automático através dele irá funcionar.

O problema é que pode ocorrer a situação onde você fez um backup com uma data de expiração errada ou, por algum motivo, deseja alterar a data de expiração de alguma fita e não há modo de fazer isso pela GUI do DPM.

Pior ainda, você pode ter uma fita importante que está expirada e precisa recuperar seus dados armazenados na mesma, mas eles não estarão disponíveis.

Após muita pesquisa na internet, juntando informações de algumas fontes, consegui montar um script que altera informações no catálogo do DPM sobre a fita expirada, alterando sua data de expiração e tornando a mesma novamente disponível normalmente através da GUI do DPM.

Lembro que esse procedimento NÃO É SUPORTADO pela Microsoft e que deve ser executado por sua conta e risco, pois pode causar algum dano não conhecido a seu servidor DPM.

Só execute essa rotina se tiver certeza do que está fazendo e dos possíveis impactos!

Segue abaixo o script com algumas explicações:

USE DPMDB
GO

UPDATE tbl_MM_ArchiveMedia
SET
DatasetsState = 2,
IsOmidChangeNeeded = 0
FROM dbo.tbl_MM_Media AS Media
INNER JOIN dbo.tbl_MM_ArchiveMedia AS ArchiveMedia ON ArchiveMedia.MediaId = Media.MediaId
WHERE Media.Label = ‘Your_Tape_Label’
UPDATE tbl_MM_PhysicalDataset
SET
LifeStatus = 1,
ExpiryDate = dateadd(yy,1,Dataset.ExpiryDate)
FROM dbo.tbl_MM_Media AS Media INNER JOIN
dbo.tbl_MM_ArchiveMedia AS ArchiveMedia ON ArchiveMedia.MediaId = Media.MediaId
INNER JOIN dbo.tbl_MM_MediaMap AS MediaMap ON MediaMap.MediaId = ArchiveMedia.MediaId
INNER JOIN dbo.tbl_MM_PhysicalDataset AS Dataset ON Dataset.DatasetId = MediaMap.DatasetId
WHERE Media.Label = ‘Your_Tape_Label’

Explicações sobre os campos das tabelas:

–tbl_MM_ArchiveMedia

  • DatasetsState: 2 = not expired/reclaimed, 3 = expired
  • IsOmidChangeNeeded: 0 = NO / 1 = YES

–tbl_MM_PhysicalDataset

  • LifeStatus: 1 = Created, 2 = Expired
  • ExpiryDate = Expiration Date

 

Referência utilizada:

 

Espero que esse script ajude a vocês! Caso tenha alguma sugestão ou observação em relação ao script deixe um comentário!

Publicado em Artigos, backup, System Center, Virtual PASS BR | Deixe um comentário

DPM 2012 – Be careful with the free space on your log disk!

System Center Data Protection Manager 2012 certainly is a great tool to manage backups in a SQL Server environment, but recently I have seen a situation that needs some attention of those using it.

When you configure protection for a database DPM identifies the disk where the log file is placed and creates this folder/path:

DISK:\DPM_SQL_PROTECT\SERVER\INSTANCE\DATABASE_Log.ldf\Backup

This is not a problem, per se, but imagine a situation where there is an anormal amount of operations in your database and its log file gets quickly “filled”.

Now imagine that you have not managed this situation right after it happened, so for this time you can count only on your incremental (log) backups made by DPM, that allow the VLFs on your log file to be reused.

The problem in this situation is that when DPM makes its incremental (log) backups it generates a .log file on the path mentioned earlier on this article, and its size will be proportional to the amount of information in the log file.

So at the moment your log file has the biggest amount of information, maybe it is even auto-growing and using more space on your disk, you will need more space at this same disk to make your backups.

What could happen is that in a situation where you have low disk space on the log file disk, when you need the incremental backups the most so you can free some space on the log file and avoid it from growing, this could be the exact moment where you won’t be able to make your backups for the lack of free space, what puts you in a bad situation.

Obviously this could be avoided with a well planned incremental backup frequency, and with disks for log files with enough space, but we know things not always happen the way they should.

And what if you see yourself in this scenario, what can be done? You have a few options.

One of them is to add a new log file in another disk and then deal with the situation more calmly (in fact I have never tried this solution, but I GUESS DPM would create an identical path on the other disk and would allow you to make backups).

Another option, not a really good one in my opinion, would be to make an incremental (log) backup directly using T-SQL on SSMS sending the backup to the NUL device, like this:

BACKUP LOG DATABASE TO DISK = ‘NUL’

Where NUL is similar to the /dev/null device on linux (I have written about this in a previous post - this one in portuguese).

By doing this you would finally have some free space in your log file, but you would lose all of its content, breaking the chain of recovery points in DPM.

In the case you decide to use this “solution” it is highly recomended that you make a FULL backup right after doing so.

Independently of the solution adopted, the best thing to do is to control the frequency of your incremental backups on DPM and keep the disks with enough free space to allow SQL Server and DPM to work without problems.

Anyway, the alert is done about DPM’s behavior so more people would be aware of it and don’t go through this type of situation.

Publicado em Artigos, backup, System Center | Deixe um comentário

Evento – Winter 2012 Performance Palooza!

Pessoal o Performance Virtual Chapter do PASS está organizando um evento online bem interessante no próximo dia 06/12/2012 que eles estão chamado de “Winter 2012 Performance Palooza!“.

O evento vai contar com palestrantes muito bons como Kalen Delaney, Argenis Fernandez, entre outros.

Para mais informações sobre o evento basta acessar o link http://performance.sqlpass.org/2012Palooza.aspx

Publicado em Eventos, Virtual PASS BR | Deixe um comentário

DPM 2012 – Cuidado com o espaço no seu disco de log!

O System Center Data Protection Manager 2012 certamente é uma ferramenta muito boa para controlar os backups de um ambiente SQL Server, mas recentemente vi uma situação que merece um pouco de atenção para quem for implementar a ferramenta.

Ao configurar a proteção para um determinado banco de dados, aparentemente o DPM identifica a unidade de disco do arquivo de log e cria dentro dele o caminho:

UNIDADE:\DPM_SQL_PROTECT\SERVIDOR\INSTANCIA\BANCO_Log.ldf\Backup

Isso não é um problema por si só, mas imagine a situação onde há uma quantidade anormal de operações em seu banco de dados e seu arquivo de log é rapidamente “preenchido”.

Imagine então que você não tomou medidas reativas imediatamente e ficou “protegido” apenas pela frequência de seus backups incrementais (de log) do DPM, onde esses ao serem executados permitem a reutilização dos VLFs (dos “espaços”) em seu arquivo de log.

O problema nessa situação é que o DPM ao realizar seus backups incrementais gera um arquivo .log no caminho que mencionei mais acima, e este terá seu tamanho proporcional a quantidade de informação armazenada no arquivo de log.

Sendo assim, no momento em que seu arquivo de log está mais “cheio”, podendo até estar crescendo e ocupando mais espaço em sua unidade de disco, você precisará de mais espaço na mesma unidade para realizar seus backups.

O que pode ocorrer é que, em uma situação de pouco espaço no disco de log, quando você mais precisa realizar um backup incremental do DPM (de log) para liberar espaço no arquivo e evitar que ele cresça, esse seja exatamente o momento onde você não conseguirá realizar os backups, por falta de espaço, entrando assim em uma situação quase sem saída e bem desconfortável.

Obviamente que isso pode ser evitado com uma frequência bem planejado dos backups de log, com um disco para os arquivos de log com espaço devidamente planejado, mas nós sabemos que no mundo “real” as coisas nem sempre funcionam como deveriam (não lhe entregaram o disco que você pediu? houve falha no backup? etc…) e que esse cenário pode ocorrer.

E caso você se encontre nesse cenário, o que pode ser feito? Bem, ai você tem algumas opções.

Uma delas é adicionar um novo arquivo de log em um outro disco e então lidar com a situação com mais calma (nunca passei por essa situação, não sei se nesse caso ele criaria o caminho no outro disco e permitiria o backup, ou se faria o backup de cada arquivo de log em uma pasta no seu disco…).

Uma outra opção, mais traumática, seria realizar um backup de log diretamente por T-SQL enviando o conteúdo para o NUL device, dessa forma:

BACKUP LOG BANCO TO DISK = ‘NUL’

Onde o NUL é semelhante a ideia do /dev/null do linux (já escrevi sobre isso nesse post).

Com isso você consegue liberar espaço em seu arquivo de log, mas vai perder todo o conteúdo no mesmo, quebrando então a sequência de pontos de recuperação no DPM.

Caso opte por essa “solução” o recomendável é realizar um backup FULL do seu banco de dados logo em seguida.

Independente da solução adotada, o ideal é sempre controlar a frequência de seus backups incrementais no DPM e manter seu disco com espaço livre suficiente para que o SQL Server e o DPM operem sem problemas.

De qualquer forma, fica o aviso sobre o comportamento do DPM para que todos estejam cientes e não passem por esse tipo de situação.

Publicado em Artigos, System Center, Virtual PASS BR | Deixe um comentário