Quando uma nova versão do SQL Server é lançada, em geral com ela vem as novas certificações.

  • No SQL Server 2000 tinhamos o MCP e MCDBA;
  • No SQL Server 2005 e 2008 temos o MCTS e MCITP (com pequenas variações);
  • Agora no SQL Server 2012 temos o MCSA e o MCSE.

O MCSA é composto por 3 provas, e dá ao DBA certificado o título de “associado”. Quem quiser comprovar os conhecimentos mais avançados no SQL Server 2012 poderá trilhar o caminho do MCSE, onde o “E” significa “expert”. Para obter o MCSE, o MCSA é um pré-requisito. Portanto, para conseguir o MCSE temos que realizar 5 provas! (3 do MSCA + 2 do MSCE).

Atualmente o MCSE tem duas vertentes: MCSE Data Plataform (direcionada para o DBA com perfil administrador) e o MSCE Business Inteligence (para o profissional com foco em BI). Cada uma destas vertentes exige a aprovação em 2 provas. Portanto se você quiser ser um MCSE 2x, ao fim, terá realizado 7 provas! Veja que o caminho ficou mais longo e no meu ponto de vista, mais difícil (depois disso ainda existe o nível Master: MCSM, mas desta certificação falaremos em outro dia).

Não sei ao certo se estas mudanças constantes nos títulos e siglas é interessante para a identificação da certificação. Lembro que quando a Microsoft lançou o MCITP (no SQL Server 2005), por uns 2 anos a sigla MCDBA (do SQL Server 2000) ainda estava forte no mercado e quem tinha o MCITP se sentia levemente descontente, porque aquelas letrinhas, apesar de representarem uma certificação mais recente, não tinham o mesmo peso da certificação anterior na cabeça das pessoas.

Mas deixando esta questão polêmica para outro momento, considero que o novo programa de certificação do SQL Server 2012 está bem interessante e entendo que houve uma evolução. Digo isto porque agora ele força o DBA a conhecer mais sobre o produto. Nas certificações de versões anteriores, o administrador de banco de dados não precisava se preocupar em fazer a prova de T-SQL e nem se preocupar com integration services ou analys services. Agora não mais. O DBA com perfil de administrador será obrigado a fazer exames específicos, focados nestes conteúdos, para conseguir o MCSA.

Tirando todas as polêmicas por tras do assunto, considero que as certificações são sim interessantes para a carreira de um DBA. A certificação (quando levada a sério) força o profissional a conhecer (mesmo que de forma genérica) o ecossistema da tecnologia que deseja ser um especialista. Ela também mostra para o mercado que o profissional tem conhecimentos básicos, mas importantes, para administrar um banco de dados.

Conquistar uma certificação não te torna um profissional sênior da noite para o dia, mas se você evitar os atalhos, ela podera te proporcionar isso a longo prazo.

Invista sempre no seu conhecimento.

Quer saber todos os detalhes para as novas certificações, numeros do exames e etc? Clique aqui!

Bons estudos :)

Olá,

No mês de Abril fiz o curso de SQL Server Internals com o Luciano Moreira, mais conhecido na comunidade como Luti; não vou me estender muito neste assunto, mas se você é um DBA SQL Server, recomendo fortemente que faça este curso. Excelente…

Mas vamos ao foco do nosso post. Durante o curso de internals alguns mitos foram por água abaixo; um deles foi  “Ao realizar um backup full, perdemos a sequência do log”.

Verdade? Sim ou Não?

Bom, confesso que eu sempre tive isso como verdade absoluta e tenho certeza que outros inúmeros DBAs SQL Server pensam o mesmo; mas a verdade é que não, realizar um backup full não quebra a sequência do seu log. Mas falando assim não tem graça né, vamos testar a brincadeira:

Primeiro criamos um banco para nosso teste (no fim do post está o script completo do nosso teste):

CREATE DATABASE testeBackup

Por padrão o SQL Server criar o banco com o recovery model FULL (exceto na edição Express). Isto é importante para o nosso teste já que iremos realizar backup do log. Para confirmar:

-- Recovery Model = FULL
SELECT recovery_model_desc
FROM sys.databases
WHERE NAME LIKE 'testeBackup'

Vamos criar uma tabela para nossos testes e realizar nosso primeiro backup FULL:

USE testeBackup

-- Cria tabela
CREATE TABLE registroBackup
	(id INT IDENTITY,
	registro VARCHAR(50))

-- Realiza backup FULL
BACKUP DATABASE testeBackup
TO DISK = 'C:testeBackupFULL.bak' WITH INIT

Agora utilizando uma estrutura de repetição inserimos 1 registro na tabela e realizamos um backup de log. Isso repetirá por 5 vezes:

DECLARE @i INT

SET @i = 1

WHILE @i <= 5
BEGIN
	-- Insere registro
	INSERT INTO registroBackup
	VALUES ('Antes do '+CAST(@i AS VARCHAR(2))+'º backup de LOG')
	-- Realiza backup de log
	BACKUP LOG testeBackup
	TO DISK = 'C:testeBackupLOG.bak'
	WITH NOINIT
	-- Incrementa contador
	SET @i = @i + 1
END

Verificamos então os registros inseridos na tabela:

SELECT * FROM registroBackup

Resultado:

E verificamos os nossos backups de log:

RESTORE HEADERONLY FROM DISK = 'C:testeBackupLOG.bak'

Resultado:

Como verificamos temos aí 5 registros e 5 backups de log.

Agora realizamos um novo backup FULL:

BACKUP DATABASE testeBackup
TO DISK = 'C:testeBackupFULL_2.bak' WITH INIT

E repetimos a execução do laço:

DECLARE @i INT

SET @i = 6

WHILE @i <= 10
BEGIN
	-- Insere registro
	INSERT INTO registroBackup
	VALUES ('Antes do '+CAST(@i AS VARCHAR(2))+'º backup de LOG')

-- Realiza backup de log
	BACKUP LOG testeBackup
	TO DISK = 'C:testeBackupLOG.bak'
	WITH NOINIT

-- Incrementa contador
	SET @i = @i + 1
END

Ao fim temos 10 registros em nossa tabela, 10 backups de LOG e 2 backups FULL.

Agora entra a figura do estagiário que exclui o segundo arquivo de backup FULL… (sacanagem, rss)

Segundo a lenda, isso inválida todos os backups de log posteriores e teríamos que realizar um backup FULL imediatamente, porque ao realizar o segundo backup FULL perderíamos a seqüência do log.  Certo? Bom… vamos testar:

Excluímos  a base de dados:

USE MASTER
GO
DROP DATABASE testeBackup

E restauramos os backups (FULL + LOGs) ignorando o segundo backup FULL:

RESTORE DATABASE testeBackup
FROM DISK = 'C:testeBackupFULL.bak' -- primeiro backup FULL
WITH NORECOVERY

-- Restauramos os 10 arquivos de log

DECLARE @i INT
SET @i = 1

WHILE @i <= 10
BEGIN

	RESTORE LOG testeBackup
	FROM DISK = 'C:testeBackupLOG.bak'
	WITH FILE = @i, NORECOVERY

	SET @i = @i + 1

END

	RESTORE DATABASE testeBackup
	WITH RECOVERY -- colocamos a base em operação

Verifique que restauramos os 10 registros de nossa tabela:

USE testeBackup
SELECT COUNT(*) FROM registroBackup

Resultado:

Enfim, note que a realização do 2º backup FULL não quebrou a seqüência dos nossos backups de log!

Agora a pergunta que não quer calar: qual a função do parâmetro de backup COPY_ONLY lançado a partir do SQL Server 2005?!

Um backup diferencial tem total dependência do último backup FULL; logo, se você perder o backup FULL anterior, não será possível restaurar o diferencial, mesmo com um FULL mais antigo. Então pense numa situação que você precise de um backup FULL adicional, mas não deseja que ele afete seus próximos backups diferenciais (que deverão continuar utilizando como referência o backup FULL anterior), então aqui utilizaríamos o COPY_ONLY.

Resumindo: Os backups diferenciais posteriores iram ignorar um backup FULL com COPY_ONLY.

CONCLUSÃO

Backup FULL não altera a sequência dos backups de LOG. Se você perdeu seu último backup FULL, mas tem um do mês passado e de lá pra cá todos os seus backups de LOG estão intactos, não se desespere! Você conseguirá restaurar seu backup.

PS: Obrigado Luti pela super dica :D

Disponibilizei o script completo deste teste aqui.

Até +


Na época em que o MSDE estava em alta, muitos amigos vinham pedir dicas de como criar uma rotina automática de backups e etc, o maior impasse era sempre a falta de uma interface gráfica.

Ao contrário das novas versões do SQL Server Express, o MSDE possuía o serviço SQL Agent que permite agendar rotinas, backups, etc, e isso era ótimo, mas a barreira era saber como utilizar essa funcionalidade sem uma ferramenta.

Mas enfim, o foco desse texto não é o MSDE, até porque, com o tempo foram disponibilizadas algumas ferramentas para suprir algumas necessidades. A idéia principal é verificarmos como criar uma nova tarefa (job) e automatiza-la utilizando scripts no SQL Server.

Analisando um pouco veremos que precisamos apenas de 4 procedures para criação de um job: sp_add_job, sp_add_jobstep, sp_add_jobserver e sp_add_jobschedule. No nosso texto vamos utilizar como exemplo um cenário onde precisamos automatizar o backup da base de dados Master. Vamos analisar agora cada uma das procedures:

  • sp_add_job

Esta procedure adiciona um novo registro à tabela sysjobs, em linhas gerais, este registro é o nosso job, porém um job sem qualquer funcionalidade e sem agendamento. Inicialmente um job nessas condições não tem qualquer utilidade. Abaixo podemos verificar a criação de um job vazio com o título Backup MASTER:

execute sp_add_job @job_name = 'Backup MASTER'
  • sp_add_jobstep

Para darmos “vida” ao job criado anteriormente, precisamos adicionar funcionalidades a ele, por exemplo: um passo onde será executado o script de backup.  Para adicionar funcionalidades ao job Backup MASTER precisamos conhecer seu código gravado na sysjobs, para isso podemos executar o seguinte comando:

select  job_id
from  sysjobs
where name = 'Backup MASTER'

O resultado será um big código! Isso porque o código gerado é do tipo UNIQUEIDENTIFIER, popularmente conhecido como Identificador Universal.  O resultado da minha consulta é: 7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31 (é mais prático trabalhar com conteúdos deste tipo armazenando-o numa variável, porém, neste texto iremos aborda-lo explicitamente em cada passo dos exemplos).

Ok. Agora vamos utilizar este big-código junto com a sp_add_jobstep para adicionarmos funcionalidade ao nosso JOB:

-- Adiciona função ao Job
execute sp_add_jobstep @job_id = '7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31',
     @step_name = 'Script Backup Master',
     @command = 'backup master to disk = ''c:master.bak'''

Observe que utilizamos três parâmetros junto à sp_add_jobstep: o código do job (@job_id), o nome da funcionalidade (@step_name) e finalmente o script de backup no parâmetro @command.

É interessante esclarecer que um job pode ter inúmeros passos/tarefas, logo você poderá utilizar esta procedure quantas vezes forem necessárias para adicionar novos passos a um mesmo job.

  • sp_add_jobserver

Agora vem o passo mais “abstrato” desse processo. Após criarmos o job e definir suas funções precisamos definir em qual servidor ele irá operar. Pressupõe-se que se o job foi criado no servidor <strong>X</strong> que ele deverá ser executado no contexto deste servidor, porém, aqui nós temos que explicitar isto, logo, precisaremos executar a procedure sp_add_jobserver e configurar o job para rodar no contexto do servidor local:

execute sp_add_jobserver
     @job_id = '7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31',
     @server_name = N'(local)'

Pronto!

Neste momento nosso job já tem uma forma e já pode ser executado.

Se quisermos testar a execução manualmente, podemos executar o seguinte comando:

 sp_start_job 'Backup MASTER'

Resultado:

Job ‘Backup MASTER’ started successfully.

Vejam que nosso job foi executado com sucesso e que o arquivo foi criado:

  • sp_add_jobschedule

Considerando que a principal funcionalidade do SQL Server Agent e seus jobs é automatizar tarefas, não há muito sentindo em executar jobs manualmente, logo, precisamos criar um agendamento para nosso job e assim partimos para a última etapa deste processo onde recorremos à procedure sp_add_jobschedule:

execute sp_add_jobschedule
     @job_id = '7EC785F2-36D7-4BEB-B2E4-BFC38E7F4D31',
     @name = N'Agenda Backup',
     @freq_type = 4,
     @active_start_time = 120000,
     @freq_interval = 1

O comando pode parecer complexo, mas analisando com calma veremos que é bem tranquilo. Vamos analisar cada um dos parâmetros separadamente:

No @job_id definimos para qual job estamos criando o agendamento utilizando o “big-código”.

Em @name atribuímos um nome para o nosso agendamento.

Em @freq_type temos as seguintes possibilidades:

@freq_type Frequência de Execução
1 somente uma vez
4 Diariamente
8 Semanalmente
16 Mensalmente

No nosso script @freq_type = 4, logo, o comando indica que o job será executado diariamente.

Em @active_start_time definimos o horário da execução, no nosso exemplo 12:00:00, sem os sinais de separação entre horas, minutos e segundos. Se o conteúdo desse parâmetro fosse 215600, o job seria executado às 09:56 da noite.

Por fim temos o parâmetro @freq_interval que está diretamente atrelado ao parâmetro @freq_type e foi definido como 1 porque nosso backup será executado todos os dias.

(Pode ser complexo definir valor para o parâmetro @freq_interval, mas não iremos nos aprofundar nele neste momento. Para entender sua composição consulte: http://msdn.microsoft.com/pt-br/library/ms366342.aspx)

Para verificar todos os parâmetros das procedures listadas acima, digite por exemplo:

 sp_help sp_add_jobschedule 
  • CONCLUSÃO

Neste texto podemos notar que automatizar tarefas via script não é uma tarefa tão árdua, mas sem dúvidas, na maioria
dos cenários, a utilização de uma ferramenta gráfica proporcionará maior produtividade; porém se um dia você se deparar com um MSDE ou situação semelhante, irá lembrar que com basicamente 4 passos é possível automatizar suas rotinas.

Existem três tipos básicos de backups no SQL Server: o backup completo, o backup diferencial e o backup incremental. O dois últimos sempre trabalham em conjunto com o backup completo.

Uma estratégia de backup é algo muito particular de cada negócio; em alguns ambientes críticos é inadimissível a perda de um minuto de informação, já em outros lugares, na ocasião de uma falha, um backup do dia anterior é a solução ideal; logo, a forma como mesclar os diferentes tipos de backups é uma questão a ser analisada (e testada!) com muito critério.

No entanto de uma coisa temos certeza: toda estratégia de backup incluirá um backup completo (comumente chamado de backup FULL) e neste texto iremos focar na recuperação (via script) de um backup completo no SQL Server; para isso utilizaremos como base dois cenários:

  • O primeiro cenário abordará o restore de um backup FULL sobre a base original (do backup), por exemplo, sua base de dados atual sofreu alterações inadequadas e agora precisa da restauração do último backup para reaver os dados anteriores.
  • No segundo cenário iremos visualizar um DBA que recebe um backup completo de um cliente e precisa restaurá-lo em outro ambiente, por exemplo, para sua equipe de desenvolvimento.

CENÁRIO 1

Temos aqui um arquivo de backup chamado AdventuresWorks_FULL.bak. Antes de restaurá-lo precisamos verificar qual o conteúdo desse arquivo físico e se o backup existente irá atender a necessidade do restore; para isso utilizaremos o seguinte comando:

restore headeronly from disk ='C:LabRestoreAdventuresWorks_FULL.bak'

Veja o resultado:

01fig

No resultado da execução do comando RESTORE HEADERONLY podemos identificar que o arquivo em questão contém três backups (sim! um arquivo físico pode conter inúmeros backups de uma mesma base). Observe a posição de cada backup dentro do arquivo (campo Position), o tamanho de cada um (BackupSize)  e suas respectivas datas (BackupStartDate).

No nosso exemplo vamos restaurar o backup do dia 03 de Fevereiro, logo, o backup a ser restaurado será o da posição 2 (dois). Vamos ao script:

USE MASTER

GO

RESTORE DATABASE AdventureWorks

FROM DISK = 'C:LabRestoreAdventuresWorks_FULL.bak'

WITH FILE = 2, REPLACE, STATS = 10

A base de dados a ser restaurada é a AdventureWorks, o arquivo de backup está localizado no endereço: C:LabRestoreAdventuresWorks_FULL.bak. O backup que será restaurado está na posição 2 deste arquivo (FILE = 2). Como a base já existe é necessário sobrescrevê-la, para isto utilizamos a opção REPLACE. O STATS mostrará o progresso da restauração em intervalos de 10 em 10%.

Importante: Numa operação de restore a base não deve estar em uso por nenhum usuário (inclusive você), por isso antes de iniciar o script direcionamos a sessão para o database Master. Se a base estiver em uso, a seguinte mensagem de erro será exibida:

Msg 3101, Level 16, State 1, Line 1

Exclusive access could not be obtained because the database is in use.

Se tudo estiver ok, ao final da execução do script você verá uma mensagem similar a esta:

RESTORE DATABASE successfully processed 22514 pages in 10.209 seconds (18.065 MB/sec).

CENÁRIO 2

Neste cenário o DBA deverá restaurar um backup completo recebido de um cliente externo. O arquivo de backup está identificado como SistemaX_FULL.bak e será restaurado no ambiente de desenvolvimento que é composto por um servidor com um único disco (C:).

Vamos analisar o conteúdo do arquivo com o RESTORE HEADERONLY:

restore headeronly from disk = 'C:LabRestoreSistemaX_FULL.bak'

Veja o resultado:

02fig

No resultado acima verificamos que existe um único backup neste arquivo. A base do cliente (campo DatabaseName) está identificada por SistemaX e podemos verificar também outros dados como o tamanho do backup e data.

Até aqui tudo bem, mas neste cenário precisamos analisar novos elementos, isso porque a base em questão ainda não existe e ao efetuar a restauração o SQL Server irá trazer além dos objetos deste banco (tabelas, procedures, triggers) suas configurações originais como: endereço dos arquivos físico de dados e log, modo de recovery, etc. Para verificar o estado de algumas destas propriedades podemos utilizar o comando RESTORE FILELISTONLY:

restore filelistonly from disk = 'C:LabRestoreSistemaX_FULL.bak'

Veja o resultado:

03fig

Observe que a base do cliente e seus respectivos arquivos de dados e log estão localizados em discos diferentes. Neste caso, se o DBA realizar um restore comum (como o script utilizado no exemplo anterior) o SQL Server tentará alocar estes arquivos em seus caminhos de origem, logo precisamos alterar este comportamento, já que neste cenário o servidor onde será realizado o restore só possui um disco. Veja o comando:

USE MASTER

GO

RESTORE DATABASE SistemaX
FROM DISK = 'C:LabRestoreSistemaX_FULL.bak'
WITH
MOVE 'SistemaX' TO 'C:LabRestoreSistemaX.mdf',
MOVE 'SistemaX_log' TO 'C:LabRestoreSistemaX_log.ldf',
STATS = 10

A base de dados a ser restaurada é a SistemaX e o arquivo de backup está em: C:LabRestoreSistemaX_FULL.bak. Observe que adicionamos a opção MOVE; esta opção direciona os arquivos de dados e log para um novo caminho. O restante não muda; continuo utilizando o STATS e desta vez não precisamos do REPLACE já que a base não existia.

É importante destacar que os comandos RESTORE FILELISTONLY e RESTORE HEADERONLY não são obrigatórios num processo de restauração de banco; eles são comandos que recuperam informações sobre os arquivos de backup e estas informações podem auxiliar o DBA no processo de restauração.

Existem outros comandos similares, como o RESTORE VERIFYONLY que verifica se o arquivo de backup está legível.

CONCLUSÃO

Como podemos verificar, o restore de um backup full, via script não é difícil, basta conhecer os comandos certos para recuperar informações sobre o conteúdo do arquivo de backup; estas informações  irão auxiliar o usuário na construção do comando de restore.

Nos próximos posts iremos abordar o restore de backups diferenciais e log. Até +

Bom trabalho!

Existem diferentes formas de configurar uma instância SQL Server, uma delas é através da procedure sp_configure. O interessante de utilizar a sp_configure é que o DBA não fica dependente da utilização de uma interface gráfica.

Ao executar a sp_configure sem parâmetros, são exibidas as configurações atuais da instância. Cada registro representa uma configuração e no campo run_value é possível visualizar o valor atual de cada configuração.

01_sp_configure

Num cenário padrão ao executar a sp_configure o resultado só exibe algumas das inúmeras opções de configuração; isso porque por padrão o SQL Server oculta opções avançadas. Para exibir todas as opções você deve executar:

USE master
GO
EXEC sp_configure 'show advanced option', '1';
GO
RECONFIGURE;
Veja que no comando acima é possível ter uma idéia da sintaxe desta procedure. A idéia básica é a seguinte:
EXEC sp_configure ‘nome da configuração’, ‘novo valor da configuração’

Uma das configurações que podemos alterar utilizando a sp_configure é o limite de memória utilizada pelo SQL Server, vamos exemplificar a alteração desta configuração:

Atualmente minha instância está configurada para utilizar no máximo 500 MB de memória. Ao executar o comando sp_configure é possivel verificar que a opção max server memory (MB) está com o valor 500 nos campos config_value e run_value.

02_sp_configure

Para alterar a quantidade máxima de memória que a minha instância poderá utilizar executo o seguinte comando:

EXEC sp_configure 'max server memory (MB)', '300';

No comando acima configurei o máximo de memória disponível para a instância para 300 MB, no entanto se executarmos a sp_configure verificaremos que a opção run_value ainda continua com 500. Para efetivar a alteração preciso executar o comando RECONFIGURE; assim a alteração entrará em vigor.

RECONFIGURE

Figura 1 – Monitorando o contador Target Server Memory durante execução do RECONFIGURE.

É importante salientar que apesar do comando RECONFIGURE ser obrigatório, nem todas as configurações são efetivadas somente com a execução do RECONFIGURE, para estas opções a efetivação só ocorre com a reinicialização do serviço do SQL Server. Para verificar quais são estas opções basta consultar a tabela sys.configurations (disponível no SQL Server 2005/2008). As configurações que tiverem o campo is_dynamic igual a 0 (zero) só entrarão em vigor quando o serviço do SQL Server for reiniciado. Note que se o comando RECONFIGURE não for executado, mesmo que a instância seja reiniciada a nova configuração não entrará em vigor.

Outras configurações possíveis através da sp_configure: habilitar a procedure xp_cmdshell,  procedures do Database Mail,  código gerenciado (CLR), configurar o número de processadores utilizados pela instância (paralelismo), configurar memória extendida (AWE), etc.

  • RECONFIGURE ou RECONFIGURE WITH OVERRIDE?

Se ao alterar uma configuração o DBA definir um valor que foge às recomendações do SQL Server, ao executar a opção RECONFIGURE o SQL Server irá rejeitar a alteração e notificar o usuário. Por exemplo, na versão 2000 era possível realizar alterações nas tabelas de sistema do SQL Server (isso mudou um pouco nas versões 2005 e 2008), para isso bastava executar o comando:

EXEC sp_configure 'allow updates', '1'

No entanto, por razões óbvias esta não é uma prática recomendada, então nessas situações, ao executar somente o RECONFIGURE, o SQL Server exibia a seguinte mensagem:

Configuration option ‘allow updates’ changed from 1 to 1. Run the RECONFIGURE statement to install.

Msg 5808, Level 16, State 1, Line 1

Ad hoc updates to system catalogs not recommended. Use the RECONFIGURE WITH OVERRIDE statement to force this configuration.

Logo o DBA só poderia concretizar essa operação se utilizasse o RECONFIGURE WITH OVERRIDE, ou seja, esta é a forma do SQL Server se proteger contra ações indevidas e dizer ao DBA:  “amigo, isso é por sua conta e risco”. Portanto, o WITH OVERRIDE é uma opção a ser evitada e só é recomendada em situações pontuais.

  • Conclusão

Conhecer as diferentes formas de configurar uma instância SQL Server dá ao DBA maior liberdade no momento de realizar estas tarefas, neste caso, além das ferramentas gráficas o DBA também poderá utilizar a sp_configure no SQLCMD, OSQL ou agendar alterações de configurações através de jobs e etc.

Para ter acesso a todas as opções de configurações disponíveis na sp_configure, consulte a tabela sys.configurations ou acesse o Books Online.

Bom trabalho, bons estudos.

Uma dica rápida antes do feriadão:

Como agendar um script ou executá-lo de forma recorrente sem utilizar o SQL Agent?

O SQL possui um comando de controle de fluxo que pode nos auxiliar nessas tarefas: WAITFOR.

Como utilizá-lo?

Digamos que você queira monitorar o crescimento dos logs a cada 5 minutos. Nesse caso podemos utilizar o WAITFOR DELAY junto com uma estrutura de repetição como o while. Veja o exemplo:

declare @i int

set @i = 1

while @i < 12

begin

– coleta informação sobre espaço utilizado pelo log

dbcc sqlperf(logspace)

– aguarda 05 minutos para continuar

waitfor delay ’00:05:00′

set @i = @i + 1

end

Agora imagine um cenário onde você precise “agendar” a execução de um script para as 22h. Veja o exemplo:

– espera até às 22h

waitfor time ’22:00:00′

GO

dbcc sqlperf(logspace)

GO

select getdate() horaExecucao

É importante salientar que este comando não substitui o SQL Agent! Ele normalmente é utilizado em situações pontuais. Por exemplo, para o DBA às vezes é interessante monitorar durante alguns minutos a situação dos locks e para isso não é necessário criar um job e agendá-lo no SQL Agent, é mais simples utilizar o WAITFOR DELAY. Além disso você pode acompanhar o resultado das execuções diretamente no Management Studio, Query Analyser, sqlcmd, etc.

O comando é interessante, mas não veja nele uma forma de implementar uma nova política de backup, ok?

Bom feriadão!

sqlvirtual

Hoje cedo recebi um e-mail da SQL Server Magazine, com a seguinte propaganda:

SQL Virtual Database: It’s As Easy As 1, 2, 3.

O anúncio chamou atenção e resolvi dar uma verificada.

Imagine o seguinte cenário: você tem um backup de uma base de dados SQL Server e precisa restaurá-lo pra trabalhar em cima dele. O backup tem aproximadamente 180 GB e você vai precisar de algumas horas pra restaurá-lo.

Imagine agora que você tenha uma forma de “restaurar” esse backup em 10 minutos e trabalhar em cima dele normalmente, como qualquer outra base de dados do SQL Server, executando consultas, procedures, realizando updates, etc. Essa é a idéia da ferramenta SQL Virtual Database desenvolvida pela Idera.

Algumas pessoas poderão dizer, “ah, mas o SQL Server já tem o Database Snapshot”. Sim, a idéia é parecida, mas o Database Snapshot só pode ser gerado na mesma instância da base de origem e só está disponível a partir do SQL Server 2005 em edições Enterprise. O SQL Virtual Database gera uma base de dados virtual em qualquer instância (inclusive SQL Server 2000) a partir de um arquivo de backup.

Achei a idéia inicial muito boa (o programa está na versão beta) e de certa forma fiquei impressionado com os 9 minutos que esperei para ter uma base virtual, baseada num backup de 180 GB, que estava em outra estação da rede. Particularmente achei uma saída muito interessante pra ambientes de desenvolvimento e homologação.

Vou testá-la repetidamente durante os próximos 14 dias (que é o período do Trial) e se tiver mais considerações posto aqui.

Abaixo algumas telas da ferramenta:

Tela de instalação

1. Tela de instalação

Attach do backup

2. Attach do backup na instância MENDESSQL05

Base de dados anexada à instância

3. Base virtual anexada à instância

Link para download.

Bom trabalho!


Essa série de Check List para DBAs SQL Server foi escrita por Brad McGehee para o site http://www.simple-talk.com/ . É um texto sucinto, mas muito completo. Tomei a liberdade de adicionar algumas observações(em itálico) que normalmente apontam para outros conteúdos em português. O texto original pode ser lidoaqui.

Segurança

  • Garanta a segurança física de cada servidor SQL Server, evitando que usuários não autorizados acessem seus servidores fisicamente.
  • Em suas instâncias SQL Server instale somente bibliotecas e protocolos de rede que sejam realmente necessários.
  • Reduza a quantidade de sysadmins (administradores) que tenham permissão para acessar o SQL Server;
  • Como DBA trabalhe com privilégios sysadmin somente quando necessário. Crie contas diferentes para os DBAs acessarem o SQL Server quando privilégios de administrador não forem necessários.
  • Configure a conta SA com uma senha segura e jamais utilize esta conta para logar no SQL Server. Para acessar o SQL Server com direitos administrativos utilize uma conta com autenticação Windows.
  • Quando conceder permissões para usuários, dê o mínimo de permissão necessário para que ele possa realizar o trabalho.
  • Ao invés de permitir que usuários acessem os dados diretamente nas tabelas, utilize Store Procedures e/ou Views.
  • Sempre que possível utilize contas com autenticação Windows (windows authentication) no lugar de logins SQL Server.
  • Use senhas fortes em todas as contas com autenticação SQL Server.
  • Não conceda permissões para a role Public.
  • Remova logins que não precisam mais de acesso ao SQL Server.
  • Remova a conta guest de todos os bancos de dados.
  • Se não for necessário desabilite a propriedade Cross-Database Ownership.
  • Nunca dê permissão na procedure xp_cmdshell para usuários que não são administradores.
  • Evite criar compartilhamentos de rede no servidor SQL Server.
  • Ative a auditoria de login, para que você possa ver quem teve sucesso ou falha no momento de logar no SQL Server. No SQL Server 2008 você poderá utilizar o SQL Server Audit.
  • Não use a conta SA ou contas que são membros do grupo sysadmin como contas utilizadas por aplicações que acessam o SQL Server.
  • Garanta que o servidor SQL Server esteja protegido por um firewall e não esteja exposto diretamente na internet.
  • Retire o grupo BUILTIN/Administrators do SQL Server para prevenir que administradores do servidor tenham acesso ao SQL Server. Antes de fazer isso num SQL Server instalado sobre um cluster, verifique o Books Online.
  • Tenha uma conta de domínio diferente para cada serviço do SQL Server.
  • Conceda o mínimo necessário de direitos e permissões para as contas de domínio dos serviços SQL. Na maioria dos casos, direitos de administrador local ou administrador de domínio não são necessários. Fora poucas exceções a instalação do SQL Server configura automaticamente as permissões necessárias para as contas de serviços.
  • Ao rodar consultas distribuídas, utilize linked server ao invés de remote servers.
  • Não navegue na internet num servidor SQL Server.
  • Ao invés de instalar um anti-vírus/anti-spyware no servidor SQL Server, execute os scans a partir de uma maquina remota, em horários onde a atividade dos usuários é menor, fora do horário de produção.
  • Atualize service packs e hot-fix do sistema operacional e do SQL Server sempre que estes forem liberados e testados. Muitas vezes eles incluem melhorias na segurança.
  • Criptografe todos os backups do SQL Server. Se você tem o SQL Server 2008 Enterprise Edition poderá usar a criptografia nativa, se não for o caso, poderá utilizar ferramentas de terceiros, como o SQL Backup Pro.
  • Só habilite as auditorias C2 ou Common Criteria se isso for necessário.
  • O SQL Server 2008 vem com uma nova funcionalidade de auditoria chamada SQL Server Audit. Ela pode auditar praticamente qualquer atividade do usuário, mas mantenha um número baixo de atividades e objetos auditados para reduzir a sobrecarga no desempenho.
  • Considere executar o SQL Server Security Scanner nos seus servidores SQL Server para identificar falhas de segurança.
  • Considere adicionar um certificado em suas instâncias SQL Server e habilitar SSL ou IPsec para conexões com clientes.
  • Se estiver usando o SQL Server 2005/2008 habilite as opções de políticas de senha.
  • Se estiver utilizando o SQL Server 2008 Enterprise Edition, considere implementar criptografia dos dados (Transparent Data Encryption) para ajudar a proteger os dados armazenados em disco.

Essa série de Check List para DBAs SQL Server foi escrita por Brad McGehee para o site http://www.simple-talk.com/ . É um texto sucinto, mas muito completo. Tomei a liberdade de adicionar algumas observações(em itálico) que normalmente apontam para outros conteúdos em português. O texto original pode ser lidoaqui.

Instalação

  • Sempre documente todo o processo de instalação do SQL Server, para que numa situação de emergência o processo possa ser facilmente reproduzido.
  • Se possível, instale e configure todas as suas instâncias do SQL Server seguindo um padrão que foi acordado e aceito por sua organização. Opcionalmente, utilize o SQL Server 2008 Policy-based Management para fazer com que todas as normas sejam cumpridas.
  • Não instale serviços do SQL Server que não serão usados, como o Microsoft Reporting Services ou Analysis Services (se você não usá-los).
  • Para o melhor desempenho do SQL Server, desabilite todos os serviços do Windows que não são necessários.
  • Para o melhor desempenho do SQL Server, dedique seu servidor físico à sua instância SQL Server, não rode outras aplicações nele.
  • Para o melhor desempenho de I/O, coloque os arquivos .mdf e .ldf em volumes de discos separados para evitar conflitos de escrita e leitura.
  • Se a TEMPDB for muito utilizada, coloque esta base em discos separados. Além disso, faça uma estimativa para o tamanho desta base, de forma que não ocorra crescimento automático. Divida a TEMPDB em vários arquivos, de forma que o número de arquivos físicos represente 50% a 100% do número de núcleos da CPU do seu servidor. Cada arquivo físico deve ter o mesmo tamanho.
  • Não instale o SQL Server num controlador de domínio.
  • Nos arquivos de dados e logs não utilize compactação, nem EFS (criptografia em sistemas de arquivos NTFS) .

Atualizando

  • Para evitar problemas potenciais, execute o Upgrade Advisor em qualquer banco de dados que você pretende atualizar.
  • Antes de realizar uma atualização do SQL Server, teste seu aplicativo num ambiente de testes para garantir compatibilidade. Antes de realizar a atualização faça as alterações necessárias.
  • Antes de qualquer atualização, verifique se você tem um plano ‘B’ para o caso de uma falha.
  • O upgrade ‘in place’ pode funcionar bem, mas instalar o novo SQL Server num novo hardware é menos arriscado (side-by-side).
    • Para entender mais sobre as técnicas de upgrade no SQL Server, veja essa ótima apresentação de José Ricardo Ribeiro (download em português):
  • Depois do upgrade, você deverá atualizar todas as estatísticas dos seus bancos de dados, usando o UPDATE STATISTICS. Isso é necessário porque as estatísticas não são automaticamente atualizadas durante o processo de atualização. Além disso, executar o UPDATE STATISTICS pode corrigir a contagem interna das páginas.

Essa série de Check List para DBAs SQL Server foi escrita por Brad McGehee para o site http://www.simple-talk.com/ . É um texto sucinto, mas muito completo. Tomei a liberdade de adicionar algumas observações (em itálico) que normalmente apontam para outros conteúdos em português. O texto original pode ser lido aqui.

Dicas de boas práticas para tornar-se um DBA Excepcional

  • Junte-se a um grupo de usuários de SQL Server.
  • Participe pelo menos uma vez ao ano de uma conferência profissional.
  • Faça pelo menos um treinamento por ano.
  • Leia pelo menos quatro livros de SQL Server por ano.
  • Leia o e-book How to Become an Exceptional DBA.
    • Livro escrito pelo autor que dá diversas dicas de como torna-se um DBA Excepcional (download em inglês).
  • Saiba tudo o que puder sobre o seu trabalho, principalmente naquelas áreas que ninguém gosta ou quer dominar.
  • No seu trabalho, seja voluntário, envolva-se em novas tarefas e aceite desafios, isso fará com que você conheça mais sobre a organização da sua empresa.
  • Instale o SQL Server no computador da sua casa ou em seu notebook e pratique, aprendendo novas funcionalidades do SQL Server, principalmente no SQL Server 2008.
  • Participe de fóruns sobre SQL Server (fazendo e respondendo perguntas).

Dia-a-dia

  • Verifique os logs do Windows, do SQL Server e logs de segurança.
  • Verifique se todos os jobs foram executados com sucesso.
  • Veja se os backups foram executados com sucesso e se foram salvos em local seguro.
  • Monitore o espaço em disco para garantir que o SQL Server não fique sem espaço. Para um melhor desempenho, todos os discos devem ter pelo menos 20% de espaço livre.
  • Durante todo o dia, periodicamente, monitore o desempenho do seu servidor. Use o System Monitor, Profiler, DMVs, ou o SQL Server 2008 Performance Data Collector.
  • Use o Management Studio ou o Profiler para monitorar e identificar problemas de locks [bloqueios].
  • Mantenha um registro de todas as alterações feitas em seus servidores, incluindo uma documentação de todos os problemas de desempenho que você encontrar e corrigir.
  • Crie alertas no SQL Server para notificá-lo através de e-mail sobre problemas potenciais. Ao receber os e-mails tome as medidas necessárias.
  • Dedique um tempo do seu dia para aprender algo novo e promover seu desenvolvimento profissional.