假设SQL Server 2005/2008具有大量数据库。有没有办法快速判断哪个数据库(如果有)附加到特定的.mdf文件?
我们已经删除了一些数据库,并希望清理一些挥之不去的.mdf来清理服务器上的空间。目前,我所知道的唯一方法是在Management Studio中逐个查看每个数据库的属性,并列出它们附加到的文件。寻找比这更有效的东西,如果有的话。
答案 0 :(得分:9)
这可能有所帮助。
declare @files table (
db_name sysname,
physical_name nvarchar(260)
)
insert into @files
exec sp_MSforeachdb 'select "?", physical_name from ?.sys.database_files'
select db_name, physical_name
from @files
答案 1 :(得分:9)
sys.master_files每个数据库包含一行。也就是说,对于每个数据库,系统表总是在fileid = 1中
这就是你所需要的:
SELECT
DB_NAME(database_id), physical_name
FROM
sys.master_files
答案 2 :(得分:3)
您也可以使用OrcaMDF:
using (var file = new MdfFile(@"C:\Database.mdf"))
{
var bootPage = file.GetBootPage();
Console.WriteLine(bootPage.DatabaseName);
}
这将允许您查询mdf的数据库名称,而无需将它们附加到数据库服务器。请注意,这应该在主数据文件上完成,以防有多个文件。免责声明 - 我是OrcaMDF的作者。
循环遍历数据目录中的所有文件,很容易将它与sys.databases连接起来,看看哪些文件不匹配,因此是非附加的mdf文件。
修改:在我的博客上发布了一个更全面的示例:http://improve.dk/archive/2011/05/19/checking-which-database-is-stored-in-a-deattached-mdf-file.aspx
答案 3 :(得分:3)
select db_name(database_id), * from sys.master_files
将列出系统中已知的所有数据库的所有文件。
答案 4 :(得分:1)
低科技解决方案......将mdf文件移动到另一个位置。如果它被附加,SQL服务器将不允许你移动它:)
从命令提示符
cd X:\TheDir\Where\MDF\File\Are
mkdir UnusedMdf
move *.mdf UnusedDBFiles
move *.ldf UnusedDBFiles
所有未使用的文件都将被移动到UnusedDBFiles。
答案 5 :(得分:0)
private bool IsDbAttached()
{
const string isAttachedSqL = @"SELECT count(*)
FROM sys.master_files
WHERE DB_NAME(database_id) = @DbName";
bool isAttached = false;
try
{
using (var connection = new SqlConnection(this.connectionString))
using (var command = new SqlCommand(isAttachedSqL, connection))
{
command.Parameters.Add("@DbName", SqlDbType.VarChar).Value = "dbName";
connection.Open();
var count = command.ExecuteScalar();
isAttached = (int)count > 0;
}
}
catch
{
throw;
}
return isAttached;
}