假设SQL Server 2005/2008具有大量数据库。有什么办法可以快速判断哪个数据库(如果有)连接到特定的.mdf文件?任何可以快速判断哪个数据库(如果有)连接到.mdf文件的方法?
随着时间的推移,我们放弃了一些数据库,并希望清理一些延迟的.mdf来清除服务器上的空间。目前我唯一知道的方法是在Management Studio中逐个查看每个数据库的属性,并列出它们所连接的文件的列表。寻找比这更有效的东西,如果有的话。
假设SQL Server 2005/2008具有大量数据库。有什么办法可以快速判断哪个数据库(如果有)连接到特定的.mdf文件?任何可以快速判断哪个数据库(如果有)连接到.mdf文件的方法?
随着时间的推移,我们放弃了一些数据库,并希望清理一些延迟的.mdf来清除服务器上的空间。目前我唯一知道的方法是在Management Studio中逐个查看每个数据库的属性,并列出它们所连接的文件的列表。寻找比这更有效的东西,如果有的话。
这可能有所帮助。
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
低科技解决方案...将mdf文件移动到另一个位置。如果连接,SQL服务器将不会让你动它:)
从命令提示符处
cd X:\TheDir\Where\MDF\File\Are
mkdir UnusedMdf
move *.mdf UnusedDBFiles
move *.ldf UnusedDBFiles
所有未使用的文件将被移动到UnusedDBFiles。
您也可以使用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
sys.master_files包含每个数据库都有一个排为第一个文件(ID = 1),该数据库。也就是说,系统表将始终列在FileID = 1为每个数据库
这就是你需要:
SELECT
DB_NAME(database_id), physical_name
FROM
sys.master_files
select db_name(database_id), * from sys.master_files
会列出所有系统上已知的数据库中的所有文件。
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;
}
如果您的SQL Server已关闭,会发生什么情况?我假设所有的文件被移动,然后你的服务器将无法重新启动... – Tony 2011-05-19 16:20:59
为什么会在SQL关闭时运行这样的事情,因为这样做的全部目的是找到我们正在使用的文件是** not **由SQL服务器。另外,如果有人犯了这个错误,这些文件只会被“移动”而不会被删除。把它们移回去! – 2011-05-19 16:26:35
低技术+1 – 2011-05-20 03:59:40