从分离的SQL Server .mdf文件中获取数据和日志文件的列表

时间:2012-06-22 20:47:47

标签: sql-server smo

给定一个分离的SQL Server主数据文件(.mdf)如何获取该文件中存在的数据和日志文件列表?目标是使用Server.AttachDatabase SMO方法附加数据库。但是数据库可能有多个数据和/或日志文件,因此我需要获取列表以将它们添加到方法的StringCollection参数中。

对于分离的mdf,我需要的是等效的select * from sys.files。 SQL Server Management Studio在您使用它手动附加数据库时执行此操作,因此我知道可以完成此操作。

3 个答案:

答案 0 :(得分:2)

如果它是单个MDF文件,如果有其他MDF文件,我不认为MDF文件可以直接告诉您。

使用CREATE DATABASE ... FOR ATTACH_REBUILD_LOG选项,您始终可以尝试附加没有日志文件的MDF文件。

在SMO中,您可以使用为AttachDatabase指定RebuildLog的{​​{3}}方法执行此操作。

当然这一切都假定.mdf文件是健康的 - 只有在干净地分离时它才可用。

Management Studio可能有一些专有的方式来读取文件头,但这些都没有记录,您无法使用Profiler等查看SSMS正在做什么。

如果您通常创建.mdf文件以进行某种分发,我强烈建议您使用备份/恢复。您可以使用文档化和公共方法(如AttachOptions)了解有关.BAK文件及其数据库所代表的数据/日志文件的更多信息。

答案 1 :(得分:1)

最后想出了这个。未记录的命令DBCC checkprimaryfile(N'blah.mdf',3)给出了所需的信息。

答案 2 :(得分:1)

我花了一段时间才找到它,但在SMO中,你使用了EnumDetachedLogFiles和EnumDetachedLogFiles。

# PowerShell
$servername = "sqlserver\instance"
$mdf = "S:\DATA\mydb.mdf"

[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
$filestructure = New-Object System.Collections.Specialized.StringCollection
$server = New-Object Microsoft.SqlServer.Management.Smo.Server $servername

# Here you can automatically determine the database name, or set it manually
$dbname = ($server.DetachedDatabaseInfo($mdf) | Where { $_.Property -eq "Database name" }).Value

foreach    ($file in $server.EnumDetachedDatabaseFiles($mdf)) {
    $null = $filestructure.add($file)
}

foreach ($file in $server.EnumDetachedLogFiles($mdf)) {
    $null = $filestructure.add($file)
}

Enumerate detached database file structures

SMO Attach/Detach Recipes