Blog Archives

O ultimo backup full executado com sucesso

Olá pessoal,

Após algum tempo sem passar por aqui, venho compartilhar um pequeno script que criei para pegar o último backup full que aconteceu para cada base de dados na instancia. O script é bastante simples e com certeza, você poderá encontrar outros pela internet, mas como sempre gosto de compartilhar algo que crio, aqui estou.

O script executa a leitura na tabela backupset do banco de dados msdb procurando pelo último backup full completo. Read the rest of this entry

Erro ao realizar Backup SQL Server 2005

Olá pessoal,

Como sempre venho blogando sobre problemas que venho encontrando no dia a dia e nada melhor que compartilhar com vocês. Hoje vou postar um problema que tive ao realizar backup das bases de dados de sistema no SQL Server 2005, porem isso pode também ocorrer nas bases de usuário.

Ao abrir o errorlog do SQL Server me deparo com o seguinte erro.

Foi encontrado o problema ao realizar o backup: BackupVirtualDeviceFile::PrepareToFreeze:  failure on backup device ‘{621C3723-8830-45A3-89B4-49F6D262694F}3’. Operating system error 995(A operação de E/S foi anulada devido a uma saída de segmento ou a uma requisição de aplicativo.).

Bom não vou me atentar a explicar porque isso acontece, mas sim como resolver. A Microsoft liberou um Hotfix especificamente para isso aqui, porem o que mais indico é claro atualizar o Service Pack do SQL Server 2005 para o SP4 que já possui essa correção.

Por hoje é isso ai, espero que esse post seja útil para vocês.

 

Att,
Marcos Freccia
[MCTS|MCITP|MCT SQL Server 2008]

Problemas ao instalar SQL Server 2005 em server multicore

Ola Pessoal,

Apenas para retratar um problema que me ocorreu ontem ao tentar instalar o SQL Server 2005 em um server com multiplos cores. O problema ocorria no momento em que a instalaçao tenta iniciar o serviço do SQL Server. A mensagem apresentada era a seguinte.

The SQL Server service failed to start. For more information, see the SQL Server Books Online topics, “How to: View SQL Server 2005 Setup Log Files” and “Starting SQL Server Manually.”

Se voce verificar o arquivo de log o mesmo nao informa que o problema é a quantidade de cores que o servidor possui. Porem realizando algumas pesquisas encontrei esse KB http://support.microsoft.com/kb/954835/en-us que explica o problema e explica também o workaround para essa situaçao.

Se alguem encontrar um problema parecido ja sabe onde encontrar referencia. 🙂

 

Att,
Marcos Freccia
[MCTS|MCITP|MCT SQL Server 2008]

 

Segundo Evento MCITP SC

Ola Pessoal, ontem saiu o cronograma de mais um evento da comunidade MCITP SC esta realizando. Dessa vez o evento será aqui em Blumenau, contando sempre é claro com boas palestras. Como é normal da nossa comunidade sempre realizamos dois eventos por semestre, um focado mais em Administração e Infraestrutura e o outro com o foco mais em Desenvolvimento. Nesse segundo evento será mais voltado então para Desenvolvimento e claro vamos contar com uma palestra de Infra para alegrar todos os povos.. Alegre

Mas qual a novidade desse evento?
A novidade é que dessa vez eu também estarei palestrando, e claro sempre focado em melhores praticas para desenvolvedores, assim como tentei no webcast que fiz. Aprendi muito com aquele webcast realizado e agora vamos falar sobre mais 5 lições sobre SQL Server para desenvolvedores.

Sem mais delongas, para acessar a pagina do evento clique aqui. Nesse proprio link terá também o link para a inscrição no Technet.

Aqui está a bio da minha palestra.

5 lições sobre SQL Server para desenvolvedores

Essa seção irá mostrar 5 passos que levarão o desenvolvedor autilizar as melhores praticas do SQL Server no ambiente de desenvolvimento. Se você acha que seu codigo é bom, espere até assistir essa seção e você verá que os mínimos detalhes fazem a diferença e acabe com a famosa frase “Mas no meu ambiente é rapido”.
Palestrante: Marcos Freccia

Além dessa, teremos também outras otimas palestras que vocês podem conferir acessando o site da comunidade e claro nao deixem de participar.

A comunidade MCITP SC agradece a compreensão de todos.

Marcos Freccia
MCTS SQL Server 2008 Implementation and Maintenance
MCTS SQL Server 2008 Database Development
@SqlFreccia

Scritps do dia a dia: Meu backup executou?

Ola pessoal, estou fazendo esse post apenas para compartilhar um script que utilizo na verificação dos meus jobs de backup. Então quem sabe ele possa ser util para você também.

select job.name as nome,
description as descricao,
cast(isnull(NULLIF(SUBSTRING(cast(last_run_date as varchar(50)),1,4),’0′) +’-‘+
SUBSTRING(cast(last_run_date as varchar(50)),5,2) + ‘-‘+
SUBSTRING(cast(last_run_date as varchar(50)),7,2),’2999-12-31′) as datetime) as UltimaExecucao,
Status =
case when cast(last_run_outcome as varchar(10)) = 0 then ‘Falhou’
     when cast(last_run_outcome as varchar(10)) = 1 then ‘Completou com sucesso’
     when cast(last_run_outcome as varchar(10))= 3 then ‘Cancelado’
     when CAST(last_run_outcome as varchar(15)) = 5 then ‘Nunca utilizado’
else cast(‘Desconhecido’ as varchar(15))
end
from msdb.dbo.sysjobs as job
left outer join msdb.dbo.sysjobservers as jobServer
on job.job_id = jobServer.job_id
where job.name <> (‘syspolicy_purge_history’)
order by nome

E se vocês querem salvar o historico, podem criar uma tabela também como essa:

create table dbo.LastJobs (JobName varchar(125) not null,
descricao varchar (512) not null, ultimaExecucao datetime not null,
[Status] varchar(50) not null)

Ai o resto vocês podem imaginar, manda por e-mail, publica no reporting services, ou seja, podem fazer N coisas com esse script.

Espero que vocês tenham gostado.

Marcos Freccia
MCTS SQL Server 2008 Implementation and Maintenance
MCTS SQL Server 2008 Database Development
@SqlFreccia

Será um BUG de Update no SQL Server?

Ola Pessoal,

Garanto que o titulo desse post chamou a atenção de vocês, por isso estão aqui lendo Alegre. Nesse final de final de semana estive fazendo curso de SQL Server, e um dos capitulos do curso era sobre segurança onde trabalhavamos com logins, users, roles, server-role, Database Principals e por ai vai.. Mais o que me chamou a atenção nesse assunto foi que uma pergunta de um dos alunos que era mais ou menos assim: Se eu der a permissão para o meu user na database de db_datawriter ele poderá realizar insert, delete e update? No momento foi respondido que sim, o usuario podera realizar esses três comandos DDL’s. Agora pessoal o que eu pergunto pra voces é o seguinte: Só com essa role de database (db_datawriter) eu consigo realizar essas três ações?

Read the rest of this entry

The ReportServerVirtualDirectory element is missing

Pessoal,

Esse erro acontece quando tentamos acessar o diretorio \Reports no Browser, assim não aparecia a pagina principal mas sim uma tela com esse erro. Como resolver isso?

A dica é bem simples, basta você ir no diretorio diretorio onde está instalado o Reporting Services e acessar a seguinte pasta: Reporting Services\ReportManager.  Dentro dessa pasta existe um arquivo chamado RSWebApplication.config como vocês podem ver na figura abaixo.

Imagem1

Dentro desse arquivo existe a tag <ReportServerVirtualDirectory></ReportServerVirtualDirectory>. Se você encontrar essa tag vazia ai está o problema, basta você adicionar o valor ReportServer, salvar o valor e por via das duvidas reinicie o serviço do Reporting Services.

Importante: Essa dica vale para o SQL Server 2005, no SQL Server 2008 você deve voltar uma pasta e entrar na pasta ReportServer e acessar o arquivo rsreportserver.config que a mesma propriedade estará contida nesse arquivo também.

Imagem2

Pessoal espero que vocês tenham gostado dessa dica.

Marcos Freccia
@SQLFreccia
MCTS SQL Server 2008

Guardando o histórico de uso dos índices

Olá Pessoal,

Hoje vou colocar aqui umas das consultas que utilizo bastante nos clientes quando preciso de um histórico de utilização dos índices e a quantidade de utilização de scans, seeks e lookups já realizados.

Primeiramente precisamos de uma tabela onde vamos salvar estes históricos, então vamos criá-lá.

CREATE TABLE dbo.Historico_Uso_Indices(
Database varchar(128) NOT NULL,
table_name varchar(100) NOT NULL,
user_seeks int NULL,
user_scans int NULL,
user_lookups int NULL,
TOTAL_LEITURAS int NOT NULL,
last_user_seek datetime  NULL,
last_user_scan datetime  NULL,
last_user_lookup datetime  NULL,
NOME_INDEX varchar(100) NOT NULL,
DATA_REGISTRO datetime NOT NULL)

Temos a nossa tabela criada o proximo passo é criar a consulta que irá popular essa tabela. A DMV principal aqui será a sys.dm_db_index_usage_stats. Segundo BOL a definição desta DMV é:

Returns counts of different types of index operations and the time each type of operation was last performed.

Como viram a intenção aqui é retornar alguns contadores referentes aos índices do meu banco de dados. Juntamente com essa DMV, foram utilizadas também algumas outras DMV’s somente para deixar mais claro o que eram determinadas informações. Abaixo segue então o segundo passo do nosso script.

insert into Historico_Uso_Indices
select
DB_NAME(database_id) as DB, ob.name as TABLE_NAME,
user_seeks,user_scans,user_lookups,(user_seeks+user_scans+user_lookups) as TOTAL_LEITURAS,
last_user_seek,last_user_scan,last_user_lookup,sx.name as NOME_INDEX,GETDATE() AS DATA_REGISTRO
from sys.dm_db_index_usage_stats as st
join sys.indexes as sx
on st.object_id = sx.object_id and st.index_id = sx.index_id
join sys.objects as ob
on sx.object_id = ob.object_id
where DB_NAME(database_id) not in (‘ReportServerTempDB’,’ReportServer’)
and database_id = DB_ID() — Remova esta linha para pegar de todas as bases de dados da instancia

Como vocês podem ver, ja estou inserindo as informações recuperadas apartir dessa minha consulta. Se desejarem pegar esses dados de todas as bases da instancia então é só retirar a ultima linha do script.

No final disso tudo existe uma terçeira consulta onde ela faz algumas validações, para me retornar aquilo que eu realmente preciso, que são as quantidades de scans, seeks e lookups realizados em X dias.

select a.[Database],a.table_name,a.NOME_INDEX,
DATEDIFF(DAY,a.DATA_REGISTRO,b.DATA_REGISTRO ) as Intervalo_Dias,
SUM((b.user_scans – a.user_scans)) as Diff_Scan,
SUM((b.user_lookups – a.user_lookups)) as Diff_Lookup,
SUM((b.user_seeks – a.user_seeks)) as Diff_Seek
from Historico_Uso_Indices as a
join Historico_Uso_Indices as b
on a.[Database] = b.[Database]
and a.table_name = b.table_name
and a.NOME_INDEX = b.NOME_INDEX
and a.user_seeks < b.user_seeks
and a.user_lookups < b.user_lookups
and a.user_scans < b.user_scans
group by a.[Database],a.table_name,a.NOME_INDEX,
DATEDIFF(DAY,a.DATA_REGISTRO,b.DATA_REGISTRO);

Digamos que eu executei o segundo script ontem (28/09), e hoje eu executei novamente a terceira consulta vai me retornar a diferença de acessos do tipo scans, seeks e lookups entre esse dia. Essa informação é bem valiosa para mim, pois eu consigo identificar quais foram os índices mais acessados, e quais os métodos de pesquisa foram os mais realizados.

Se você quiser, você ainda pode realizar essa consulta:

select database,table_name, nome_index, total_leituras from Historico_Uso_Indice
order by total_leituras desc

E analisar quais foram os índices mais acessados do seu banco de dados.

Abaixo segue uma imagem do resultado a consulta do terceiro script.

Imagem02

 

Pessoal por hoje é isso, espero que seja esses scripts sejam úteis para vocês também.

Marcos Freccia
@SQLFreccia
MCTS SQL Server 2008

Dica do Dia: Lista de Servidores SQL Server

Pessoal,

Apenas uma dica do dia: Ontem precisava acessar uma instancia do SQL Server, porem eu nao tinha o management studio instalado, bom qual recurso a ser usado? Acertou quem disse sqlcmd. Como eu não sabia o nome da instancia um comando do sqlcmd me ajudou muito o sqlcmd /L ou -L. Esse comando te retorna  uma lista dos servidores de SQL Server que ele encontrar na rede, a partir dai é só correr pro abraço. Abaixo segue uma imagem de como é retornado a lista para o usuario

Obs: Com powershell também existe uma solução bem legal, porem como eu nao sou expert nao consegui fazer. 😦

Até mais,
Marcos Freccia
MCTS SQL Server 2008
@SQLFreccia

Backup no banco de dados

Nessa segunda postagem venho aqui mostrar um pouco sobre o banco de dados SQL SERVER 2005, e para esse primeiro assunto nada mais justo do que se falar de algo tão importante como um backup, onde podemos através dessa forma garantir que por algum problema não percamos dados. Abaixo vou mostrar os tipos de backups existentes para o SQL SERVER 2005.

Backup Full: Têm como propósito realizar o backup todos os dados armazenados em um banco. Este tipo de backup leva todas as características e atributos do objeto do banco de dados.Quais são os passos que o database engine realiza para garantir o sucesso do backup.

1) O database engine trava o banco de dados.

2) O acesso ao mesmo é proibido.

3) É estabelecida uma marca no log de transação onde indica que ali foi o ponto de inicio do backup.

4) Libera o banco de dados do lock.

5) É realizado backup de todas as paginas de dados.

6) Trava o banco novamente não deixando nenhuma conexão ser feita.

7) Estabelece uma marca no log de transação.

8) Libera o banco do lock, e extrai e libera todas as transações existentes entre as duas marcas e adiciona o intervalo ao backup.

Backup Diferencial: Captura todas as modificações que tenham ocorrido desde o ultimo backup full, o maior propósito de um backup diferencial é reduzir o numero de transactions log’s backups que precisam ser restaurados em um processo de restore. O backup diferencial não é um backup incremental. Pois um backup incremental captura qualquer modificação que tenha ocorrido desde o ultimo backup incremental. Logo para realizar um restore de um backup incremental precisa apenas de todos os backups incrementais. Um restore desse tipo de backup é feito da seguinte maneira: recupera-se o backup full, e por seguida todos os backups diferenciais até a data que se deseja.

Backup de Log de Transação: Pode ser realizado somente em bancos que foram setados o modo de recovery para FULL ou BULK e que não tenham sofrido um mínimo de log’s transactions, só pode ser executado depois de um backup full. Esse backup grava só o que é obtido a partir do LSN. LSN (Log Sequence Number ), esse log é setado na execução do backup anterior, é uma marca que tem no arquivo de log onde me diz até a onde o backup anterior foi gravado. Significa que a partir dessa marca eu não tenho nenhum backup realizado. O restore desse método serve para que você possa restaurar o banco de dados a partir de um determinado ponto ou a partir de uma determinada hora. O restore de log pode ser aplicado dentro de um backup full ou ainda de um backup diferencial.

Backup de Filegroup: Esse backup é uma alternativa na estratégia de backup, ao invés de executar um backup de toda a base, você pode executar o backup de um único Filegroup, como podemos realizar o backup de partes do banco de dados, o recovery model precisa estar setado para FULL RECOVERY ou BULK RECOVERY.

Backup Espelho (mirrored): Consiste em duplicar o backup, ou seja, criar cópias adicionais do backup realizadas no local diferente que você esta realizando no primeiro backup. Como ter apenas um backup pode ser considerado um ponto de falha, o SQL SERVER 2005 inseriu a clausula no backup chamado de “MIRROR TO” lembrando que esse tipo de backup não esta disponível para o SQL SERVER Express, podemos também criar até quatro espelhos do backup. O único ponto a ser levado em consideração é que o lugar onde você precisa fazer o backup (fita, disco) precisa ser o mesmo dos espelhos.

Backup parcial: Esse tipo de backup é uma nova funcionalidade que foi inserida no SQL SERVER 2005, nas versões anteriores se tivéssemos filegroups que fossem read-only o backup continha esse arquivo dentro também. Já no SQL SERVER 2005 com a inserção da clausula “READY_WRITE_FILEGROUP” esse filegroup passa não ser mais backupeado, e assim nós diminuímos o tempo de backup e a quantidade de fitas usadas, fazendo assim que o backup engine se preocupe apenas com o que foi modificado. Para esse processo, o restore também é uma nova funcionalidade do SQL SERVER 2005, que permite que quando executamos um restore, o restante do database fique disponível, esse processo tira proveito dos filegroups exceto filegroup primário que possui um status independente do database. Outro processo de restore que não é muito comum é o de restaurar paginas corrompida. Em versões anteriores do SQL SERVER o corrompimento de uma pagina causava um erro no servidor e poderia deixar a base inteira como OFFLINE. No SQL SERVER 2005 criou-se um processo alternativo para a execução que é o PAGE_VERIFY_CHECKSUM, depois de habilitar a verificação no banco de dados através desse comando, qualquer pagina que se corrompa é colocada em quarentena, porem essa opção vem desabilitada por default, pois gera um overhead no servidor apesar de pequeno. Cada vez em que uma pagina precisa ser lida ou escrita no SQL SERVER 2005 o próprio SQL calcula um CHECKSUM para a pagina, se o CHECKSUM calculado não for igual ao anterior a pagina de dados esta corrompida e transação nesse caso sofre um rollback. O SQL SERVER 2005 tem uma opção de restore que mesmo que a fita do backup apresente erros em suas trilhas o restore é continuado, fazemos isso através do comando “WITH CONTINUE_AFTER_ERROR”, porem o SQL SERVER não garante que esses arquivos poderão ser usados futuramente. Outra opção que podemos utilizar para verificar se os nossos backups estão corretos, para isso o SQL SERVER prove o comando “RESTORE VERIFYONLY FROM caminho do arquivo”.

Aqui termina minha primeira postagem, espero que o conteúdo da mesma possa ser utilizado por você no seu dia a dia.