¿Cómo restaurar a una base de datos diferente en sql server?


Tengo una copia de seguridad de Database1 de hace una semana. La copia de seguridad se realiza semanalmente en el planificador y obtengo un archivo .bak. Ahora quiero jugar con algunos datos, así que necesito restaurarlos en una base de datos diferente - Database2.

He visto esta pregunta: Restaurar la base de datos SQL Server en el mismo pc con un nombre diferente y el paso recomendado es cambiar el nombre de la base de datos original, pero estoy fuera de esa opción ya que estoy en el servidor de producción y realmente no puedo hacerlo se.

¿Hay alguna otra forma de restaurarlo a Database2, o al menos, cómo navego a través de los datos de eso?bak archivo?

Gracias.

Pd: la segunda respuesta del enlace anterior parecía prometedora, pero sigue terminando con error:

Restaurar la lista de archivos está terminando anormalmente

Author: Community, 2011-06-07

9 answers

Puede crear una nueva base de datos y luego usar el "Asistente de restauración" que habilita la opción de sobrescritura o;

Ver el contenido;

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

Tenga en cuenta los nombres lógicos de la .mdf & .ldf de los resultados, entonces;

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

Para crear la base de datos MyTempCopy con el contenido de your.bak.

Ejemplo (restaura una copia de seguridad de una base de datos llamada 'creditline' a '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).
 252
Author: Alex K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-01 15:48:34

SQL Server 2008 R2:

Para una base de datos existente que desea "restaurar: desde una copia de seguridad de una base de datos diferente siga estos pasos:

  1. Desde la barra de herramientas, haga clic en el botón Monitor de actividad.
  2. Haga clic en procesos. Filtrar por la base de datos que desea restaurar. Mata a todos los procesos en ejecución haciendo clic derecho en cada proceso y seleccionando "matar proceso".
  3. Haga clic derecho en la base de datos que desea restaurar y seleccione Tareas Tasks > Restaurar From>Desde Base.
  4. Seleccione el botón de opción "From Device:".
  5. Seleccione ... y elija el archivo de copia de seguridad de la otra base de datos desde la que desea restaurar.
  6. Seleccione el conjunto de copia de seguridad desde el que desea restaurar seleccionando la casilla de verificación a la izquierda del conjunto de copia de seguridad.
  7. Seleccione "Opciones".
  8. Seleccione Sobrescribir la base de datos existente (CON REEMPLAZAR) Importante:
  9. Cambie el nombre del archivo de datos de filas" Restaurar como " al nombre del archivo de la base de datos existente que desea sobrescribir o sólo dale un nuevo nombre.
  10. Haga lo mismo con el nombre del archivo de registro.
  11. Verifique desde la pantalla del Monitor de Actividad que no se generaron nuevos procesos. Si lo fueran, mátalos.
  12. Haga clic en Aceptar.
 60
Author: Daniel Byrne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-22 19:34:39

Para SQL Server 2012, usando Sql Server Management Studio, encontré estos pasos de la página de Microsoft útiles para restaurar a un archivo y nombre de base de datos diferentes: (ref: http://technet.microsoft.com/en-us/library/ms175510.aspx )

Nota es importante establecer los pasos 4 y 7 para no sobrescribir la base de datos existente.


Para restaurar una base de datos a una nueva ubicación, y opcionalmente cambiar el nombre de la base de datos

  1. Conéctese a la instancia apropiada del Motor de base de datos SQL Server y, a continuación, en el Explorador de objetos, haga clic en el nombre del servidor para expandir el árbol del servidor.
  2. Haga clic con el botón secundario en Databasesy, a continuación, haga clic en Restore Database. Se abre el cuadro de diálogo Restaurar base de datos.
  3. En la página General, use la sección Source para especificar el origen y la ubicación de los conjuntos de copia de seguridad a restaurar. Seleccione uno de los siguientes opciones:

    • Base de datos

      • Seleccione la base de datos a restaurar en la lista desplegable. La lista contiene solo bases de datos que han sido respaldadas de acuerdo con el msdb historial de copia de seguridad.

        Nota Si la copia de seguridad se toma de un servidor diferente, el servidor de destino no tendrá la información del historial de copia de seguridad para la base de datos especificada. En este caso, seleccione Dispositivo para manualmente especifique el archivo o dispositivo para restaurar.

    • Dispositivo

      • Haga clic en examinar (...) botón para abrir el cuadro de diálogo Select backup devices. En el cuadro Tipo de medio de copia de seguridad, seleccione uno de los tipos de dispositivos enumerados. Para seleccionar uno o más dispositivos Medios de copia de seguridadcuadro, haga clic en Añadir. Después de agregar los dispositivos que desea al cuadro de lista Backup media, haga clic en OK para volver al General página. En en el cuadro de lista Source: Device: Database, seleccione el nombre de la base de datos que debe restaurarse.

        Nota Esta lista solo está disponible cuando el dispositivo está seleccionado. Solo las bases de datos que tienen copias de seguridad en el dispositivo seleccionado estar disponible.

  4. En la sección Destino, el cuadro Base de datos se rellena automáticamente con el nombre de la base de datos a restaurar. Para cambiar el nombre de la base de datos, introduzca el nuevo nombre en el Base de datos box.
  5. En el cuadro Restaurar a , deje el valor predeterminado como A la última copia de seguridad tomada o haga clic en Línea de tiempo para acceder a la Copia de seguridad Timeline cuadro de diálogo para seleccionar manualmente un punto en el tiempo acción de recuperación.
  6. En la cuadrícula Conjuntos de copia de seguridad para restaurar, seleccione las copias de seguridad para restaurar. Esta cuadrícula muestra las copias de seguridad disponibles para el ubicación. Por defecto, a se sugiere un plan de recuperación. Para anular el plan de recuperación sugerido, puede cambiar las selecciones en la cuadrícula. Las copias de seguridad que dependen de la restauración de una copia de seguridad anterior son deseleccionado automáticamente cuando se deselecciona la copia de seguridad anterior.
  7. Para especificar la nueva ubicación de los archivos de la base de datos, seleccione la página Files y, a continuación, haga clic en Reubicar todos los archivos en la carpeta. Proporcione una nueva ubicación para la carpeta de archivos de datos y el archivo de registro carpeta. Alternativamente, puede mantener las mismas carpetas y simplemente cambiar el nombre de la base de datos y los nombres de los archivos de registro.
 37
Author: Rots,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-16 02:22:00

En realidad, no hay necesidad de restaurar la base de datos en términos nativos de SQL Server, ya que "desea jugar con algunos datos" y "navegar a través de los datos de eso .archivo bak "

Puede utilizar Restauración de ApexSQL – una herramienta de SQL Server que une copias de seguridad de bases de datos SQL nativas y comprimidas de forma nativa y copias de seguridad de registros de transacciones como bases de datos activas, accesibles a través de SQL Server Management Studio, Visual Studio o cualquier otra herramienta de terceros. Permite fijar copias de seguridad únicas o múltiples del registro completo, diferencial y de transacciones

Además, creo que puede hacer el trabajo mientras la herramienta está en modo de prueba completamente funcional (14 días)

Descargo de responsabilidad: Trabajo como Ingeniero de Soporte de Productos en ApexSQL

 34
Author: Ivan Stankovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-24 18:25:04

Esto es lo que he improvisado de varios mensajes para copiar una base de datos utilizando copia de seguridad y restaurar con mover para fijar la ubicación física y sql adicional para fijar el nombre 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);
 7
Author: NateN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-07 14:50:14

En realidad es un poco más simple que restaurar en el mismo servidor. Básicamente, solo tienes que caminar a través de las opciones "Restaurar base de datos". Aquí hay un tutorial para usted:

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

Especialmente dado que esta es una restauración que no es de producción, puede sentirse cómodo simplemente probándola sin preocuparse demasiado por los detalles. Simplemente coloque sus archivos SQL donde los desee su nuevo servidor y darle cualquier nombre que desee y ya está listo para ir.

 3
Author: IAmTimCorey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-07 15:08:49

Si no existe ninguna base de datos utilizo el siguiente 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
 2
Author: Konstantin Chernov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-02 00:25:09

Aquí se muestra cómo restaurar una copia de seguridad como una bd adicional con un nombre de bd único.

Para SQL 2005 esto funciona muy rápidamente. Estoy seguro de que las versiones más recientes funcionarán igual.

En primer lugar, no es necesario desconectar la base de datos original. Pero por seguridad, me gusta. En mi ejemplo, voy a montar un clon de mi base de datos "billing" y se llamará "billingclone".

1) Hacer una buena copia de seguridad de la base de datos de facturación

2) Por seguridad, tomé el original fuera de línea como sigue:

3) Abre una nueva ventana de consulta

**¡IMPORTANTE! Mantenga esta ventana de consulta abierta hasta que haya terminado! Necesita restaurar la base de datos desde esta ventana!

Ahora ingrese el siguiente 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) A continuación, en Management Studio, haga clic en rt Bases de datos en el Explorador de objetos, elija "Restaurar base de datos"

4) introduzca un nuevo nombre en el campo "To Database". Es decir, billingclone

5) En la fuente para Restaurar, haga clic en "Desde el dispositivo" y haga clic en el ... botón de navegación

6) Haga clic en Agregar y vaya a su copia de seguridad

7) Ponga una marca de verificación junto a Restaurar (Seleccione los conjuntos de copia de seguridad para restaurar)

8) a continuación, seleccione la página de OPCIONES en la esquina superior LH

9) Ahora edite los nombres de los archivos de la base de datos en RESTAURAR COMO. Haga esto tanto para la base de datos como para el registro. Es decir, billingclone.mdf y billingclone_log.ldf

10) ahora presiona OK y espera a que la tarea se complete.

11) Pulse refresh en el Explorador de objetos y verá su nueva db

12) Ahora puedes vuelve a poner en línea tu base de datos de facturación. Usa la misma ventana de consulta que usaste para desconectar la facturación. Utilice 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;

Hecho!

 1
Author: gim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-24 04:42:20
  • Tengo el mismo error que este tema cuando restauro una nueva base de datos usando una base de datos antigua. (utilizar .bak da el mismo error)

  • Cambié el nombre de la base de datos antigua por el nombre de la nueva base de datos (mismo esta imagen). Funcionó.

introduzca la descripción de la imagen aquí

 1
Author: Nguyen Duc Hai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-27 23:48:52