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
1 2 3 |
CREATE DATABASE RECOVER_NOLOG ON (FILENAME = N'D:\TEMP\Banco\Teste.mdf') FOR ATTACH |
…
1 2 3 |
CREATE DATABASE RECOVER_NOLOG ON (FILENAME = N'D:\TEMP\Banco\Teste.mdf') FOR ATTACH_REBUILD_LOG |
Os mesmo erro para os dois casos. Bom, vamos tentar uma outra forma:
- Criar um banco com o mesmo nome, mas com arquivos fake;
- Deixá-lo offline;
- Mudar o caminho dos arquivos, apontando para o mdf de origem;
- Passar o banco para modo online.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
USE master GO CREATE DATABASE RECOVER_NOLOG ON ( NAME = N'Recover_Data', FILENAME = N'D:\TEMP\Banco\Teste_fake.mdf' ) LOG ON (NAME = N'Recover_Log', FILENAME = 'D:\TEMP\Banco\Teste_Fake_Log.ldf') GO ALTER DATABASE RECOVER_NOLOG SET OFFLINE WITH ROLLBACK IMMEDIATE GO ALTER DATABASE RECOVER_NOLOG MODIFY FILE(NAME='Recover_Data', FILENAME= 'D:\TEMP\Banco\Teste.mdf') ALTER DATABASE RECOVER_NOLOG MODIFY FILE(NAME='Recover_Log', FILENAME= 'D:\TEMP\Banco\Teste_Log.ldf') GO ALTER DATABASE RECOVER_NOLOG SET ONLINE GO |
É, 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.
1 2 3 4 5 6 7 8 9 10 11 12 |
USE master GO DBCC TRACEON(3604) -- Vamos jogar a saída do checkdb em tela... GO ALTER DATABASE [RECOVER_NOLOG] SET EMERGENCY GO ALTER DATABASE [RECOVER_NOLOG] SET SINGLE_USER GO DBCC CHECKDB('RECOVER_NOLOG', REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS GO ALTER DATABASE [RECOVER_NOLOG] SET MULTI_USER GO |
1 2 3 4 5 6 7 8 |
Msg 5123, Level 16, State 1, Line 24 CREATE FILE encountered operating system error 3(O sistema não pode encontrar o caminho especificado.) while attempting to open or create the physical file 'Caminho\Gigante\No\C\Do\Servidor\Para\Ajudar\NomeDoLogOriginal_log.LDF'. Msg 5024, Level 16, State 2, Line 24 No entry found for the primary log file in sysfiles1. Could not rebuild the log. Msg 5028, Level 16, State 2, Line 24 The system could not activate enough of the database to rebuild the log. |
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…
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.
1 2 3 4 |
ALTER DATABASE [RECOVER_NOLOG] MODIFY FILE(NAME='RECOVER_Log', FILENAME= 'D:\TEMP\Banco\Teste_Log.ldf') ALTER DATABASE [RECOVER_NOLOG] SET OFFLINE WITH ROLLBACK IMMEDIATE -- Mova o arquivo para a pasta e renomeie o mesmo, se precisar ALTER DATABASE [RECOVER_NOLOG] SET ONLINE |
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/