SQL Server 2012 Restaurar backup para o novo nome do banco de dados

16

Parece que me lembro que, em 2008, você pode restaurar um backup para uma nova cópia de um banco de dados, alterando o nome no campo "Banco de Dados de Destino" no assistente de restauração. Ele criaria um novo banco de dados, que é uma cópia do banco de dados original restaurada no momento desejado. Eu ainda não descobri como fazer o SQL 2012 fazer isso.

Agora, entendo (graças a Aaron Bertrand) que isso realmente não mudou, e que 2012 está realmente tornando mais óbvio para mim que essa estratégia foi uma péssima idéia em primeiro lugar!

Portanto, o que preciso fazer é: Crie um novo banco de dados, 'MyDB_Copy', a partir de um banco de dados existente, 'MyDB', usando seus arquivos de backup. Temos backups completos noturnos (.bak) e TLogs a cada 15 minutos (.trn). Eu não quero que o 'MyDB' existente seja afetado / tocado, porque é "ao vivo".

Depois que o MyDB_Copy é criado a partir do arquivo principal de backup completo, preciso restaurar algumas dúzias de backups do TLog para obtê-lo em um determinado momento.

NateJ
fonte
Você ou Aaron podem compartilhar por que essa é uma má idéia? ou link para o problema em que é explicado?
Thronk # 15/13
Eu acredito que é algo sobre os nomes lógicos não serem alterados e, portanto, você acabaria com dois bancos de dados no mesmo local que têm nomes e arquivos físicos diferentes, mas nomes lógicos idênticos, o que causa problemas para os planos de manutenção que dependem em nomes lógicos. Na minha situação, esses bancos de dados restaurados / copiados nunca duraram mais de algumas horas, mas posso ver por que não é uma boa prática.
NateJ 17/10

Respostas:

18

Baseado livremente no Exemplo E na documentação , abra uma nova janela de consulta e execute:

RESTORE DATABASE MyDB_Copy FROM DISK = 'C:\blahblah\MyDB.bak'
  WITH REPLACE, RECOVERY,
  MOVE 'MyDB' TO 'C:\blahblah\Data\MyDB_Copy.mdf',
---------------------------------------^^^^^
  MOVE 'MyDB_log' TO 'C:\blahblah\Data\MyDB_Copy.ldf';
-------------------------------------------^^^^^

Os nomes lógicos não são importantes; os nomes dos arquivos físicos são. Isso faz suposições sobre seus nomes de arquivos lógicos e que existem apenas dois; correr EXEC MyDB..sp_helpfile;para ter certeza.

Se você precisar restaurar logs, altere RECOVERYpara NORECOVERY:

  WITH REPLACE, NORECOVERY,
----------------^^

Em seguida, você pode emitir uma série de:

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\file1.trn' WITH NORECOVERY;

E no último:

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\fileN.trn' WITH RECOVERY;

Ou se você precisar apenas de parte de um log-in até um momento (presumo que você tenha verificado onde estão os LSNs e os horários, para saber exatamente de quais arquivos você precisa):

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\fileN.trn' WITH 
  STOPAT = '<some point in time Friday>', RECOVERY;

A maneira como você disse que funcionava nas versões anteriores nunca funcionaria, a menos que o backup viesse de um servidor diferente. Por padrão, ele tentará colocar os novos arquivos mdf e ldf exatamente no mesmo local, e isso não é possível.

Aaron Bertrand
fonte
Ok, isso ajudou um pouco. Agora, preciso restaurar algumas dúzias de arquivos TRN para que o banco de dados volte ao estado em que estava sexta-feira à noite (os backups completos só acontecem diariamente; os backups do TLog acontecem a cada 15 minutos). Usando seu exemplo, consegui criar o banco de dados a partir do arquivo BAK principal, mas recebo um novo erro ao tentar uma instrução semelhante para restaurar o log. Ele diz que "o log ou o backup diferencial não pode ser restaurado porque nenhum arquivo está pronto para avançar".
NateJ 14/10
@NateJ, você deve fazer uma pergunta completa então. :-)
Aaron Bertrand
11
Impressionante, estou digitando agora! Muito obrigado pela sua ajuda. Estou chateado por ter recebido alguns representantes negativos no StackOverflow, mas se funcionar, valerá a pena.
NateJ 14/10
11
@NateJ Você deve recuperar esse representante porque a pergunta foi excluída quando foi migrada (ou será eventualmente). Não fui eu, mas eu suspeito que foi por causa de sua acusação de que este trabalhou em uma versão, mas não agora, quando isso é claramente apenas um mal-entendido sobre o que estava acontecendo ...
Aaron Bertrand
Oh, entendi. Algo como costumava funcionar - posso não estar lembrando exatamente o que / como, mas concordo que foi mal interpretado. Meu colega xinga de um lado para o outro, mas agora que penso nisso, não faz sentido. Nós devemos ter feito algo diferente, usando a GUI. Eu sinto que usar os comandos / scripts, como você sugeriu, será melhor para nós. :) Os logs estão sendo restaurados agora, com sucesso até agora!
NateJ
0

Tudo o que você precisa fazer para restaurar o mesmo banco de dados várias vezes é alterar o nome dos arquivos de disco desse banco de dados. Obviamente, você precisa atribuir um nome diferente ao banco de dados para qualquer outro banco de dados no SQL Server. No SSMS, depois de selecionar o arquivo .bak para restauração e digitar o nome do banco de dados, clique em 'Arquivos' na seção "Selecionar uma página" à esquerda e altere o nome dos arquivos do disco.

Cheers Doug

Doug
fonte