Restaurando um banco apenas com o .mdf

Surgiu uma solicitação para eu restaurar um banco. Até aí, tudo ok, é um processo normal. RESTORE DATABASE Blábláblá, permissões dadas e assunto encerrado.
Ao ver o arquivo, havia apenas um .mdf. Ou seja, não é mais um restore, é um ATTACH. Seria outro processo normal também… Se existissem os arquivos de log (.ldf).

Ao tentar restaurar, o seguinte erro surgiu:

File activation failure. The physical file name “C:\Caminho\Original\do\banco\arquivo_log.LDF” may be incorrect.

The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.

Mas vamos lá, passo a passo, para vermos os problemas que podem aparecer e como resolver.

Primeiro, vamos rodar o comando básico para anexar (não consigo gostar da palavra atachar) o banco

Os mesmo erro para os dois casos. Bom, vamos tentar uma outra forma:

  1. Criar um banco com o mesmo nome, mas com arquivos fake;
  2. Deixá-lo offline;
  3. Mudar o caminho dos arquivos, apontando para o mdf de origem;
  4. Passar o banco para modo online.

É, não… não funcionou. Terminamos por aqui e pedimos um .bak? Seria fácil, but not yet, dear Padawan

Repare que o banco está restaurado, mas com o status Recovery Pending.

Vamos então colocar ele em modo Single User e vamos rodar um DBCC CHECKDB para ver o que acontece.

Legal, a mensagem já mudou…Mas como o log estava em um caminho diferente e a pasta não existe, o log não é criado.

Então vamos lá: Criamos a pasta e mais um teste…

recover_nolog

Belezinha, tudo certo! Log recriado e banco no ar. Mas, veja, ainda na pasta de origem.

Para ajustar, faça a movimentação do log criado e está resolvido.

Abraços!

PS: Nos meus testes, eu notei que ao realizar o processo em uma instância maior do que a de origem (eu estava usando a versão 2016 CTP ainda, e o banco era 2014), eu não conseguia, pois ele exigia o upgrade do banco. Como tinha uma instância na mesma versão, não fui a fundo, mas fica a dica desde já….

Fonte: http://www.sqlskills.com/blogs/paul/checkdb-from-every-angle-emergency-mode-repair-the-very-very-last-resort/

Deixe uma resposta