o arquivo mdf não pode ser substituído ao restaurar um banco de dados no SQL Server

21

Eu tenho um banco de dados A. Ele contém alguns dados. Eu criei um backup para A como arquivo A.bak . Em seguida, crio um novo banco de dados vazio B. E, em seguida, tento restaurar o B do A.bak . Mas o SQL Serve me diz o seguinte erro:

O arquivo 'C: \ SQL Directory \ DATA \ A.mdf' não pode ser substituído. Está sendo usado pelo banco de dados 'A'.

Mas se eu excluir A do SQL Server, o retore será ok.

Não entendo por que o SQL precisa gravar no arquivo de banco de dados original enquanto restaura a partir de um arquivo de backup separado ?

Obrigado ~

smwikipedia
fonte

Respostas:

19

Se você restaurar um banco de dados, o SQL Server, por padrão, tentará restaurar todos os dados e arquivos de log em seus locais originais. Como esses locais originais ainda estão em uso pelo banco de dados original ("A"), a restauração falha. Você precisa usar a cláusula WITH MOVE para especificar novos locais para todos os arquivos no banco de dados.

RESTORE DATABASE B FROM DISK = 'A.bak'
WITH MOVE 'DataFileLogicalName' TO 'C:\SQL Directory\DATA\B.mdf',
MOVE 'LogFileLogicalName' TO 'C:\SQL Directory\DATA\B.ldf',
REPLACE --Needed if database B already exists

Algo assim de qualquer maneira. Use RESTORE FILELISTONLY FROM DISK ... para ver os nomes de arquivos lógicos no backup, se necessário.

db2
fonte
11

WITH MOVE/ MOVEé a solução certa no T-SQL.

A propósito, se você deseja usar a GUI, pode ir para Arquivos e renomear:

  • a.MDF
  • a.NDF
  • a.LDF

para

  • b.MDF
  • b.NDF
  • b.LDF

insira a descrição da imagem aqui

Francesco Mantovani
fonte
11
Além disso, ao alterar o nome do banco de dados de destino na guia Geral, a GUI atualizará automaticamente os nomes Restaurar como de acordo.
Wouter
0

Ao restaurar o backup, você pode especificar os arquivos de dados a serem restaurados.

Olhe aqui e aqui . Você pode usar a opção "Restaurar os arquivos do banco de dados como" e o sinalizador "Substituir o banco de dados existente".

demas
fonte
0

Você está usando a opção REPLACE, no comando TSQL ou como uma caixa de seleção selecionada? Como alternativa, você pode renomear os arquivos e chamar o banco de dados de outra maneira.

Você também achará um pouco difícil restaurar em um banco de dados que está sendo usado ... será necessário interromper os processos usando o banco de dados; OU solte / exclua o banco de dados primeiro, fechando as conexões (essa é provavelmente a mais fácil); OU defina o banco de dados que você deseja substituir em algo como modo de usuário restrito, com reversão imediata, portanto, esperamos que apenas DBAs possam usar; OU até pare o SQL Server e reinicie-o - espero que a restauração seja executada antes que alguém / qualquer coisa use esse banco de dados.

O PS faz um backup do banco de dados que você está prestes a sobrescrever, apenas por precaução.

Peter Schofield
fonte
0

Se alguém pesquisar uma solução na GUI do Management Studio depois de já usar a Optionspágina e a Overwrite the existing database (WITH REPLACE)opção de ativação :

Basta clicar na Restore Ascoluna e alterar os nomes dos *.mdfarquivos e do *.ldfarquivo.

jan
fonte