Casos do Dia a Dia – DROP DATABASE com status OFFLINE

Olá serumaninhos,

O post de hoje será uma dica simples sobre uma dúvida bem comum para quem está iniciando no mundo do banco de dados ou não tem muita experiência com as tarefas de um DBA.

“Luiz, eu executei um DROP DATABASE, mas os arquivos não foram excluídos do disco!!! Isso é um bug do SQL Server???”

Calma jovem gafanhoto, vou explicar em que situação isso pode acontecer. #gogogo


Juninho – O Estagiário:

Juninho é o novo estagiário no setor de banco de dados e recebeu uma solicitação para excluir uma database chamada “BASE_CLIENTES_OLD” que ocupava 200 GB (dados e log) no disco e estava com o status “OFFLINE” já há alguns meses e sem uso.

Você também pode validar o status da database com o script abaixo:

“Moleza essa Luiz, mais fácil que tirar doce de criança!!!”

Com isso, Juninho executou o comando abaixo, mas para sua surpresa os arquivos físicos da database NÃO foram excluídos.

OBS: Aqui simulei o comportamento com uma base menor.

“Uai Luiz, o DROP DATABASE não exclui os arquivos físicos também? Não estou entendendo mais nada, vou passar no RH!”

Espera Juninho! A explicação é a seguinte:

 “Dropping a Database

System databases cannot be dropped.

Dropping a database deletes the database from an instance of SQL Server and deletes the physical disk files used by the database. If the database or any one of its files is OFFLINE when it is dropped, the disk files are not deleted. These files can be deleted manually by using Windows Explorer. To remove a database from the current server without deleting the files from the file system, use sp_detach_db.”

Referência: https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/ms178613(v=sql.100)?redirectedfrom=MSDN

Ou seja, se algum dos arquivos da database estiver OFFLINE quando ela for dropada, os arquivos físicos NÃO serão excluídos automaticamente e você vai precisar ir na pasta para excluir de forma manual.

“Huuuuum Luiz, agora eu entendii! Era só ter pesquisado uns 10 minutos no GOOGLE que eu iria descobrir isso!”

Pois é, infelizmente ainda existem muitos profissionais preguiçosos/inexperientes que não se dão ao trabalho de fazer uma pesquisa rápida para tentar entender o problema. Eles já procuram ajuda direto nos grupos da comunidade para alguém dar a solução de uma forma mais rápida. Isso é ruim para a evolução desse profissional. Não seja esse cara!!! #ficaadica


Observações IMPORTANTES – ANTES de excluir uma database:

  • Verifique se essa database precisa de backup ou não (pergunte para os responsáveis por essa database). Normalmente bases de teste/homologação não precisam de backup. Uma vez que a database for excluída e não tiver backup, não será possível recuperar os dados e isso pode ser muito grave, CUIDADO!!!
  • NÃO é possível fazer backup de uma database que está com o status OFFLINE. Primeiro você precisa deixar ela ONLINE para depois executar o backup.
  • Se for possível, deixe a database OFFLINE ou faça um DETACH e mantenha os arquivos físicos da database no disco por alguns dias. Pode ser que tenham informado a database incorreta na solicitação e dessa forma você conseguiria deixar ela ONLINE novamente de uma forma mais rápida.
  • ANTES de executar o DROP DATABASE, valide se o backup foi copiado para um local seguro (de preferência em outro servidor ou até na nuvem);
  • ANTES de executar o DROP DATABASE, valide se você está na instância correta! Não é muito raro alguém excluir uma database da produção pensando que estava conectado na instância de teste/homologação. Você pode validar a instância da query atual na parte inferior à direita do SSMS (SQL Server Management Studio), conforme o exemplo abaixo:

Backup Database OFFLINE

Se você tentar executar o backup com a database OFFLINE, será gerado o erro abaixo:

Visto isso, primeiro altere a database para READ_ONLY (para não sofrer alterações) e ONLINE.

Agora sim você consegue executar o backup e depois excluir a database.


Conclusão:

Como podemos perceber, excluir uma database parece ser uma tarefa bem simples, mas se não tomarmos as devidas precauções podemos fazer um estrago bem grande e perder dados de forma definitiva (e até o emprego, visshhh)!

Seja um profissional diferenciado dos demais, entenda a solicitação por completo, questione e valide com o solicitante e sempre FAÇA BACKUP (sempre que possível) antes de excluir alguma database!


Download “Casos do Dia a Dia – DROP DATABASE com status OFFLINE”:

Segue abaixo o link para DOWNLOAD do script utilizado nesse post:

https://github.com/luizvitorf/SQLServer/blob/master/Scripts/Administra%C3%A7%C3%A3o/Script%20Drop%20Database%20OFFLINE.sql


Referências:

Segue abaixo alguns links que foram utilizados como referência:

https://www.brentozar.com/archive/2015/02/dropping-offline-database-sql-server/

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/ms178613(v=sql.100)?redirectedfrom=MSDN

https://docs.microsoft.com/en-us/sql/relational-databases/databases/detach-a-database?view=sql-server-ver15


Espero que tenha gostado e que isso também possa ser útil no seu dia a dia. Até o próximo post!

Me siga no LinkedIn e YouTube para ficar por dentro das novidades.

Abraço,

Luiz Vitor França Lima

Consultor SQL Server

2 comentários em “Casos do Dia a Dia – DROP DATABASE com status OFFLINE

  1. Bianca Responder

    Excelente artigo Luiz, fiquei surpresa ao saber que os arquivos da base não são removidos ai excluir a base com status offline. Obrigada!

    • Luiz Lima Autor do postResponder

      Oi Bia, fico feliz que tenha gostado do post! Precisamos ficar bem atentos, pois o SQL Server possui muitos detalhes e às vezes podem passar despercebidos.

      Abraço,
      Luiz Vitor

Deixe uma resposta