2012-02-22 22 views
12

Necesito programar (T-SQL) restaurar una copia de seguridad de la base de datos en SQL Server 2008. Esta copia de seguridad proviene de un servidor diferente y el nombre de la base de datos original puede haber sido diferente también. (En efecto, estoy copiando una base de datos de algún servidor a una nueva base de datos en otro servidor).¿Cómo restaurar una copia de seguridad de la base de datos de SQL Server sin conocer la ruta de destino o los nombres de archivo?

Aparentemente, tengo que usar RESTORE DATABASE ... WITH MOVE, que funciona, pero necesitaría saber dónde deberían restaurarse los archivos y cómo deberían ser nombrados. A pesar de la búsqueda, no he encontrado lo que parecería ser la tarea más básica: simplemente use la ruta predeterminada y los nombres de archivo, es decir, haga lo que haga el SQL Server cuando emita un CREATE DATABASE; no tiene que especificar la ruta para ese comando, entonces ¿por qué es necesario para un RESTORE?

¿He pasado por alto alguna solución trivial, o realmente tendré que enumerar los archivos, de alguna manera encontrar el directorio de la base de datos desde la configuración de SQL Server, y usar esa información para construir el comando RESTORE? Gracias.

(Comparando con PostgreSQL, donde al usar pg_restore, especifica una base de datos de destino que ya está creada, y cuando la estaba creando tenía la opción -no obligatoria- de especificar un espacio de tabla no predeterminado, pero si no lo hacía 't, simplemente no le importa dónde se almacenan físicamente los archivos.)

Respuesta

0

Si quiere decir usar la opción Nueva base de datos de Management Studio, entonces establece valores predeterminados. Pero el T-SQL para CREATE DATABASE todavía requiere las rutas. Puede ver esto yendo al estudio de administración, seleccione Nueva base de datos, ingrese el nuevo nombre y haga clic en el botón Script. Este botón le proporcionará el T-SQL que ejecutará SQL Server. Este proceso en realidad no se ejecuta, por lo que puede cancelar el asistente de Nueva base de datos.

También hay un botón similar cuando restaura. Entonces, si ya tiene toda la información y solo necesita el T-SQL, acceda al estudio de administración para hacer una restauración, pero en lugar de hacer clic en Aceptar para ejecutar el proceso, haga clic en el botón Script que generará el T-SQL con el valor predeterminado valores.

Espero que esto ayude.

2

usted tiene que leer registrarse, como

DECLARE @Result NVARCHAR(4000) 
EXECUTE [master].[dbo].xp_instance_regread 
N'HKEY_LOCAL_MACHINE', 
N'Software\Microsoft\MSSQLServer\MSSQLServer',N'BackupDirectory', 
@Result OUTPUT, 
'NO_OUTPUT' 
SELECT @Result 
+0

Bienvenido a StackOverflow: si publica código, XML o muestras de datos, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "muestras de código" ('{}') en la barra de herramientas del editor formato y sintaxis resaltarlo! –

1

escribí una función hace un tiempo, que lo hace por usted. Es compatible con todas las versiones de SQL Server, incluidas las instalaciones con instancia predeterminada y las instancias con nombre. See here for the code and an example

Para realizar la restauración, llamará a la función como se muestra a continuación.

declare @sql nvarchar(2000), 
     @data varchar(260), 
     @log varchar(260); 

select @data = dbo.fn_get_default_path(0), 
     @log = dbo.fn_get_default_path(1) 

SELECT @sql= 'RESTORE DATABASE DefaultLocationDB 
FROM DISK = N''c:\backups\DemoDB.bak'' WITH FILE = 1, 
MOVE N''demo_data_device'' TO N''' + @data + '\DemoDb.ldf'', 
MOVE N''demo_log_device'' TO N''' + @log + '\DemoDb.ldf'', 
NOUNLOAD, REPLACE' 

exec (@sql) 
+0

El enlace al código ha caducado – gvee

+0

He reparado el enlace. –

4

el comando Crear base de datos será crear la base de datos con las rutas predeterminadas, para que pueda crear una base de datos a continuación, restaurar sobre él, usando la sintaxis sustituir (modo sqlcmd):

:setvar DatabaseName MyDatabase 
declare @fileName varchar(255) 
set @fileName = 'c:\backup\mybackup.bak' 

if db_id('$(DatabaseName)') is null 
      CREATE DATABASE [$(DatabaseName)] 

RESTORE DATABASE [$(DatabaseName)] 
FROM DISK = @fileName 
WITH REPLACE 
+2

luego pruebo esto en sqlcmd o SQL Query obtengo: 'File 'MyDBnameHere' no se puede restaurar a 'M: \ myOLDserverPath \ MyDBnameHere.mdf'. Use WITH MOVE para identificar una ubicación válida para el archivo. – Tilo

+0

Esto no funcionó para mí. –

5

Para los futuros empleados de Google; de SQL Server 2012 en adelante que puede utilizar:

SELECT ServerProperty(N'InstanceDefaultDataPath') AS default_file 
    , ServerProperty(N'InstanceDefaultLogPath') AS default_log 
; 

Esto lee las rutas de las carpetas que aparecen en las propiedades del servidor> Propiedades de la base> Lugares base de datos predeterminada

Server Properties > Database Settings

0

Como se ha mencionado, CREATE DATABASE crea archivos en la ubicación predeterminada. entonces usted puede encontrar caminos de esos archivos y utilizar las de la parte RESTORE

-- Database will be created in default location 
CREATE DATABASE [MyRestoredDatabase] 

DECLARE @mdfFile VARCHAR(MAX) 
DECLARE @ldfFile VARCHAR(MAX) 

SELECT @mdfFile = physical_name 
FROM sys.master_files 
WHERE database_id = DB_ID('MyRestoredDatabase') 
AND file_id = 1 

SELECT @ldfFile = physical_name 
FROM sys.master_files 
WHERE database_id = DB_ID('MyRestoredDatabase') 
AND file_id = 2 

-- Overwrite known files of the new database from restore 
RESTORE DATABASE [MyRestoredDatabase] 
FROM DISK='C:\Path\To\OriginalDatabase.bak' 
WITH REPLACE, 
    MOVE 'OriginalDatabase' TO @mdfFile, 
    MOVE 'OriginalDatabase_Log' TO @ldfFile 

Si necesita averiguar los nombres lógicos, el uso de SQL siguiente

RESTORE FILELISTONLY 
FROM DISK='C:\Path\To\MyRestoredDatabase.bak' 

totalmente script automatizado se puede encontrar here

1

Tuve que hacer esto yo mismo y terminé combinando algunas respuestas para crear una sola secuencia de comandos que restaura una base de datos (cualquier base de datos) y reasigna los archivos. Todo lo que debe saber es la ruta del archivo de respaldo y el nuevo nombre de la base de datos. Desafortunadamente, no parece que haya soluciones breves a este problema.

DECLARE @Source nvarchar(max) = 'C:\backup.bak' 
DECLARE @RestoreDestination nvarchar(max) = 'NewDatabaseName' 

--https://stackoverflow.com/a/27893494/5734516 
--https://stackoverflow.com/a/4018782/5734516 
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 
) 

DECLARE @QueryCommand nvarchar(max) = 
'RESTORE FILELISTONLY FROM DISK = N''' + REPLACE(@Source, '''', '''''') + ''' WITH NOUNLOAD' 

INSERT INTO @fileListTable 
EXEC(@QueryCommand) 


--https://stackoverflow.com/a/2014673/5734516 
DECLARE @filepath NVARCHAR(260) 
EXEC master.dbo.xp_instance_regread 
     N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', 
     N'DefaultData', 
     @filepath output, 'no_output' 


DECLARE @Command nvarchar(max) 
SET @Command = 'RESTORE DATABASE ' + QUOTENAME(@RestoreDestination) + ' ' 
       + ' FROM DISK=N''' + REPLACE(@Source, '''', '''''') + ''' ' 
       + 'WITH FILE=1 ' 
SELECT 
    @Command = @Command + ',MOVE N''' + REPLACE(LogicalName, '''', '''''') + '''' 
    + ' TO N''' 
     + REPLACE(@filepath + '\' + @RestoreDestination + case when FileID = 1 then '.mdf' when Type = 'L' then '_' + CAST(FileID as varchar(max)) + '.ldf' else '_' + CAST(FileID as varchar(max)) + '.ndf' end, '''', '''''') 
    + '''' 
FROM @fileListTable 

SELECT @Command 
EXEC(@Command) 

Nota: Sé que esta es una publicación anterior, aunque podría ser útil para alguien más.

Cuestiones relacionadas