Como restaurar para um banco de dados diferente no servidor sql?

224

Eu tenho um backup do Database1 de uma semana atrás. O backup é feito semanalmente no agendador e recebo um .bakarquivo. Agora eu quero mexer com alguns dados, então preciso restaurá-los em um banco de dados diferente - Database2 .

Eu já vi essa pergunta: Restaure o banco de dados do SQL Server no mesmo pc com nome diferente e a etapa recomendada é renomear o banco de dados original, mas estou fora dessa opção, pois estou no servidor de produção e não posso realmente fazê-lo.

Existe alguma outra maneira de restaurá-lo para Database2, ou pelo menos, como navegar pelos dados desse arquivo .bak?

obrigado.

ps: a segunda resposta do link acima parecia promissora, mas continua terminando com erro:

A lista de arquivos de restauração está sendo finalizada de forma anormal

LocustHorde
fonte

Respostas:

304

Você pode criar um novo banco de dados e usar o "Assistente de Restauração" habilitando a opção Substituir ou;

Ver o conteúdo;

RESTORE FILELISTONLY FROM DISK='c:\your.bak'

observe os nomes lógicos do arquivo .mdf & .ldf a partir dos resultados;

RESTORE DATABASE MyTempCopy FROM DISK='c:\your.bak'
WITH 
   MOVE 'LogicalNameForTheMDF' TO 'c:\MyTempCopy.mdf',
   MOVE 'LogicalNameForTheLDF' TO 'c:\MyTempCopy_log.ldf'

Para criar o banco de dados MyTempCopycom o conteúdo de your.bak.

Exemplo (restaura um backup de um banco de dados chamado 'creditline' para 'MyTempCopy';

RESTORE FILELISTONLY FROM DISK='e:\mssql\backup\creditline.bak'

>LogicalName
>--------------
>CreditLine
>CreditLine_log

RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak'
WITH 
   MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf',
   MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'

>RESTORE DATABASE successfully processed 186 pages in 0.010 seconds (144.970 MB/sec).
Alex K.
fonte
5
Oi, parece que estou perdendo algo, ele continua lançando o erro backkup set holds a backup of a database other than existing "tmp" database, o que eu entendo. A tofrase deve ser o caminho físico real de MyTempCopy?
precisa saber é o seguinte
Ímpar, o toé o db & log local para o novo banco de dados, exemplo atualização acima
Alex K.
52
Para qualquer outra pessoa que tente isso, não crie o MyTempCopy, ele será criado durante a restauração.
Blazes
3
trabalhou apenas com as opções REPLACE, RECOVERY, no meu caso (SQL2012) cr. dba.stackexchange.com/questions/51489/…
dc2009 01/01
7
Deve usar REPLACE, RECOVERY para resolver isso. Então isso seria: # RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak' WITH REPLACE, RECOVERY, MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf', MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'
Raihan 18/01
67

SQL Server 2008 R2:

Para um banco de dados existente que você deseja "restaurar: a partir de um backup de um banco de dados diferente, siga estas etapas:

  1. Na barra de ferramentas, clique no botão Monitor de Atividade.
  2. Clique em processos. Filtre pelo banco de dados que você deseja restaurar. Mate todos os processos em execução clicando com o botão direito do mouse em cada processo e selecionando "kill process".
  3. Clique com o botão direito do mouse no banco de dados que deseja restaurar e selecione Tarefas -> Restaurar -> Do Banco de Dados.
  4. Selecione o botão de opção "Do dispositivo:".
  5. Selecione ... e escolha o arquivo de backup do outro banco de dados do qual você deseja restaurar.
  6. Selecione o conjunto de backup do qual deseja restaurar, marcando a caixa de seleção à esquerda do conjunto de backup.
  7. Selecione as opções".
  8. Selecione Substituir o banco de dados existente (COM SUBSTITUIR)
  9. Importante: Altere o nome do arquivo de dados de linhas "Restaurar como" para o nome do arquivo do banco de dados existente que você deseja substituir ou apenas atribua um novo nome.
  10. Faça o mesmo com o nome do arquivo do arquivo de log.
  11. Verifique na tela do monitor de atividades que nenhum novo processo foi gerado. Se eles fossem, mate-os.
  12. Clique OK.
Daniel Byrne
fonte
12
MS SQL Server 2010?
Mark
3
Existem algumas capturas de tela aqui stackoverflow.com/questions/3829271/…
Tomas Kubes
Apesar de ser um programador, prefiro usar este assistente. Mais fácil e limpo.
v1n1akabozo
1
O passo principal foi o 8º para mim. Obrigado Daniel.
21416 jbooker
Sql 2014 .. Etapa 6a: altere o banco de dados de destino para o banco de dados que você deseja restaurar. Etapa 9 e 10: Isso deve ser resolvido por você, alterando o banco de dados de destino. Mas verifique isso indo até Arquivos e verificar os nomes de arquivos como descrito na etapa inicial 9 e 10.
JzInqXc9Dg
49

Para o SQL Server 2012, usando o Sql Server Management Studio, achei essas etapas na página da Microsoft úteis para restaurar um nome e arquivo de banco de dados diferente: (ref: http://technet.microsoft.com/en-us/library/ms175510 .aspx )

Observe que as etapas 4 e 7 são importantes para definir, para não substituir o banco de dados existente.


Para restaurar um banco de dados para um novo local e, opcionalmente, renomear o banco de dados

  1. Conecte-se à instância apropriada do SQL Server Database Engine e, em Object Explorer, clique no nome do servidor para expandir a árvore do servidor.
  2. Clique com o botão direito do mouse em Bancos de Dados e clique em Restaurar Banco de Dados . A caixa de diálogo Restaurar banco de dados é aberta.
  3. Na página Geral , use a seção Origem para especificar a origem e o local dos conjuntos de backup a serem restaurados. Selecione uma das seguintes opções:

    • Base de dados

      • Selecione o banco de dados a ser restaurado na lista suspensa. A lista contém apenas bancos de dados cujo backup foi feito de acordo com o histórico de backup do msdb .

        Nota Se o backup for realizado em um servidor diferente, o servidor de destino não terá as informações do histórico de backup do banco de dados especificado. Nesse caso, selecione Dispositivo para especificar manualmente o arquivo ou dispositivo a restaurar.

    • Dispositivo

      • Clique no botão Procurar (...) para abrir a caixa de diálogo Selecionar dispositivos de backup . Na caixa Tipo de mídia de backup , selecione um dos tipos de dispositivos listados. Para selecionar um ou mais dispositivos para a caixa Mídia de backup , clique em Adicionar . Depois de adicionar os dispositivos que você deseja à caixa de listagem Mídia de backup , clique em OK para retornar à página Geral . Na caixa de listagem Origem: Dispositivo: banco de dados , selecione o nome do banco de dados que deve ser restaurado.

        Nota Esta lista está disponível apenas quando o dispositivo está selecionado. Somente bancos de dados que possuem backups no dispositivo selecionado estarão disponíveis.

  4. Na seção Destino , a caixa Banco de Dados é preenchida automaticamente com o nome do banco de dados a ser restaurado. Para alterar o nome do banco de dados, insira o novo nome no banco de dados caixa de .
  5. Na caixa Restaurar para , deixe o padrão como Até o último backup realizado ou clique em Linha do tempo para acessar a Linha do tempo do backup. caixa de diálogo para selecionar manualmente um ponto no tempo para interromper a ação de recuperação.
  6. Nos conjuntos de backup para restaurar grade, selecione os backups a serem restaurados. Essa grade exibe os backups disponíveis para o local especificado. Por padrão, é sugerido um plano de recuperação. Para substituir o plano de recuperação sugerido, você pode alterar as seleções na grade. Os backups que dependem da restauração de um backup anterior são desmarcados automaticamente quando o backup anterior é desmarcado.
  7. Para especificar o novo local dos arquivos de banco de dados, selecione a página Arquivos e clique em Realocar todos os arquivos para a pasta . Forneça um novo local para as pastas Arquivo de dados e Arquivo de log . Como alternativa, você pode manter as mesmas pastas e renomear o banco de dados e os nomes dos arquivos de log.
Rots
fonte
3
Este funciona como um encanto; agradecimentos especiais para as etapas 4 e 7
Anatoly Yakimchuk 19/18
Além disso, eu tive que ir para a guia 'Opções' e marcar 'Substituir o banco de dados existente (WITH REPLACE)' ... Então funcionou.
John Kurtz
1
@ JohnKurtz, você não precisa fazer isso se estiver restaurando para um novo banco de dados.
Rots
Eu já havia criado um banco de dados vazio para restaurar. Essa deve ser a diferença.
31718 John Kurtz
1
Confirmado que funciona conforme descrito, se você digitar o nome de um banco de dados inexistente na Etapa 4. Confirmado que, se você escolher um banco de dados diferente que já exista, deverá marcar 'Substituir o banco de dados existente (COM SUBSTITUIÇÃO)' em ' Guia Opções. Obrigado pela sua paciência!
19419 John Kurtz
34

Na verdade, não há necessidade de restaurar o banco de dados nos termos nativos do SQL Server, pois você "deseja mexer em alguns dados" e "navegar pelos dados desse arquivo .bak"

Você pode usar o ApexSQL Restore - uma ferramenta do SQL Server que anexa backups de bancos de dados SQL nativos e compactados nativamente e backups de log de transações como bancos de dados ativos ativos, acessíveis via SQL Server Management Studio, Visual Studio ou qualquer outra ferramenta de terceiros. Permite anexar um ou vários backups completos, diferenciais e de log de transações

Além disso, acho que você pode fazer o trabalho enquanto a ferramenta estiver no modo de teste totalmente funcional (14 dias)

Isenção de responsabilidade: trabalho como engenheiro de suporte ao produto no ApexSQL

Ivan Stankovic
fonte
9

Aqui está o que reuni de várias postagens para copiar um banco de dados usando backup e restauração com move para corrigir o local físico e sql adicional para corrigir o nome lógico.

/**
 * Creates (or resets) a Database to a copy of the template database using backup and restore.
 *
 * Usage: Update the @NewDatabase value to the database name to create or reset.
 */

DECLARE @NewDatabase SYSNAME = 'new_db';

-- Set up
USE tempdb;

DECLARE @TemplateBackups SYSNAME = 'TemplateBackups';
DECLARE @TemplateDatabase SYSNAME = 'template_db';
DECLARE @TemplateDatabaseLog SYSNAME = @TemplateDatabase + '_log';

-- Create a backup of the template database
BACKUP DATABASE @TemplateDatabase TO DISK = @TemplateBackups WITH CHECKSUM, COPY_ONLY, FORMAT, INIT, STATS = 100;

-- Get the backup file list as a table variable
DECLARE @BackupFiles TABLE(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0),FileId tinyint,CreateLSN numeric(25,0),DropLSN numeric(25, 0),UniqueID uniqueidentifier,ReadOnlyLSN numeric(25,0),ReadWriteLSN numeric(25,0),BackupSizeInBytes bigint,SourceBlockSize int,FileGroupId int,LogGroupGUID uniqueidentifier,DifferentialBaseLSN numeric(25,0),DifferentialBaseGUID uniqueidentifier,IsReadOnly bit,IsPresent bit,TDEThumbprint varbinary(32));
INSERT @BackupFiles EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @TemplateBackups + '''');

-- Create  the backup file list as a table variable
DECLARE @NewDatabaseData VARCHAR(MAX);
DECLARE @NewDatabaseLog VARCHAR(MAX);

SELECT @NewDatabaseData = PhysicalName FROM @BackupFiles WHERE Type = 'D';
SELECT @NewDatabaseLog = PhysicalName FROM @BackupFiles WHERE Type = 'L';

SET @NewDatabaseData = REPLACE(@NewDatabaseData, @TemplateDatabase, @NewDatabase);
SET @NewDatabaseLog = REPLACE(@NewDatabaseLog, @TemplateDatabase, @NewDatabase);

RESTORE DATABASE @NewDatabase FROM DISK = @TemplateBackups WITH CHECKSUM, RECOVERY, REPLACE, STATS = 100,
   MOVE @TemplateDatabase TO @NewDatabaseData,
   MOVE @TemplateDatabaseLog TO @NewDatabaseLog;

-- Change Logical File Name
DECLARE @SQL_SCRIPT VARCHAR(MAX)='
    ALTER DATABASE [{NewDatabase}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}'', NEWNAME=N''{NewDatabase}'');
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}_log'', NEWNAME=N''{NewDatabase}_log'');
    ALTER DATABASE [{NewDatabase}] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
    SELECT name AS logical_name, physical_name FROM SYS.MASTER_FILES WHERE database_id = DB_ID(N''{NewDatabase}'');
';
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{TemplateDatabase}', @TemplateDatabase);
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{NewDatabase}', @NewDatabase);
EXECUTE (@SQL_SCRIPT);
Nathan Niesen
fonte
Olá NateN, quero restaurar meu arquivo .bak (que existe na minha máquina local d: drive path) para outro banco de dados .i tentei esse código para teste de unidade, mas ele deu o erro .. "Não foi possível obter acesso exclusivo porque o banco de dados está em uso. "Incapaz de restaurar db .. você pode me ajudar como fazer ..?
Victor Athoti.
O banco de dados que você está restaurando não pode ser usado por outro processo. Não sei como script matando todos os processos que acessam um banco de dados.
Nathan Niesen
Olá NateN, está funcionando bem agora, eu uso o seu exemplo de código e, em seguida, fiz pequenas alterações nesse código e funcionou bem .... Mais uma vez obrigado por fornecer o código de exemplo ...
Victor Athoti.
1
Para sql2014 e além, a DECLARE @BackupFiles...linha precisa de uma coluna extra:SnapshotURL nvarchar(360)
fiat
3

Na verdade, é um pouco mais simples do que restaurar no mesmo servidor. Basicamente, você apenas percorre as opções "Restaurar banco de dados". Aqui está um tutorial para você:

http://www.techrepublic.com/blog/window-on-windows/how-do-i-restore-a-sql-server-database-to-a-new-server/454

Especialmente porque essa é uma restauração que não é de produção, você pode se sentir confortável apenas testando sem se preocupar muito com os detalhes. Basta colocar seus arquivos SQL onde você deseja que eles estejam no seu novo servidor e dar o nome que você quiser e pronto.

IAmTimCorey
fonte
Oi, eu preciso para restaurar a mesma servidor, banco de dados diferente ... (A restaurar db tem um nome diferente)
LocustHorde
Desculpe, eu interpretei mal a pergunta. Os mesmos princípios básicos se aplicam, você só precisa garantir que o novo nome e os nomes de arquivo (o mdf, o ldf etc.) sejam diferentes.
IAmTimCorey
3

Se não houver banco de dados, eu uso o seguinte código:

ALTER PROCEDURE [dbo].[RestoreBackupToNewDB]    
         @pathToBackup  varchar(500),--where to take backup from
         @pathToRestoreFolder  varchar(500), -- where to put the restored db files 
         @newDBName varchar(100)
    AS
    BEGIN

            SET NOCOUNT ON
            DECLARE @fileListTable TABLE (
            [LogicalName]           NVARCHAR(128),
            [PhysicalName]          NVARCHAR(260),
            [Type]                  CHAR(1),
            [FileGroupName]         NVARCHAR(128),
            [Size]                  NUMERIC(20,0),
            [MaxSize]               NUMERIC(20,0),
            [FileID]                BIGINT,
            [CreateLSN]             NUMERIC(25,0),
            [DropLSN]               NUMERIC(25,0),
            [UniqueID]              UNIQUEIDENTIFIER,
            [ReadOnlyLSN]           NUMERIC(25,0),
            [ReadWriteLSN]          NUMERIC(25,0),
            [BackupSizeInBytes]     BIGINT,
            [SourceBlockSize]       INT,
            [FileGroupID]           INT,
            [LogGroupGUID]          UNIQUEIDENTIFIER,
            [DifferentialBaseLSN]   NUMERIC(25,0),
            [DifferentialBaseGUID]  UNIQUEIDENTIFIER,
            [IsReadOnly]            BIT,
            [IsPresent]             BIT,
            [TDEThumbprint]         VARBINARY(32) -- remove this column if using SQL 2005
            )
            INSERT INTO @fileListTable EXEC('RESTORE FILELISTONLY FROM DISK ='''+ @pathToBackup+'''')
            DECLARE @restoreDatabaseFilePath NVARCHAR(500)
            DECLARE @restoreLogFilePath NVARCHAR(500)
            DECLARE @databaseLogicName NVARCHAR(500)
            DECLARE @logLogicName NVARCHAR(500)
            DECLARE @pathSalt uniqueidentifier = NEWID()

            SET @databaseLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='D') 
            SET @logLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='L')           
            SET @restoreDatabaseFilePath= @pathToRestoreFolder + @databaseLogicName + convert(nvarchar(50), @pathSalt) + '.mdf'
            SET @restoreLogFilePath= @pathToRestoreFolder + @logLogicName + convert(nvarchar(50), @pathSalt) + '.ldf'

            RESTORE DATABASE @newDBName FROM DISK=@pathToBackup     
            WITH 
               MOVE @databaseLogicName TO @restoreDatabaseFilePath,
               MOVE @logLogicName TO @restoreLogFilePath

            SET NOCOUNT OFF
    END
Konstantin Chernov
fonte
3
  • Tenho o mesmo erro deste tópico ao restaurar um novo banco de dados usando um banco de dados antigo. (usando .bak dá o mesmo erro)

  • Mudei o nome do banco de dados antigo pelo nome do novo banco de dados (o mesmo nesta imagem). Funcionou.

insira a descrição da imagem aqui

Nguyen Duc Hai
fonte
2
Da próxima vez, apague o nome do banco
Danh
1

Aqui está como restaurar um backup como um banco de dados adicional com um nome de banco de dados exclusivo.

Para o SQL 2005, isso funciona muito rapidamente. Estou certo de que as versões mais recentes funcionarão da mesma forma.

Primeiro, você não precisa colocar seu banco de dados original offline. Mas por questões de segurança, eu gosto. No meu exemplo, montarei um clone do meu banco de dados "billing" e ele será chamado "billingclone".

1) Faça um bom backup do banco de dados de cobrança

2) Por segurança, coloquei o original offline da seguinte forma:

3) Abra uma nova janela de consulta

**IMPORTANTE! Mantenha essa janela de consulta aberta até terminar! Você precisa restaurar o banco de dados a partir desta janela!

Agora digite o seguinte código:

-- 1) free up all USER databases
USE master;
GO
-- 2) kick all other users out:
ALTER DATABASE billing SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 3) prevent sessions from re-establishing connection:
ALTER DATABASE billing SET OFFLINE;

3) Em seguida, no Management Studio, rt clique em Bancos de dados no Pesquisador de objetos, escolha "Restaurar banco de dados"

4) digite um novo nome no campo "Para o banco de dados". IE billingclone

5) Na fonte para restauração, clique em "Do dispositivo" e clique no botão ... navegar

6) Clique em Adicionar e navegue até o seu backup

7) Coloque uma marca de seleção ao lado de Restaurar (selecione os conjuntos de backup para restaurar)

8) Em seguida, selecione a página OPÇÕES no canto superior esquerdo

9) Agora edite os nomes dos arquivos do banco de dados em RESTORE AS. Faça isso para o banco de dados e o log. IE billingclone.mdf e billingclone_log.ldf

10) agora pressione OK e aguarde a conclusão da tarefa.

11) Clique em Atualizar no seu Object Explorer e você verá seu novo banco de dados

12) Agora você pode colocar seu banco de dados de cobrança on-line novamente. Use a mesma janela de consulta usada para colocar o faturamento offline. Use este comando:

-- 1) free up all USER databases
USE master; GO
-- 2) restore access to all users:
ALTER DATABASE billing SET MULTI_USER WITH ROLLBACK IMMEDIATE;GO
-- 3) put the db back online:
ALTER DATABASE billing SET ONLINE;

feito!

gim
fonte
1
  1. faça uma cópia do seu banco de dados com a opção "copiar banco de dados" com nome diferente
  2. fazer backup de novo banco de dados copiado
  3. restaurá-lo!
sedras
fonte