如何恢复对MDF和LDF文件使用相同命名方案的多个SQL Server数据库



我有一段C#代码,用于恢复SQL Server数据库。这很有效。问题是在另一个.bak文件上再次运行它。即使第二个备份的名称不同,它也需要写入与第一个备份相同的目录,并且.mdf.ldf文件的命名方案也相同。

我只是想知道是否有办法修改.mdf.ldf文件的命名方案,或者是否有其他方法在初始SQL Server目录下创建子目录,以便将这些文件还原到。

我当前收到的错误消息:

附加信息:无法覆盖文件XXXXXX.MDF。数据库XAXAXAXAX 正在使用它

我想我可以使用move语句,但我正在努力避免需要硬编码或记录在某个配置中的所有目录值。

string sql = "SELECT database_id FROM sys.databases WHERE Name = '"+yuy+"'";
SqlConnection con = new SqlConnection(@"" + singleconn.Replace(@"\", @""));
SqlCommand command = new SqlCommand(sql, con);
con.Open();
object resultObj = command.ExecuteScalar();
con.Close();
if (resultObj == null)
{
string sql2 = "Restore Database " + yuy + " FROM DISK = '" + @"" + localdir.Replace(@"\", @"") + @"" + FileName + "'";
SqlCommand command2 = new SqlCommand(sql2, con);
con.Open();
command2.ExecuteNonQuery();
con.Close();
con.Dispose();
File.Delete(@"" + localdir.Replace(@"\", @"") + @"" + FileName);
MessageBox.Show("Database recovered successfully!");
}
else
{
Random rnd = new Random();
int card = rnd.Next(52);
MessageBox.Show("There is already a database under this name; renaming the DB to " + yuy + card.ToString());
string sql2 = "Restore Database " + yuy + card.ToString() + " FROM DISK = '" + @"" + localdir.Replace(@"\", @"") + @"" + FileName + "'";
SqlCommand command2 = new SqlCommand(sql2, con);
con.Open();
command2.ExecuteNonQuery();
con.Close();
con.Dispose();
File.Delete(@"" + localdir.Replace(@"\", @"") + @"" + FileName);
MessageBox.Show("Database Recovered Successfully!");
}

多亏了scsimon,我才明白了这一点,现在我得到的关于错误的最后一件事就是这个。

附加信息:逻辑文件"XXXXXX.mdf"不是数据库"Databasename"的一部分。使用RESTORE FILELISTONLY列出逻辑文件名。

问题是,我直接从Databasename属性中提取了这一点。任何帮助都将不胜感激。

我只是想知道是否有办法修改.mdf和.ldf文件,或者是否有其他方法可以创建这些文件的初始SQL Server目录下的子目录已恢复到.

您可以按照RESTORE命令的建议使用MOVE子句来重命名和/或移动数据文件。它看起来像这样:

RESTORE DATABASE myDatabase FROM DISK = '\somedirsomeSubDirmybackup.bak'
WITH
MOVE 'datafile1' TO 'E:somedirnew_datafile2.mdf',
MOVE 'logfile'   TO 'Esomedirnew_log.ldf'

创建此操作是为了将文件从备份中的默认位置移动到另一个目录(您可以这样做),但也可以重命名它们。当然,你也会为你所有的.ndf做这件事。

我正在努力避免需要硬编码的所有目录值或者在某个地方登录了配置。

不用担心,只需使用HEADERONLY恢复数据库即可查看备份的内容,如名称、日期和其他有用信息。对于特定的文件路径,可以使用FILELISTONLY。这将防止您对它们进行硬编码。点击此处了解更多信息。

CREATE TABLE #DataFiles (LogicalName nvarchar(128)
,PhysicalName nvarchar(260)
,[Type] char(1)
,FileGroupName nvarchar(128) null
,Size numeric(20,0)
,MaxSize numeric(20,0)
,FileID bigint
,CreateLSN numeric(25,0)
,DropLSN numeric(25,0)
,UniqueID uniqueidentifier
,ReadOnlyLSN numeric(25,0) null
,ReadWriteLSN numeric(25,0) null
,BackupSizeInBytes bigint
,SourceBlockSize int
,FileGroupID int
,LogGroupGUID uniqueidentifier null
,DifferentialBaseLSN numeric(25,0) null
,DifferentialBaseGUID uniqueidentifier null
,IsReadOnly bit
,IsPresent bit
,TDEThumbprint varbinary(32) null
,SnapshotURL nvarchar(360) null
)
INSERT INTO #DataFiles
EXEC('RESTORE FILELISTONLY FROM DISK = ''E:DB BackupsYourBackup.bak''')
SELECT LogicalName, PhysicalName FROM #DataFiles
DROP TABLE #DataFiles

相关内容

最新更新