2011-05-19 25 views
5

假设SQL Server 2005/2008具有大量数据库。有什么办法可以快速判断哪个数据库(如果有)连接到特定的.mdf文件?任何可以快速判断哪个数据库(如果有)连接到.mdf文件的方法?

随着时间的推移,我们放弃了一些数据库,并希望清理一些延迟的.mdf来清除服务器上的空间。目前我唯一知道的方法是在Management Studio中逐个查看每个数据库的属性,并列出它们所连接的文件的列表。寻找比这更有效的东西,如果有的话。

回答

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

低科技解决方案...将mdf文件移动到另一个位置。如果连接,SQL服务器将不会让你动它:)

从命令提示符处

cd X:\TheDir\Where\MDF\File\Are 
mkdir UnusedMdf 
move *.mdf UnusedDBFiles 
move *.ldf UnusedDBFiles 

所有未使用的文件将被移动到UnusedDBFiles。

+0

如果您的SQL Server已关闭,会发生什么情况?我假设所有的文件被移动,然后你的服务器将无法重新启动... – Tony 2011-05-19 16:20:59

+0

为什么会在SQL关闭时运行这样的事情,因为这样做的全部目的是找到我们正在使用的文件是** not **由SQL服务器。另外,如果有人犯了这个错误,这些文件只会被“移动”而不会被删除。把它们移回去! – 2011-05-19 16:26:35

+0

低技术+1 – 2011-05-20 03:59:40

3

您也可以使用OrcaMDF此:

using (var file = new MdfFile(@"C:\Database.mdf")) 
{ 
    var bootPage = file.GetBootPage(); 
    Console.WriteLine(bootPage.DatabaseName); 
} 

这将允许您查询密度板对他们的数据库名称,而不将它们连接到数据库服务器。请注意,这应该在主数据文件上完成,以防有多个文件。免责声明 - 我是OrcaMDF的作者。

通过循环访问数据目录中的所有文件,可以很容易地将它与sys.databases结合起来,并查看哪些不匹配,因此是非附加的mdf文件。

编辑:发布在我的博客更彻底的例子:http://improve.dk/archive/2011/05/19/checking-which-database-is-stored-in-a-deattached-mdf-file.aspx

8

sys.master_files包含每个数据库都有一个排为第一个文件(ID = 1),该数据库。也就是说,系统表将始终列在FileID = 1为每个数据库

这就是你需要:

SELECT 
    DB_NAME(database_id), physical_name 
FROM 
    sys.master_files 
3
select db_name(database_id), * from sys.master_files 

会列出所有系统上已知的数据库中的所有文件。

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; 

     } 
相关问题