Pergunta

Eu recuei um banco de dados:

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

E, em seguida, tentou 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 têm teorizado que é porque não havia nenhum arquivo de log no backup, e precisava ser rolada para frente usando:

RESTORE DATABASE MyDatabase
WITH RECOVERY 

Só que, é claro, não:

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 vai funcionar.


O backup contém um arquivo de dados e de 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
Foi útil?

Solução

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

Este é, naturalmente, apenas se você não pretende restaurar os backups do 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 ser semelhante a este,

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

Você pode ter mais sucesso usando o banco de dados do Assistente de restauração no SQL Server Management Studio. Desta forma, você pode selecionar os locais de arquivo específico, a opção de substituição, ea opção com a recuperação.

Outras dicas

Eu tive esta situação a restauração de um banco de dados para uma instância Standard Edition SQL Server 2005 usando o Symantec Backup Exec 11d. Após a tarefa de restauração completado o banco de dados permaneceu em um estado "Restaurar". Eu não tinha espaço em disco issues-- o banco de dados simplesmente não saiu do estado "Restaurar".

Eu corri a seguinte consulta contra a instância do SQL Server e descobriu que o banco de dados tornou-se imediatamente utilizável:

RESTORE DATABASE <database name> WITH RECOVERY

Veja como fazer isso:

  1. Pare o serviço (MSSQLSERVER);
  2. arquivos
  3. renomear ou excluir o banco de dados e Entrar (C: \ Arquivos de Programas \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data ...) ou onde quer que você tem os arquivos;
  4. Inicie o serviço (MSSQLSERVER);
  5. Exclua o banco de dados com problema;
  6. Restaurar o banco de dados novamente.

Eu tive um incidente semelhante com parada um envio de log do servidor secundário. Após o comando para remover o servidor de envio de log e parou o envio de log do servidor primário do banco de dados no servidor secundário ficou preso em restaurar o estado após o comando

RESTORE DATABASE <database name> WITH RECOVERY

As mensagens de banco de dados:

Restore Database processado com sucesso 0 páginas em 18.530 segundos (0.000 MB / s).

O banco de dados foi utilizável novamente após esses 18 segundos.

Eu tive um problema semelhante com a restauração usando SQL Management Studio. Tentei restaurar um backup do banco de dados para um novo com um nome diferente. No início, este falhou e após a fixação nomes de arquivos do novo banco de dados que foi realizada com sucesso - em qualquer caso, a questão que estou descrevendo re-ocorreu mesmo se eu tenho esse direito 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 (do Bhusan) Eu tentei correr no editor de consulta no lado o seguinte:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

que corrigiu o problema. Eu estava tendo problemas em primeiro lugar por causa do nome do banco de dados que continha caracteres especiais. Eu resolvi isso adicionando aspas duplas ao redor -. Aspas simples não funcionaria dando uma "sintaxe incorreta próximo ..." Erro

Esta foi a solução mínima Tentei resolver este problema (banco de dados preso na restauração do estado) e espero que pode ser aplicado a mais casos.

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

Eu encontrei uma solução:)

Drop database *dbname*
opção

COM RECUPERAÇÃO é usado por padrão quando a restauração de banco de dados / comandos restore log é executado. Se você está preso em "restaurar" processar você pode trazer de volta um banco de dados para o estado on-line através da execução:

RESTORE DATABASE YourDB WITH RECOVERY
GO

Se há uma necessidade de vários arquivos de restauração, comandos CLI requer WITH NORECOVERY e COM RECUPERAÇÃO respectivamente - somente o último arquivo de comando deve ter COM RECUPERAÇÃO para trazer de volta 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ê pode usar o SQL Server Management Studio assistente também:

enter descrição da imagem aqui

Há também processo de restauração virtual, mas você terá que usar soluções 3rd party. Normalmente, você pode usar um backup de banco de dados como banco de dados on-line ao vivo. ApexSQL e Idera tem as suas próprias soluções. Revisão por SQL martelo sobre ApexSQL Restaurar . Virtual restauração é boa solução se você está lidando com um grande número de backups. Restaurar processo é muito mais rápido e também pode salvar um monte de espaço no disco. Você pode dar uma olhada na infográfico aqui para alguma comparação.

Isso pode ser bastante óbvio, mas me tropeçar agora:

Se você está tomando um backup do final do log, este problema pode também ser causado por ter esta opção marcada no SSMS assistente de Restauração - "banco de dados de fonte deixar no estado de restauração (WITH NORECOVERY)"

enter descrição da imagem aqui

Eu descobri o porquê.

Se o cliente que emitiu o comando RESTORE DATABASE desconexões durante a restauração, a restauração será preso.

É estranho que o servidor, quando disse para restaurar um banco de dados por uma conexão de cliente, não vai terminar a restaurar a menos que as estadias cliente conectado o tempo todo.

este fez trabalho:

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

Eu tive uma situação onde meu banco de dados mostrou restaurar estado e eu não poderia executar todas as consultas e não pôde se conectar com o nosso software.

O que eu fiz para sair desta situação é a seguinte:

  1. Pare todos os serviços relacionados SQL de serviços do Windows.

  2. Eu abri a pasta de dados onde os Ldf e MDF arquivos reside no diretório SQL, normalmente é como: "C: \ Program Files *********** \ MSSQL \ DATA

  3. Então eu copiei ambos os arquivos LDF e MDF do banco de dados: [Nome db] mdf e [nome db] _log.ldf

Copiei ambos os arquivos para outra pasta.

  1. Então eu comecei a todos os serviços relacionados SQL (no passo 1) novamente de serviços do Windows.

  2. Começou a meu estúdio MS SQL Management com login normal.

  3. Botão direito do mouse no banco de dados culpado e aperte Delete (excluir o banco de dados em todos).

  4. Todo o LDF e MDF arquivos relacionados a esta base de dados passaram de pasta DATA (mencionado na etapa 2).

  5. Criado um novo banco de dados com o mesmo nome (o mesmo nome do que eu excluído na etapa 6 - Banco de Dados culpado).

  6. Em seguida, [nome do banco] -> clique direito -> tarefas -.> Colocar off-line

  7. Eu, então, copiado ambos os arquivos (do passo 3) de volta para a pasta DATA (etapa 2).

  8. [nome do banco] -> clique direito -> tarefas -.> Bring Online

Eu tinha um. em meu nome de banco de dados, ea consulta não funcionou por causa disso (dizendo sintaxe incorreta próximo '') Então eu percebi que eu preciso de um suporte para o nome:

RESTORE DATABASE [My.DB.Name] WITH RECOVERY

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

 drop database <dbname> 

em uma janela de consulta.

Então eu cliquei com o botão direito em Bases de dados e selecionado Atualizar que removeu a entrada no Management Studio. Depois eu fiz uma nova restauração que funcionou bem (nota que trazer-lo offline fez não trabalho, um reinício do serviço SQL não funcionou, uma reinicialização do servidor não funciona bem).

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

Drop the DB com o SQL ou com o botão direito sobre ele no gerenciador de "delete" E restaurar novamente.

eu realmente comecei a fazer isso por padrão. Script do DB gota, recriar e restaurar.

Por padrão, todos os RESTORE DATABASE vem com RECOVERY configurar. As opções de 'NORECOVERY', diz basicamente o SQL Server que a base de dados está à espera de mais arquivos restaurar (poderia ser um DIFF e LOG e, poderia incluir final do log arquivo de backup, se possível). As opções de 'recuperação', terminar todas as operações e deixar o banco de dados pronto para realizar transações.

Assim:

  1. Se o seu banco de dados está configurado com SIMPLE modelo de recuperação, você só pode executar uma CHEIA recuperar com opção NORECOVERY, quando você tem um DIFF backup. Não LOG de backup são permitidos em SIMPLE modelo de recuperação de banco de dados.
  2. Caso contrário, se seu banco de dados está configurado com CHEIA ou BULK-logged modelo de recuperação, você pode executar uma CHEIA Restaurar seguido por NORECOVERYoption , em seguida, executar uma DIFF seguida por NORECOVERY, e, finalmente, realizar LOG recuperar com opção RECOVERY.

Lembre-se, A ÚLTIMA RESTAURAR QUERY DEVE TER RECOVERY OPÇÃO . Poderia ser uma forma explícita ou não. Em termas 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

COM SUBSTITUIÇÃO opção deve ser usado com cautela, pois pode levar à perda de dados

Ou, se você executar um backup completo e DIFF, você pode 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

 2. 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

É claro, você pode executar uma restauração com a opção STATS = 10 que informa ao SQL Server para relatar cada 10% concluída.

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

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 isso ajuda.

Também pode haver problema de exclusão de um banco de dados preso se instantâneo é habilitado. Para mim isso funcionou:

  1. Em primeiro lugar eu segui Tipu Delacablu passos ( ler alguns posts up)
  2. comando executar: drop database [seu banco de dados], que lhe dará um erro dizendo que o nome do banco de dados instantâneo
  3. comando executar:. Drop database [banco de dados instantâneo], e depois executar o comando na etapa 2 novamente

Você tentou executar uma verificação SÓ? Só para ter certeza que é uma cópia de segurança de som.

http://msdn.microsoft.com/en-us/library /ms188902.aspx

  1. Deixe verificação e executar SQL Service Agent em primeiro lugar.
  2. Usando seguinte T-SQL:

    filename SELECIONAR DE master.sys.sysaltfiles ONDE dbid = DB_ID ( 'db_name');

  3. Usando T-SQL continuamente:

    Restaurar banco de dados do DISK = 'DB_PATH' COM RESTART, REPLACE;

Espero que isso ajuda!

Todas as opções com base no COM RECUPERAÇÃO não funcionou para mim.

O que fiz foi fazer restaurar a 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

Eu tive o mesmo problema ... embora eu não sei por que meu banco de dados experimentou este problema como o meu carro não estava cheio ... É como ele foi corrompido ou algo assim. Eu tentei toda a nenhum acima deles totalmente trabalhado, eu particularmente achei que a sugestão para parar o serviço e apagar os arquivos mdf e ldf iria trabalhar ... mas ainda congelou-se em restaurar?

acabei resolvendo isso excluindo os arquivos como mencionado, mas em vez de tentar restaurar o DB novamente eu copiado sobre mdf fresco e .ldf arquivos e anexado-los usando o assistente Anexo Front End. Alívio, funcionou !!

Não demorou muito para copiar os novos arquivos como eu estou usando uma máquina virtual ... então copiar e colar usando o clipboard tomou como um própria hora, então eu só recomendo isso como uma última tentativa.

Eu tenho o mydbname (Restaurando ...) caso por causa de SQL Express licenciado limite.

No arquivo de log, eu encontrei este:

CREATE DATABASE ou ALTER DATABASE falhou porque a resultante o tamanho do banco de dados cumulativo seria ultrapassar o seu limite licenciado de 10240 MB por banco de dados.

Então, se você está tentando restaurar um banco de dados maior, você precisa mudar o seu servidor SQL Express para edição desenvolvedor por exemplo.

O que fixa-lo para mim era

  1. parar a instância
  2. criar um backup dos arquivos .mdf e .ldf arquivos na pasta de dados
  3. Reinicie a instância
  4. excluir o banco de dados preso restauração
  5. colocar o mdf and.ldf arquivos de volta para os dados pasta
  6. Coloque a instância para o .mdf e .ldf arquivos
RESTORE DATABASE {DatabaseName}
   FROM DISK = '{databasename}.bak'
   WITH REPLACE, RECOVERY
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top