0

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

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

4

3 回答 3

2

如果是单个 MDF 文件,如果还有其他 MDF 文件,我认为 MDF 文件无法直接告诉您。

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

在 SMO 中,您可以使用AttachDatabase指定RebuildLogfor的方法来执行此操作AttachOptions

当然,这一切都假设 .mdf 文件是健康的——它只有在完全分离的情况下才能使用。

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

如果您通常为某种分发创建 .mdf 文件,我强烈建议您改用备份/恢复。您可以了解更多关于 .BAK 文件及其数据库所代表的数据/日志文件的信息,使用文档化和公开的方法,例如RESTORE FILELISTONLY.

于 2012-06-22T20:52:13.577 回答
1

终于想通了这个。未记录的命令 DBCC checkprimaryfile(N'blah.mdf',3) 提供了所需的信息。

于 2012-06-23T18:27:10.357 回答
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)
}

枚举分离的数据库文件结构

SMO 附加/分离配方

于 2015-01-17T21:24:29.293 回答