it-swarm-pt.com

SQL Server: banco de dados preso no estado "Restaurando"

Eu fiz backup de um banco de dados:

BACKUP DATABASE MyDatabase
TO DISK = 'MyDatabase.bak'
WITH INIT --overwrite existing

E então tentei restaurá-lo:

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE --force restore over specified database

E agora o banco de dados está preso no estado de restauração.

Algumas pessoas teorizaram que é porque não havia arquivo de log no backup e ele precisava ser avançado usando:

RESTORE DATABASE MyDatabase
WITH RECOVERY 

Exceto que, claro, falha:

Msg 4333, Level 16, State 1, Line 1
The database cannot be recovered because the log was not restored.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

E exatamente o que você quer em uma situação catastrófica é uma restauração que não funciona.


O backup contém um arquivo de dados e log:

RESTORE FILELISTONLY 
FROM DISK = 'MyDatabase.bak'

Logical Name    PhysicalName
=============   ===============
MyDatabase    C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase.mdf
MyDatabase_log  C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase_log.LDF
514
Ian Boyd

Você precisa usar a opção WITH RECOVERY, com o comando RESTORE do banco de dados, para colocar seu banco de dados online como parte do processo de restauração.

Isto é claro, apenas se você não pretende restaurar quaisquer backups de log de transações, ou seja, você só deseja restaurar um backup de banco de dados e, em seguida, ser capaz de acessar o banco de dados.

Seu comando deve ficar assim,

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE,RECOVERY

Você pode ter mais sucesso usando o assistente de restauração do banco de dados no SQL Server Management Studio. Dessa forma, você pode selecionar os locais de arquivos específicos, a opção de substituição e a opção WITH Recovery.

409
John Sansom

Eu tive esta situação restaurando um banco de dados para uma instância do SQL Server 2005 Standard Edition usando o Symantec Backup Exec 11d. Depois que o trabalho de restauração foi concluído, o banco de dados permaneceu no estado "Restaurando". Não tive problemas de espaço em disco - o banco de dados simplesmente não saiu do estado "Restaurando". 

Executei a consulta a seguir com relação à instância do SQL Server e descobri que o banco de dados tornou-se imediatamente utilizável:

RESTORE DATABASE <database name> WITH RECOVERY
622
Evan Anderson

Veja como você faz isso:

  1. Pare o serviço (MSSQLSERVER);
  2. Renomeie ou exclua os arquivos de banco de dados e de log (C:\Arquivos de Programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data ...) ou onde quer que você tenha os arquivos;
  3. Inicie o serviço (MSSQLSERVER);
  4. Exclua o banco de dados com problema;
  5. Restaure o banco de dados novamente.

Boa sorte!

94
Tipu Delacablu

Eu tive um incidente semelhante ao parar um servidor secundário de envio de logs. Após o comando para remover o servidor do envio de logs e interromper o envio de logs do servidor primário, o banco de dados no servidor secundário ficou preso ao restaurar o status após o comando

RESTORE DATABASE <database name> WITH RECOVERY

As mensagens do banco de dados:

RESTORE DATABASE processou com sucesso 0 páginas em 18,530 segundos (0,000 MB/seg).

O banco de dados pode ser usado novamente após esses 18 segundos.

80
Hans

Eu tive um problema semelhante com a restauração usando o SQL Management Studio. Eu tentei restaurar um backup do banco de dados para um novo com um nome diferente. No começo, isso falhou e depois de consertar os nomes dos arquivos do novo banco de dados, ele foi executado com sucesso - em qualquer caso, o problema que estou descrevendo ocorreu novamente, mesmo que eu acerte desde a primeira vez. Assim, após a restauração, o banco de dados original permaneceu com um (restaurando ...) ao lado de seu nome. Considerando as respostas do fórum acima (Bhusan's) tentei rodar no editor de consultas do lado a seguir:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

que resolveu o problema. Eu estava tendo problemas no início por causa do nome do banco de dados que continha caracteres especiais. Eu resolvi isso adicionando aspas duplas - aspas simples não funcionariam dando um erro "Sintaxe incorreta próxima ...".

Esta foi a solução mínima que eu tentei resolver esse problema (banco de dados preso no estado de restauração) e espero que ele possa ser aplicado a mais casos.

67
Demetris Leptos

OK, eu tenho problema semelhante e exatamente como foi no caso de Pauk, foi causado pelo servidor a ficar sem espaço em disco durante a restauração e assim causou um estado de restauração permanente. Como terminar este estado sem parar o SQL Serviços de servidor? 

Eu encontrei uma solução :)

Drop database *dbname*
33
Marko

A opção WITH RECOVERY é usada por padrão quando os comandos RESTORE DATABASE/RESTORE LOG são executados. Se você estiver preso no processo de "restauração", poderá recuperar um banco de dados para o estado on-line executando:

RESTORE DATABASE YourDB WITH RECOVERY
GO

Se houver necessidade de restauração de vários arquivos, os comandos da CLI exigirão WITH NORECOVERY e WITH RECOVERY, respectivamente - somente o último arquivo no comando deverá ter WITH RECOVERY para retornar o banco de dados on-line:

RESTORE DATABASE YourDB FROM DISK = 'Z:\YourDB.bak'
WITH NORECOVERY
GO
RESTORE LOG YourDB FROM DISK = 'Z:\YourDB.trn'
WITH RECOVERY
GO

Você também pode usar o assistente do SQL Server Management Studio:

enter image description here

Há também um processo de restauração virtual, mas você terá que usar soluções de terceiros. Normalmente você pode usar um backup de banco de dados como banco de dados online ao vivo. O ApexSQL e o Idera possuem suas próprias soluções. Revisão por SQL Hammer sobre o ApexSQL Restore . A restauração virtual é uma boa solução se você estiver lidando com um grande número de backups. O processo de restauração é muito mais rápido e também pode economizar muito espaço na unidade de disco. Você pode dar uma olhada em infográfico aqui para alguma comparação.

29
Marko Krstic

Isso pode ser bastante óbvio, mas me atrapalhou agora: 

Se você estiver realizando um backup do log final, esse problema também pode ser causado por ter essa opção marcada no assistente Restauração do SSMS - "Deixar o banco de dados de origem no estado de restauração (WITH NORECOVERY)" 

enter image description here

23
TrailJon

Eu descobri o porquê.

Se o cliente que emitiu o comando RESTORE DATABASE desconectar durante a restauração, a restauração será interrompida.

É estranho que o servidor, quando instruído a restaurar um banco de dados por uma conexão de cliente, não termine a restauração a menos que o cliente permaneça conectado o tempo todo.

15
Ian Boyd

este fez um trabalho:

http://social.msdn.Microsoft.com/Forums/en/sqldatabaseengine/thread/8dd1b91d-3e14-4486-abe6-e3a550bfe457

Eu tive uma situação em que meu banco de dados mostrava o estado de restauração e não pude executar nenhuma consulta e não consegui me conectar com nosso software.

O que eu fiz para sair dessa situação é:

  1. Pare todos os serviços relacionados a SQL dos serviços do Windows.

  2. Eu abri a pasta DATA onde os arquivos Ldf e Mdf residem no diretório SQL, normalmente é como: "C:\Arquivos de Programas ***********\MSSQL\DATA

  3. Depois copiei os arquivos Ldf e Mdf do banco de dados: [Nome do banco de dados] .mdf e [nome do banco de dados] _log.ldf

Eu copiei esses dois arquivos para outra pasta.

  1. Em seguida, iniciei todos os serviços relacionados ao SQL (na etapa 1) novamente nos serviços do Windows.

  2. Iniciei meu estúdio de gerenciamento MS SQL com login normal.

  3. Clique com o botão direito do mouse no banco de dados culpado e pressione DELETE (para excluir o banco de dados).

  4. Todos os arquivos LDF e MDF relacionados a este banco de dados passaram da pasta DATA (mencionada na etapa 2).

  5. Criado um novo banco de dados com o mesmo nome (mesmo nome do que eu deletei no passo 6 - o banco de dados culpado).

  6. Em seguida, [nome do banco de dados] -> clique com o botão direito -> tarefas -> Colocar off-line.

  7. Em seguida, copiei os dois arquivos (da etapa 3) de volta para a pasta DATA (etapa 2).

  8. [nome do banco de dados] -> clique com o botão direito -> tarefas -> Colocar on-line.

9
Ameen Abuhilal

Eu tive um . no meu nome do banco de dados, ea consulta não funcionou por causa disso (dizendo sintaxe incorreta perto de '.') Então percebi que eu preciso de um suporte para o nome:

RESTORE DATABASE [My.DB.Name] WITH RECOVERY
5
Ashkan Sirous

No meu caso, era suficiente para soltar o banco de dados que estava pendurado no estado "Restaurando ..." com o comando SQL 

 drop database <dbname> 

em uma janela de consulta. 

Então eu cliquei com o botão direito do mouse em Bancos de dados e selecionei Refresh que removeu a entrada no Management Studio. Depois eu fiz uma nova restauração que funcionou bem (note que trazê-lo offline não funcionou, uma reinicialização do serviço SQL não funcionou, uma reinicialização do servidor não funcionou tão bem).

4
Matt

Por padrão, todo RESTORE DATABASE vem com RECOVERY configurado. As opções 'NORECOVERY', basicamente dizem ao SQL Server que o banco de dados está esperando por mais arquivos de restauração (pode ser um arquivoDIFFeLOGe pode incluir arquivo de backup do final do log, se possível). As opções de 'RECUPERAÇÃO', concluem todas as transações e deixam o banco de dados pronto para executar transações.

Assim: 

  1. se seu banco de dados estiver configurado comSIMPLErecovery model, você poderá executar apenas uma opçãoFULLrestore com NORECOVERY, quando tiver umDIFFbackup. NenhumLOGbackup é permitido no banco de dados do modeloSIMPLErecovery. 
  2. Caso contrário, se seu banco de dados estiver configurado comFULLou BULK-LOGGED recovery model, você pode executar umFULLrestore seguido por NORECOVERYoption, então execute umDIFFseguido por NORECOVERY, e, finalmente, executeLOGrestore com a opção RECOVERY

Lembre-se, A ÚLTIMA RESTAURAÇÃO QUERY DEVE TER RECOVERY OPTION . Pode ser uma maneira explícita ou não. Em therms de T-SQL, a situação: 

  1. USE [master] GO RESTORE DATABASE Database_name FROM DISK = N'\\path_of_backup_file.bak WITH FILE = 1, [REPLACE],NOUNLOAD, RECOVERY -- This option could be omitted. GO 

A opção WITH REPLACE deve ser usada com cuidado, pois pode levar à perda de dados

Ou, se você executar um backup COMPLETO e DIFF, poderá usar este

USE [master]
GO
RESTORE DATABASE Database_name
  FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, 
   NOUNLOAD,NORECOVERY
GO
RESTORE DATABASE Database_name
  FROM DISK =N'\\path_of_**diff**backup_file.bak' WITH FILE = 1, 
 NOUNLOAD, RECOVERY
GO
  1. USE [master] GO -- Perform a Tail-Log backup, if possible. BACKUP LOG Database_name GO -- Restoring a FULL backup RESTORE DATABASE Database_name FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, NOUNLOAD,NORECOVERY GO -- Restore the last DIFF backup RESTORE DATABASE Database_name FROM DISK = N'\\path_of_DIFF_backup_file.bak' WITH FILE = 1, NORECOVERY,NOUNLOAD GO -- Restore a Log backup RESTORE LOG Database_name FROM DISK = N'path_of_LOG_backup_file.trn' WITH FILE = 2, RECOVERY, NOUNLOAD GO

Naturalmente, você pode executar uma restauração com a opção STATS = 10 que informa ao SQL Server para informar cada 10% concluído. 

Se preferir, você pode observar o processo ou restaurar a consulta em tempo real. Como segue:

USE[master]
GO
SELECT session_id AS SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time 
    FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a 
        WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
GO

Espero que esta ajuda.

3
BMDaemon

Eu tive esse problema quando eu também recebi um erro TCP no log de eventos ... 

Largar o banco de dados com o SQL ou clique com o botão direito no gerenciador "delete" E restaure novamente.

Eu comecei a fazer isso por padrão. Script o DB drop, recriar e depois restaurar.

3
ZeusT

Também pode haver problema ao excluir um banco de dados bloqueado se a captura instantânea estiver ativada. Para mim isso funcionou:

  1. Primeiro eu segui Tipu Delacablu steps (leia alguns posts)
  2. execute o comando: solte o banco de dados [seu banco de dados], que lhe dará um erro informando o nome do banco de dados de captura instantânea
  3. execute o comando: solte o banco de dados [banco de dados de instantâneos] e, em seguida, execute o comando na etapa 2 novamente.
2
Martin

Você já tentou executar um VERIFICAR SOMENTE? Só para ter certeza que é um backup de som.

http://msdn.Microsoft.com/pt-br/library/ms188902.aspx

1
Sam

Grande discussão. O erro mais comum que o máximo de usuários faz é restaurar o banco de dados com opção de recuperação com vários backups. Isso torna o banco de dados no estado RESTAURAÇÃO.

Se você estiver fazendo uma recuperação pontual, primeiro vá com a restauração com NoRecovery. Com a última opção de backup, você precisa usar o recurso Restore com Recovery.

Leia reference1 e reference2 sobre backup e restauração. 

0
Sean Smith

Eu tive o mesmo problema ... embora eu não sei porque meu banco de dados experimentou este problema como a minha unidade não estava cheia ... É como se tivesse corrompido ou algo assim. Eu tentei todos os itens acima nenhum deles totalmente trabalhado, eu pensei especialmente que a sugestão para parar o serviço e excluir os arquivos mdf e ldf funcionaria ... mas ainda congelou na restauração?

Acabei resolvendo isso excluindo os arquivos como mencionado, mas em vez de tentar restaurar o banco de dados novamente, copiei os arquivos .mdf e .ldf recentes e os Anexei usando o assistente de Front End Attachment. Alívio, funcionou !! 

Levou FOREVER para copiar os novos arquivos como eu estou usando uma máquina virtual ... para copiar e colar usando a área de transferência demorou uma hora em si, então eu só recomendaria isso como uma última tentativa.

0
Anthony Griggs

Eu tenho o casoMyDbName (Restaurando ...)por causa do limite licenciado do SQL Express.

No arquivo de log, encontrei isto:

CREATE DATABASE ou ALTER DATABASE falhou porque o tamanho cumulativo do banco de dados resultante Teria excederá seu limite de licença de 10240 MB Por banco de dados.

Então, se você está tentando restaurar um banco de dados maior, você precisa alternar seu servidor SQL Express para Developer edition por exemplo.

0
Dmitry Pavlov

Todas as opções baseadas no WITH RECOVERY não funcionaram para mim.

O que foi fazer a restauração completa do Management Studio.

USE [master]
RESTORE DATABASE Sales_SSD
FROM  DISK = N'D:\databaseBackups02\Daily_Sales_20150309_0941.bak' 
WITH  FILE = 1,  
MOVE N'Sales_Data' TO N'C:\Data\SSD\Sales.mdf',  
MOVE N'Sales_Log' TO N'C:\Data\SSD\Sales_1.ldf',  
NOUNLOAD,  REPLACE,  STATS = 5
0
earthling42
  1. Vamos verificar e executar o SQL Agent Service em primeiro lugar.
  2. Usando o seguinte T-SQL:

    SELECT nome do arquivo FROM master.sys.sysaltfiles WHERE dbid = DB_ID ('db_name');

  3. Usando o T-SQL continuamente:

    RESTORE DATABASE FROM DISK = 'DB_path' COM RESTART, REPLACE;

Espero que esta ajuda!

0
Trung Nguyen
RESTORE DATABASE {DatabaseName}
   FROM DISK = '{databasename}.bak'
   WITH REPLACE, RECOVERY
0
Rony Barua

O que consertou para mim foi 

  1. parando a instância 
  2. criando um backup dos arquivos .mdf e .ldf na pasta de dados
  3. Reinicie a instância
  4. excluir o banco de dados preso restaurando
  5. coloque os arquivos .mdf e.ldf de volta na pasta de dados
  6. Anexe a instância aos arquivos .mdf e .ldf
0
ChadJPetersen