Casos do Dia a Dia: Servidor sem espaço em disco e SQL Server parado
Olá Pessoal,
Após muito tempo sem postar minhas experiências do dia a dia, vou compartilhar com vocês mais um caso que aconteceu comigo durante uma consultoria.
Cenário: O servidor de banco de dados de um cliente estava com a letra “C:” com ZERO de espaço em disco disponível e com o serviço do SQL Server parado.
Loguei no servidor para analisar o problema e sem pensar muito já transferi alguns arquivos de log do SQL para outra letra desse servidor, já que isso não causa nenhum impacto no banco e libera um pequeno espaço.
Esses logs ficam em:
“C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Log”
Feito isso, liberei 150 MB, mas rapidamente esses 150 MB acabaram porque alguma aplicação estava enchendo um log na letra “C:”.
Como não entendo da aplicação do cliente e só entendo de SQL, continuei minha análise da parte do SQL Server.
Verifiquei que existiam algumas bases na letra “C:”.
Como o serviço do SQL estava parado, movi algumas bases menos críticas para outra letra e liberei 20 GB na letra “C:” do servidor (ele tinha mais de 50 bases no SQL).
Feito isso, o SQL subiu e as principais bases já estavam ONLINE. Com as principais bases online, a aplicação não estava mais gerando erros e a letra “C:” parou de reduzir seu espaço livre.
Contudo, as bases que precisei mover estavam fora, pois o SQL tinha conhecimento que elas estavam em um local, mas eu alterei esse local com o serviço parado. Dessa forma, a base subiu com o Status Recovery Pending.
Fiz uma simulação desse cenário no meu Notebook. Segue como ficou o status da base:
O error log do SQL mostra os erros abaixo:
“Unable to open the physical file “C:\Temp\TesteMovimentacaoBase.mdf”. Operating system error 2: “2(O sistema não pode encontrar o arquivo especificado.)”.”
“FileMgr::StartLogFiles: Operating system error 2(O sistema não pode encontrar o arquivo especificado.) occurred while creating or opening file ‘C:\Temp\TesteMovimentacaoBase_log.ldf’. Diagnose and correct the operating system error, and retry the operation.”
Rodando essa próxima query, conseguimos ver onde o SQL espera que os arquivos dessa base estejam:
select p.name, p.physical_name, p.type_desc from sys.master_files as p
where database_id = db_ID(‘TesteMovimentacaoBase’)
Como eu movi esses arquivos para o caminho “C:\Temp\NovoCaminho\”, tenho que informar isso para o SQL.
Como eu faço isso?
Simples. Basta executar os comandos abaixo:
USE master;
GO
ALTER DATABASE TesteMovimentacaoBase
MODIFY FILE (
NAME = TesteMovimentacaoBase,
FILENAME = ‘C:\Temp\NovoCaminho\TesteMovimentacaoBase.mdf’);
GO
ALTER DATABASE TesteMovimentacaoBase
MODIFY FILE (
NAME = TesteMovimentacaoBase_log,
FILENAME = ‘C:\Temp\NovoCaminho\TesteMovimentacaoBase_log.ldf’);
O SQL retorna essa informação:
The file “TesteMovimentacaoBase” has been modified in the system catalog. The new path will be used the next time the database is started.
The file “TesteMovimentacaoBase_log” has been modified in the system catalog. The new path will be used the next time the database is started.
Após executar o ALTER DATABASE, a base permanece no mesmo status de Recovery Pending.
Como o próprio SQL disse, isso só iria funcionar após a base fosse iniciada. Resolvemos isso com o comando abaixo:
alter database TesteMovimentacaoBase set online
Pronto. Base ONLINE novamente.
Voltando ao caso real, tive que tomar uma decisão rápida para liberar espaço do servidor do cliente e como não sabia se poderia excluir nenhum arquivo do servidor, essa ação de movimentação de algumas bases que nem eram as principais solucionou o problema rapidamente e o SQL já estava no ar em poucos minutos.
Após subir o SQL, o cliente pôde validar com calma o motivo do espaço em disco acabar de forma tão rápida.
Até o próximo caso do dia a dia.
Gostou dessa dica?
Cadastre seu e-mail para receber novos Posts e curta minha Página no Facebook para receber Dicas de Leituras e Eventos sobre SQL Server.
Confira mais experiências do Dia a Dia de um DBA no meu Treinamento de Tarefas do Dia a Dia de um DBA.
Abraços,
Fabrício Lima
MCITP – Database Administrator
Consultor e Instrutor SQL Server
Trabalha com SQL Server desde 2006
Solução simples, mas com alto impacto. Típico caso de NNF durante a instalação do SQL Server, normalmente pelo fato do cliente ou técnico que tenha feito a instalação não conhecer nada de SQL Server.
É isso aí.
Show Fabricio, receita para guardar, um dia vou precisar com toda certeza.
Ótimo artigo, porém o primeiro passo poderia ser rodar um shrink?
Obrigado Débora.
O Serviço do SQL estava parado. Não tinha como rodar um shrink.