Come ripristinare su un database diverso in SQL Server?


224

Ho un backup di Database1 di una settimana fa. Il backup viene eseguito settimanalmente nello scheduler e ottengo un .bakfile. Ora voglio armeggiare con alcuni dati, quindi ho bisogno di ripristinarli su un database diverso - Database2 .

Ho visto questa domanda: ripristinare il database di SQL Server nello stesso PC con un nome diverso e il passaggio consigliato è rinominare il db originale, ma non ho questa opzione poiché sono nel server di produzione e non riesco davvero a farlo.

Esiste un altro modo per ripristinarlo Database2o almeno come sfogliare i dati di quel file .bak?

Grazie.

ps: la seconda risposta dal link sopra sembrava promettente ma continua a terminare con errore:

Ripristina elenco file si sta chiudendo in modo anomalo

Risposte:


304

È possibile creare un nuovo db quindi utilizzare la "Procedura guidata di ripristino" abilitando l'opzione Sovrascrivi oppure;

Visualizza il contenuto;

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

notare i nomi logici di .mdf & .ldf dai risultati, quindi;

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

Per creare il database MyTempCopycon i contenuti di your.bak.

Esempio (ripristina un backup di un db chiamato 'creditline' in '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).

5
Ciao, mi sembra che manchi qualcosa, continua a lanciare l'errore backkup set holds a backup of a database other than existing "tmp" database, che, capisco. La tofrase dovrebbe essere il vero percorso fisico di MyTempCopy?
LocustHorde,

Strano, toè la posizione db & log per il nuovo database, aggiornamento esempio sopra
Alex K.

52
Per chiunque provi questo, non creare MyTempCopy, viene creato durante il ripristino.
Blazes

3
ha funzionato solo con le opzioni REPLACE, RECOVERY, nel mio caso (SQL2012) cr. dba.stackexchange.com/questions/51489/…
dc2009

7
Dovresti usare REPLACE, RECOVERY per risolvere questo problema. Quindi questo sarebbe: 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, il

67

SQL Server 2008 R2:

Per un database esistente che si desidera "ripristinare: da un backup di un database diverso attenersi alla seguente procedura:

  1. Dalla barra degli strumenti, fare clic sul pulsante Monitoraggio attività.
  2. Fare clic sui processi. Filtra per il database che desideri ripristinare. Uccidi tutti i processi in esecuzione facendo clic con il tasto destro su ciascun processo e selezionando "Termina processo".
  3. Fare clic con il tasto destro del mouse sul database che si desidera ripristinare e selezionare Attività -> Ripristina -> Dal database.
  4. Seleziona il pulsante di opzione "Da dispositivo:".
  5. Selezionare ... e scegliere il file di backup dell'altro database da cui si desidera ripristinare.
  6. Selezionare il set di backup che si desidera ripristinare selezionando la casella di controllo a sinistra del set di backup.
  7. Seleziona "Opzioni".
  8. Seleziona Sovrascrivi il database esistente (WITH REPLACE)
  9. Importante: modificare il nome del file di dati delle righe "Ripristina come" nel nome del file del database esistente che si desidera sovrascrivere o semplicemente assegnargli un nuovo nome.
  10. Fare lo stesso con il nome del file di registro.
  11. Verificare dalla schermata Monitor attività che non siano stati generati nuovi processi. Se lo fossero, uccidili.
  12. Clicca OK.

12
MS SQL Server 2010?
Segna il

3
Ci sono alcuni screenshot qui stackoverflow.com/questions/3829271/…
Tomas Kubes

Nonostante sia un programmatore, preferirei usare questo wizard. Più facile e pulito.
v1n1akabozo,

1
Il passo chiave è stato # 8 per me. Grazie Daniel.
jbooker,

Sql 2014 .. Passaggio 6a: modificare il database di destinazione nel database in cui si desidera ripristinare. Passaggio 9 e 10: questo dovrebbe essere curato modificando il database di destinazione. Ma ricontrolla andando su File e controllando i nomi dei file come descritto nei passaggi 9 e 10. originali
JzInqXc9Dg

49

Per SQL Server 2012, utilizzando Sql Server Management Studio, ho trovato questi passaggi dalla pagina Microsoft utili per il ripristino in un diverso file di database e nome: (ref: http://technet.microsoft.com/en-us/library/ms175510 .aspx )

Nota: i passaggi 4 e 7 sono importanti da impostare in modo da non sovrascrivere il database esistente.


Per ripristinare un database in una nuova posizione e facoltativamente rinominare il database

  1. Connettersi all'istanza appropriata del Motore di database di SQL Server, quindi in Esplora oggetti fare clic sul nome del server per espandere la struttura del server.
  2. Fare clic con il pulsante destro del mouse su Database e quindi fare clic su Ripristina database . Il Ripristina database si apre la finestra di dialogo.
  3. Nella pagina Generale , utilizzare la sezione Origine per specificare l'origine e il percorso dei set di backup da ripristinare. Seleziona una delle seguenti opzioni:

    • Banca dati

      • Selezionare il database da ripristinare dall'elenco a discesa. L'elenco contiene solo database di cui è stato eseguito il backup in base alla cronologia dei backup msdb .

        Nota Se il backup viene prelevato da un altro server, il server di destinazione non disporrà delle informazioni sulla cronologia del backup per il database specificato. In questo caso, selezionare Dispositivo per specificare manualmente il file o il dispositivo da ripristinare.

    • Dispositivo

      • Fare clic sul pulsante Sfoglia (...) per aprire la finestra di dialogo Seleziona dispositivi di backup . Nella casella Tipo di supporto di backup , selezionare uno dei tipi di dispositivi elencati. Per selezionare uno o più dispositivi per la casella Supporto di backup , fare clic su Aggiungi . Dopo aver aggiunto i dispositivi desiderati alla casella di riepilogo Supporti di backup , fare clic su OK per tornare alla pagina Generale . Nella casella di riepilogo Origine: Dispositivo: database , selezionare il nome del database che deve essere ripristinato.

        Nota Questo elenco è disponibile solo quando è selezionato Dispositivo. Saranno disponibili solo database con backup sul dispositivo selezionato.

  4. Nella sezione Destinazione , la casella Database viene popolata automaticamente con il nome del database da ripristinare. Per modificare il nome del database, immettere il nuovo nome nella casella Database .
  5. Nella casella Ripristina su , lasciare l'impostazione predefinita come All'ultimo backup eseguito o fare clic su Linea temporale per accedere alla finestra di dialogo Linea temporale di backup per selezionare manualmente un punto nel tempo per interrompere l'azione di recupero.
  6. Nella griglia dei set di backup da ripristinare , selezionare i backup da ripristinare. Questa griglia visualizza i backup disponibili per la posizione specificata. Per impostazione predefinita, viene suggerito un piano di ripristino. Per sovrascrivere il piano di ripristino suggerito, è possibile modificare le selezioni nella griglia. I backup che dipendono dal ripristino di un backup precedente vengono automaticamente deselezionati quando viene deselezionato il backup precedente.
  7. Per specificare la nuova posizione dei file del database, selezionare la pagina File , quindi fare clic su Riporta tutti i file nella cartella . Fornire una nuova posizione per la cartella del file di dati e la cartella del file di registro . In alternativa è possibile mantenere le stesse cartelle e semplicemente rinominare il database e i nomi dei file di registro.

3
Questo funziona come un incantesimo; ringraziamenti speciali per i passaggi 4 e 7
Anatoly Yakimchuk,

Inoltre, ho dovuto andare alla scheda "Opzioni" e selezionare "Sovrascrivi il database esistente (WITH REPLACE)" ... Quindi ha funzionato.
John Kurtz,

1
@JohnKurtz non dovresti farlo se stai ripristinando un nuovo database.
Annuncia il

Avevo già creato un database vuoto in cui ripristinare. Questa deve essere la differenza.
John Kurtz,

1
Confermato che funziona come descritto se si inserisce il nome di un database inesistente al passaggio 4. Confermato che se si sceglie un database diverso già esistente, è necessario selezionare "Sovrascrivi il database esistente (CON SOSTITUISCI)" su " Scheda Opzioni. Grazie per la vostra pazienza!
John Kurtz,

34

In realtà, non è necessario ripristinare il database in termini nativi di SQL Server, poiché "si desidera giocherellare con alcuni dati" e "sfogliare i dati di quel file .bak"

È possibile utilizzare ApexSQL Restore : uno strumento di SQL Server che collega backup di database SQL nativi e compressi nativamente e backup di log delle transazioni come database live , accessibili tramite SQL Server Management Studio, Visual Studio o qualsiasi altro strumento di terze parti. Consente di allegare backup completi, differenziali e del registro delle transazioni singoli o multipli

Inoltre, penso che puoi fare il lavoro mentre lo strumento è in modalità di prova completamente funzionale (14 giorni)

Disclaimer: lavoro come tecnico dell'assistenza ai prodotti in ApexSQL


9

Ecco cosa ho messo insieme da vari post per copiare un database usando il backup e il ripristino con mossa per correggere la posizione fisica e sql aggiuntivo per correggere il nome logico.

/**
 * 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);

Ciao NateN, voglio ripristinare il mio file .bak (che esiste nella mia macchina locale d: percorso dell'azionamento) su un altro DB. Ho provato questo codice per il test dell'unità, ma dà l'errore .. "Impossibile ottenere l'accesso esclusivo perché il database è in uso. "impossibile ripristinare db .. mi può aiutare per favore come fare ..?
Victor Athoti.

Il database su cui stai ripristinando non può essere utilizzato da un altro processo. Non sono sicuro di come script uccidere tutti i processi che accedono a un database.
Nathan Niesen,

Ciao NateN, ora funziona benissimo, io uso il tuo esempio di codice e poi ho fatto piccole modifiche in quel codice e poi funzionava bene .... Ancora una volta grazie per aver fornito il codice di esempio ...
Victor Athoti.

1
Per sql2014 e oltre, la DECLARE @BackupFiles...riga necessita di una colonna aggiuntiva:SnapshotURL nvarchar(360)
fiat

3

In realtà è un po 'più semplice del ripristino sullo stesso server. Fondamentalmente, passi attraverso le opzioni "Ripristina Database". Ecco un tutorial per te:

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

Soprattutto perché si tratta di un ripristino non di produzione, puoi sentirti a tuo agio provandolo senza preoccuparti troppo dei dettagli. Inserisci i tuoi file SQL nel punto desiderato sul nuovo server e assegnagli il nome che desideri e sei a posto.


Ciao, ho bisogno di ripristinare
sullo

Mi dispiace, ho letto male la domanda. Si applicano gli stessi principi di base, devi solo assicurarti che il nuovo nome e i nomi dei file (mdf, ldf, ecc.) Siano diversi.
IAmTimCorey

3

Se non esiste un database, utilizzo il seguente codice:

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

3
  • Ho lo stesso errore di questo argomento quando ripristino un nuovo database utilizzando un vecchio database. (l'uso di .bak dà lo stesso errore)

  • Ho cambiato il nome del vecchio database con il nome del nuovo database (stessa immagine). Ha funzionato.

inserisci qui la descrizione dell'immagine


2
La prossima volta, per favore cancella il nome della banca
Danh,

1

Ecco come ripristinare un backup come db aggiuntivo con un nome db univoco.

Per SQL 2005 funziona molto rapidamente. Sono sicuro che le versioni più recenti funzioneranno allo stesso modo.

Innanzitutto, non devi portare offline il tuo db originale. Ma per motivi di sicurezza, mi piace. Nel mio esempio, ho intenzione di montare un clone del mio database di "fatturazione" e verrà chiamato "clone di fatturazione".

1) Effettuare un buon backup del database di fatturazione

2) Per sicurezza, ho portato l'originale offline come segue:

3) Aprire una nuova finestra Query

**IMPORTANTE! Tieni aperta questa finestra di query fino a quando non hai finito! Devi ripristinare il db da questa finestra!

Ora inserisci il seguente codice:

-- 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) Successivamente, in Management Studio, fare clic su Database in Esplora oggetti, selezionare "Ripristina database"

4) inserisci il nuovo nome nel campo "Al database". IE fatturazione

5) In Source for Restore, fai clic su "Da dispositivo" e fai clic sul pulsante di navigazione ...

6) Fai clic su Aggiungi e vai al backup

7) Metti un segno di spunta accanto a Ripristina (seleziona i set di backup da ripristinare)

8) quindi selezionare la pagina OPZIONI nell'angolo in alto a sinistra

9) Ora modificare i nomi dei file di database in RESTORE AS. Fallo sia per il db che per il registro. IE billingclone.mdf e billingclone_log.ldf

10) ora premi OK e attendi il completamento dell'attività.

11) Premi aggiorna in Esplora oggetti e vedrai il tuo nuovo db

12) Ora puoi riportare online il tuo db di fatturazione. Utilizza la stessa finestra di query utilizzata per portare la fatturazione offline. Usa questo 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;

fatto!


1
  1. crea una copia dal tuo database con l'opzione "copia database" con un nome diverso
  2. backup nuovo database copiato
  3. ripristinalo!
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.