¿Cómo restaurar a una base de datos diferente en el servidor SQL?

224

Tengo una copia de seguridad de Database1 de hace una semana. La copia de seguridad se realiza semanalmente en el planificador y obtengo un .bakarchivo. 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 de SQL Server en la misma 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.

¿Hay alguna otra forma de restaurarlo Database2, o al menos, cómo navego por los datos de ese archivo .bak?

Gracias.

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

Restaurar la lista de archivos está terminando anormalmente

LangostaHorde
fuente

Respuestas:

304

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

Ver el contenido;

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

tenga en cuenta los nombres lógicos de .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 MyTempCopycon el contenido de your.bak.

Ejemplo (restaura una copia de seguridad de una base de datos llamada 'línea de crédito' 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).
Alex K.
fuente
55
Hola, parece que me falta algo, sigue arrojando el error backkup set holds a backup of a database other than existing "tmp" database, que, entiendo. ¿Debería ser la tofrase el camino físico real de MyTempCopy?
LocustHorde
Extraño, toes la ubicación de base de datos y registro para la nueva base de datos, ejemplo de actualización anterior
Alex K.
52
Para cualquier otra persona que intente esto, no cree MyTempCopy, se crea durante la restauración.
Blazes
3
funcionó solo con las opciones REPLACE, RECOVERY, en mi caso (SQL2012) cr. dba.stackexchange.com/questions/51489/…
dc2009
77
Debería usar REPLACE, RECOVERY para resolver esto. Entonces esto sería: 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
67

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. Procesos de clic. Filtre por la base de datos que desea restaurar. Elimine 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 -> Restaurar -> Desde la base de datos.
  4. Seleccione el botón de radio "Desde dispositivo:".
  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 respaldo del que desea restaurar seleccionando la casilla de verificación a la izquierda del conjunto de respaldo.
  7. Seleccione opciones".
  8. Seleccione Sobrescribir la base de datos existente (CON REEMPLAZAR)
  9. Importante: Cambie el nombre del archivo de datos "Restaurar como" por el nombre de archivo de la base de datos existente que desea sobrescribir o simplemente dele 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.
Daniel Byrne
fuente
12
MS SQL Server 2010?
Mark
3
Hay algunas capturas de pantalla aquí stackoverflow.com/questions/3829271/…
Tomas Kubes
A pesar de ser un programador, prefiero usar este asistente. Más fácil y más limpio.
v1n1akabozo
1
El paso clave fue el # 8 para mí. Gracias Daniel
jbooker
SQL 2014 .. Paso 6a: Cambie la base de datos de destino a la base de datos a la que desea restaurar. Paso 9 y 10: esto se debe solucionar cambiando la base de datos de destino. Pero vuelva a verificar esto yendo a Archivos y verificando los nombres de los archivos como se describe en los pasos originales 9 y 10.
JzInqXc9Dg
49

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

Tenga en cuenta que 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, renombrar la base de datos

  1. Conéctese a la instancia adecuada del Motor de base de datos de SQL Server y luego, 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 derecho en Bases de datos y luego haga clic en Restaurar base de datos . Se abre el cuadro de diálogo Restaurar base de datos .
  3. En la página General , use la sección Origen para especificar el origen y la ubicación de los conjuntos de copia de seguridad para restaurar. Selecciona una de las siguientes opciones:

    • Base de datos

      • Seleccione la base de datos para restaurar de la lista desplegable. La lista contiene solo bases de datos que se han respaldado de acuerdo con el historial de respaldo de msdb .

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

    • Dispositivo

      • Haga clic en el botón Examinar (...) para abrir el cuadro de diálogo Seleccionar dispositivos de respaldo . 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 para el cuadro Medios de copia de seguridad , haga clic en Agregar . Después de agregar los dispositivos que desea al cuadro de lista Medios de copia de seguridad , haga clic en Aceptar para volver a la página General . En el cuadro de lista Origen: Dispositivo: Base de datos , seleccione el nombre de la base de datos que debe restaurarse.

        Nota Esta lista solo está disponible cuando se selecciona Dispositivo. Solo estarán disponibles las bases de datos que tengan copias de seguridad en el dispositivo seleccionado.

  4. En la sección Destino , el cuadro Base de datos se completa automáticamente con el nombre de la base de datos que se va a restaurar. Para cambiar el nombre de la base de datos, ingrese el nuevo nombre en el cuadro Base de datos .
  5. En el cuadro Restaurar a , deje el valor predeterminado como A la última copia de seguridad realizada o haga clic en Línea de tiempo para acceder al cuadro de diálogo Línea de tiempo de copia de seguridad para seleccionar manualmente un punto en el tiempo para detener la 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 la ubicación especificada. Por defecto, 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 se deseleccionan automáticamente cuando la copia de seguridad anterior se deselecciona.
  7. Para especificar la nueva ubicación de los archivos de la base de datos, seleccione la página Archivos y luego haga clic en Reubicar todos los archivos a la carpeta . Proporcione una nueva ubicación para la carpeta del archivo de datos y la carpeta del archivo de registro . Alternativamente, puede mantener las mismas carpetas y cambiar el nombre de la base de datos y los nombres de los archivos de registro.
Podredumbre
fuente
3
Este funciona como un encanto; agradecimiento especial por los pasos 4 y 7
Anatoly Yakimchuk
Además, tuve que ir a la pestaña 'Opciones' y marcar 'Sobrescribir la base de datos existente (CON REEMPLAZO)' ... Luego funcionó.
John Kurtz el
1
@JohnKurtz no debería necesitar hacer eso si está restaurando a una nueva base de datos.
pudre el
Ya había creado una base de datos vacía para restaurar. Esa debe ser la diferencia.
John Kurtz el
1
Confirmó que funciona como se describe si ingresa el nombre de una base de datos no existente en el Paso 4. Confirmó que si elige una base de datos diferente que ya existe, debe marcar 'Sobrescribir la base de datos existente (CON REEMPLAZAR)' en ' Pestaña Opciones ¡Gracias por su paciencia!
John Kurtz el
34

En realidad, no hay necesidad de restaurar la base de datos en términos nativos de SQL Server, ya que "quiere jugar con algunos datos" y "examinar los datos de ese archivo .bak"

Puede usar ApexSQL Restore : una herramienta de SQL Server que adjunta copias de seguridad de bases de datos SQL comprimidas de forma nativa y nativa y copias de seguridad de registros de transacciones como bases de datos en vivo , accesibles a través de SQL Server Management Studio, Visual Studio o cualquier otra herramienta de terceros. Permite adjuntar una o varias copias de seguridad completas, diferenciales y de registro de transacciones

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

Descargo de responsabilidad: trabajo como ingeniero de soporte de productos en ApexSQL

Ivan Stankovic
fuente
9

Esto es lo que he reunido de varias publicaciones para copiar una base de datos usando la copia de seguridad y restauración con movimiento para arreglar la ubicación física y sql adicional para arreglar 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);
Nathan Niesen
fuente
Hola NateN, quiero restaurar mi archivo .bak (que existe en mi máquina local d: ruta de la unidad) a otro DB. Intenté este código para la prueba de la unidad pero da error. "No se pudo obtener acceso exclusivo porque la base de datos está en uso. "no se puede restaurar db ... ¿me pueden ayudar cómo hacerlo ...?
Victor Athoti.
La base de datos que está restaurando no puede ser utilizada por otro proceso. No estoy seguro de cómo hacer un script para eliminar todos los procesos que acceden a una base de datos.
Nathan Niesen
Hola NateN, está funcionando bien ahora, uso su código de muestra y luego hice pequeños cambios en ese código y luego funcionó bien .... Una vez más, gracias por proporcionar un código de muestra ...
Victor Athoti.
1
Para sql2014 y más allá, la DECLARE @BackupFiles...línea necesita una columna adicional:SnapshotURL nvarchar(360)
Fiat
3

En realidad, es un poco más simple que restaurar en el mismo servidor. Básicamente, simplemente recorre las opciones de "Restaurar base de datos". Aquí hay un tutorial para ti:

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 desee en su nuevo servidor y asígnele el nombre que desee y estará listo.

IAmTimCorey
fuente
Hola, Necesito restaurar a un mismo servidor, base de datos diferente ... (La restauración db tiene un nombre diferente)
LocustHorde
Lo siento, leí mal la pregunta. Se aplican los mismos principios básicos, solo debe asegurarse de que el nuevo nombre y los nombres de los archivos (mdf, ldf, etc.) sean diferentes.
IAmTimCorey
3

Si no existe una base de datos, uso 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
Konstantin Chernov
fuente
3
  • Tengo el mismo error que este tema cuando restauro una nueva base de datos usando una base de datos anterior. (el uso de .bak da el mismo error)

  • Cambié el nombre de la base de datos anterior por el nombre de la nueva base de datos (igual que esta imagen). Funcionó.

ingrese la descripción de la imagen aquí

Nguyen Duc Hai
fuente
2
La próxima vez, borre el nombre del banco
Danh
1

Aquí se explica cómo restaurar una copia de seguridad como una base de datos adicional con un nombre de base de datos único.

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

Primero, no tiene que desconectar su base de datos original. Pero por razones de seguridad, me gusta. En mi ejemplo, voy a montar un clon de mi base de datos de "facturación" y se llamará "billingclone".

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

2) Por seguridad, desconecté el original de la siguiente manera:

3) Abra una nueva ventana de consulta

**¡IMPORTANTE! ¡Mantenga esta ventana de consulta abierta hasta que haya terminado! ¡Necesita restaurar el db 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, rt haga clic en Bases de datos en el Explorador de objetos, elija "Restaurar base de datos"

4) ingrese un nuevo nombre en el campo "A la base de datos". IE billingclone

5) En Source for Restore, haga clic en "Desde el dispositivo" y haga clic en el botón ... navegar

6) Haga clic en Agregar y navegue hasta su copia de seguridad

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

8) luego seleccione la página OPCIONES en la esquina superior izquierda

9) Ahora edite los nombres de los archivos de la base de datos en RESTORE AS. Haga esto tanto para la base de datos como para el registro. IE billingclone.mdf y billingclone_log.ldf

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

11) Presiona actualizar en tu Object Explorer y verás tu nueva base de datos

12) Ahora puede volver a poner en línea su base de datos de facturación. Use la misma ventana de consulta que utilizó para desconectar la facturación. Usa 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!

gim
fuente
1
  1. haga una copia de su base de datos con la opción "copiar base de datos" con un nombre diferente
  2. copia de seguridad de la nueva base de datos copiada
  3. restaurarlo!
sedras
fuente