有什么方法可以快速判断哪个数据库(如果有)附加到.mdf文件?

时间:2011-05-19 16:04:00

标签: sql sql-server sql-server-2005 sql-server-2008 mdf

假设SQL Server 2005/2008具有大量数据库。有没有办法快速判断哪个数据库(如果有)附加到特定的.mdf文件?

我们已经删除了一些数据库,并希望清理一些挥之不去的.mdf来清理服务器上的空间。目前,我所知道的唯一方法是在Management Studio中逐个查看每个数据库的属性,并列出它们附加到的文件。寻找比这更有效的东西,如果有的话。

6 个答案:

答案 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)

对于该数据库的第一个文件(id = 1),

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;

        }