18

Recibo un error al usar SQL Server 2012 al restaurar una copia de seguridad realizada con una versión anterior (SQL Server 2008). De hecho, tengo varios archivos de copia de seguridad de la misma base de datos (tomados en diferentes momentos en el pasado). Los más nuevos se restauran sin ningún problema; Sin embargo, uno de ellos da el siguiente error:Error al restaurar la copia de seguridad de la base de datos

System.Data.SqlClient.SqlError: Directory lookup for the file "C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL.1\MSSQL\DATA\MYDB_ABC.MDF" failed with the operating system error 3(The system cannot find the path specified.). (Microsoft.SqlServer.SmoExtended)

Ésta es una máquina de 64 bits, y mi archivo (s) de base de datos se encuentran en esta ubicación: c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL.

No entiendo por qué se trata de restaurar el MSSQL.1 y no MSSQL11.MSSQLSERVER.

+3

Esto no tiene nada que ver con los problemas de versión. (El mensaje le dice que) – usr

+0

@marc_s, ¿por qué se sienten obligados a cambiar las preguntas? Pude entender el texto en negrita, pero no el título, la cita, la terminación, etc. –

+0

@usr, mencioné SQL Server 2012, porque los problemas no ocurren en las máquinas con SQL Serve 2008. Así que, supongo, hay una conexión. –

Respuesta

5

He logrado hacer esto desde el código. Esto no fue suficiente

Restore bkp = new Restore(); 
bkp.PercentCompleteNotification = 1; 
bkp.Action = RestoreActionType.Database; 
bkp.Database = sDatabase; 
bkp.ReplaceDatabase = true; 

La propiedad RelocateFiles debe ser llenado con los nombres y las rutas de los archivos para ser reubicados. Para cada archivo, debe especificar el nombre del archivo y la nueva ruta física. Entonces, lo que hice fue mirar el PrimaryFilePath de la base de datos que estaba restaurando, y usar eso como la ubicación física. Algo como esto:

if (!string.IsNullOrEmpty(sDataFileName) && !File.Exists(sDataFileName)) 
{ 
    if (originaldb != null) 
    { 
     if (string.Compare(Path.GetDirectoryName(sDataFileName), originaldb.PrimaryFilePath, true) != 0) 
     { 
     string sPhysicalDataFileName = Path.Combine(originaldb.PrimaryFilePath, sDatabase + ".MDF"); 
     bkp.RelocateFiles.Add(new RelocateFile(sLogicalDataFileName, sPhysicalDataFileName)); 
     }     
    } 
} 

Lo mismo para el archivo de registro.

+0

Usted sabe, C# también puede construir y enviar un comando RESTORE DATABASE. –

+0

Sí. Tenía este código que funcionaba bien, hasta que probamos SQL Server 2012. Así que tuve que hacer algunas correcciones para que funcione.No sé lo que cambió en 2012 para que no funcione como en 2008. –

+0

Nada, excepto que sus caminos fueron diferentes, eso es todo. No tiene nada que ver con la versión. Lo mismo hubiera sucedido si tuviera diferentes instancias con nombre de SQL Server 2008. –

31

Parece que la copia de seguridad se tomó en una máquina cuyas rutas no coinciden con las suyas. Intente realizar la copia de seguridad utilizando T-SQL en lugar de la IU. También asegúrese de que las rutas que está especificando realmente existan y de que no haya una copia de estos archivos mdf/ldf allí.

RESTORE DATABASE MYDB_ABC FROM DISK = 'C:\path\file.bak' 
WITH MOVE 'mydb' TO 'c:\valid_data_path\MYDB_ABC.mdf', 
MOVE 'mydb_log' TO 'c:\valid_log_path\MYDB_ABC.ldf'; 
+0

la copia de seguridad se tomó en otra máquina sí. Estoy restaurando desde el código, pero obtengo el mismo resultado cuando lo hago desde la IU de SQL Server 2012. No hay problemas en máquinas con SQL Server 2008 –

+0

en mi SQL Server 2012 (máquina 1) la ubicación predeterminada de la base de datos es C: \ Archivos de programa \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ DATA. en SQL Server 2008 (máquina 2), la ubicación de la base de datos predeterminada es C: \ Archivos de programa \ Microsoft SQL Server \ MSSQL10_50.MARIUSPC \ MSSQL \ DATA. La restauración de la misma detabase falla con SQL Server 2012 pero tiene éxito con SQL Server 2008. Entonces, ¿cuál es la configuración que dice "si la ubicación predeterminada de la copia de seguridad" no está disponible en esta máquina, use el valor predeterminado? Porque eso es lo que parece que sucede con 2008 –

+0

thx, esto lo resolvió para mí – nozzleman

7

La copia de seguridad almacena la ubicación original de los archivos de la base de datos y, de forma predeterminada, intenta restaurar a la misma ubicación. Como la instalación de su nuevo servidor está en nuevos directorios y, presumiblemente, los directorios antiguos ya no existen, debe modificar los directorios de los valores predeterminados para que coincidan con la ubicación que desea utilizar.

Dependiendo de cómo esté restaurando la base de datos, la forma de hacerlo será diferente. Si está utilizando SSMS, revise las pestañas y listas hasta que encuentre la lista de archivos y sus ubicaciones de discos asociadas; a continuación, puede editar esas ubicaciones antes de restaurarlas.

+0

Puedo reproducir esto con SSMS, pero en realidad estoy haciendo la restauración desde el código (C#). –

-1

Cambie la ruta de archivo .mdf. Simplemente cree una carpeta en cualquier unidad, es decir, en la unidad "D", simplemente cree una carpeta con nombre personalizado (dbase) y señale la ruta a la nueva carpeta, mssql creará automáticamente los archivos.

"C: \ ARCHIVOS DE PROGRAMA \ MICROSOFT SQL SERVER \ MSSQL.1 \ MSSQL \ DATA \ MYDB_ABC.MDF" a "D: \ Dbase \ MYDB_ABC.MDF"

3

que tenían el mismo problema, y esto lo arreglaron sin ningún código C#:

USE [master] 
ALTER DATABASE [MyDb] 
SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
RESTORE DATABASE [MyDb] 
FROM DISK = N'D:\backups\mydb.bak' 
WITH FILE = 1, 
MOVE N'MyDb' TO N''c:\valid_data_path\MyDb.mdf', 
MOVE N'MyDb_log' TO N'\valid_log_path\MyDb.ldf', 
NOUNLOAD, 
REPLACE, 
STATS = 5 
ALTER DATABASE [MyDb] SET MULTI_USER 

GO

+0

Esto también funcionó para mí. La base de datos de la que hice una copia de seguridad tenía diferentes rutas que la base de datos de destino. Parece que en situaciones como esta, debe usar las opciones MOVER cuando ejecuta RESTORE DATABASE. Cuando agregué las opciones de MOVER para ambos archivos que proporcionan las ubicaciones en la base de datos de destino (la mencionada en el comando RESTAURAR), la restauración se completó con éxito. –

+0

Estoy usando un comando de restauración similar a este, con MOVE e incluso bloqueo de usuario único, pero la base de datos todavía se queja de no encontrar archivos en la ubicación de la máquina anterior (como en OP). Sin embargo, una vez que he hecho una restauración manual una vez, puedo ejecutar el script sin problemas. Tal vez, tengo un problema diferente ... Estoy acostumbrado a resolver problemas de Microsoft con métodos torpes, así que ... – Erk

+0

Tal vez el administrador SQL necesita ejecutarse como administrador. Es posible que no pueda crear los archivos. También puede intentar crear archivos mdf y ldf vacíos en la ubicación MOVE. Supongo que son esos archivos a los que te refieres. –

0

favor intente desactivar la opción “del final del registro de copia de seguridad” en la página Opciones de la base de datos de diálogo Restaurar

+0

Él ya ha aceptado una respuesta, por lo que su problema resuelto :-) –

0

Hay algún problema de versión en esto. Puede migrar su base de datos a 2012 por 2 otros métodos: -

1) desconecte la base de datos> copie los archivos .mdf y .ldf a la carpeta de datos del servidor de destino y adjunte la base de datos.consulte la siguiente: - https://dba.stackexchange.com/questions/30440/how-do-i-attach-a-database-in-sql-server

2) crear un script de toda la base de datos con el esquema & de datos y ejecutar en el servidor de destino (proceso muy lento lleva tiempo). refiérase a esto: - Generate script in SQL Server Management Studio

0

Pruebe reiniciar el servicio SQL. Trabajó para mi.

2

Como ya se ha dicho algunas veces, la restauración de una copia de seguridad donde las rutas nuevas y antiguas para los archivos mdf y ldf no coinciden puede causar este error. Ya hay varios buenos ejemplos de cómo lidiar con eso con SQL, pero ninguno funcionó para mí hasta que me di cuenta de que en mi caso necesitaba incluir las extensiones '.mdf' y '.ldf' en la parte de la declaración 'Mover', por ejemplo:

RESTORE DATABASE [SomeDB] 
FROM DISK = N'D:\SomeDB.bak' 
WITH MOVE N'SomeDB.mdf' TO N'D:\SQL Server\MSSQL12.MyInstance\MSSQL\DATA\SomeDB.mdf', 
MOVE N'SomeDb_log.ldf' TO N'D:\SQL Server\MSSQL12.MyInstance\MSSQL\DATA\SomeDB_log.ldf' 

esperanza que salva a alguien algo de dolor, no podía entender por qué SQL estaba sugiriendo que necesitaba usar la opción WITH MOVE cuando ya lo estaba haciendo.

0

Al restaurar, en Archivos, compruebe 'trasladar todos los archivos a la carpeta'

check 'Relocate all files to folder'

0

Sólo en caso de que esto sea útil para alguien que trabaja directamente con Powershell (usando la biblioteca SMO), en este caso particular también había archivos de datos secundarios. Mejoré el guión un poco matando cualquier proceso abierto y luego haciendo la restauración.

Import-module SQLPS 
$svr = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "server name"; 
$svr.KillAllProcesses("database_name"); 
$RelocateData1 = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("primary_logical_name","C:\...\SQLDATA\DATA\database_name.mdf") 
$RelocateData2 = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("secondary_logical_name_2","C:\...\SQLDATA\DATA\secondary_file_2.mdf") 
$RelocateData3 = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("secondary_logical_name_3","C:\...\SQLDATA\DATA\secondary_file_3.mdf") 
$RelocateLog = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("database_name_log","C:\...\SQLDATA\LOGS\database_name_log.ldf") 
Restore-SqlDatabase -ServerInstance "server-name" -Database "database_name" -BackupFile "\\BACKUPS\\database_name.bak" -RelocateFile @($RelocateData1, $RelocateData2, $RelocateData3, $RelocateLog) -ReplaceDatabase 
Cuestiones relacionadas