Получить список данных и файлов журналов из отдельного файла SQL Server .mdf
Имеется отдельный файл первичных данных SQL Server (.mdf
) как вы можете получить список данных и файлов журналов, которые существуют внутри этого файла? Цель состоит в том, чтобы использовать Server.AttachDatabase
SMO метод для подключения базы данных. Но база данных может иметь несколько файлов данных и / или журналов, поэтому мне нужно получить список, чтобы добавить их в StringCollection
параметр метода.
Что мне нужно, это эквивалент select * from sys.files
для отдельного мдф. SQL Server Management Studio делает это, когда вы используете его для ручного подключения базы данных, поэтому я знаю, что это можно сделать.
3 ответа
Наконец-то понял это. Недокументированная команда DBCC checkprimaryfile(N'blah.mdf',3) выдает необходимую информацию.
Мне потребовалось некоторое время, чтобы найти его, но в 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)
}
Если это один файл MDF, если есть другие файлы MDF, я не думаю, что файл MDF может сказать вам об этом напрямую.
И вы всегда можете попробовать прикрепить файл MDF без файла журнала, используя CREATE DATABASE ... FOR ATTACH_REBUILD_LOG
вариант.
В SMO вы можете сделать это, используя AttachDatabase
указание метода RebuildLog
за AttachOptions
,
Конечно, все это предполагает, что файл.mdf исправен - его можно будет использовать, только если он был чисто отсоединен.
Вероятно, в Management Studio есть какой-то собственный способ чтения заголовков файлов, но они не документированы, и вы не сможете увидеть, что делает SSMS с помощью Profiler или чего-то подобного.
Если вы обычно создаете.mdf файлы для распространения, я настоятельно рекомендую вместо этого использовать резервное копирование / восстановление. Вы можете узнать больше о файле.BAK и файлах данных / журналов, которые представляет его база данных, используя документированные и общедоступные методы, такие как RESTORE FILELISTONLY
,