【问题标题】:Get list of SQL server databases which files have been deleted获取已删除文件的 SQL Server 数据库列表
【发布时间】:2018-08-24 07:58:28
【问题描述】:

我的目标是获取已删除文件的 SQL Server 数据库列表。 换句话说。我从挂载中附加了一个数据库,然后关闭了挂载,所以实际上我附加的数据库没有文件。

起初这似乎很容易。很简单的选择:

SELECT
   'DB_NAME' = db.name,
   'FILE_NAME' = mf.name,
   'FILE_TYPE' = mf.type_desc,
   'FILE_PATH' = mf.physical_name
FROM
   sys.databases db
INNER JOIN sys.master_files mf
   ON db.database_id = mf.database_id
WHERE
   --and specific condition here

但结果不同。 Sql server 具有关于常规数据库和没有文件的数据库的几乎相同的信息。所以我不得不尝试别的东西。

我还尝试使用state 的数据库。这很奇怪。 不幸的是,以下query 给了我错误(或不是实际信息):

SELECT state 
FROM sys.databases 
WHERE name = N'TestDB'

state
-----
0

0 表示ONLINE 根据这个link 但实际上数据库有RECOVERY_PENDING 状态。看起来关于我的 TestDB 我们的 sql 服务器信息已过时,应该刷新。但我不知道如何实现这一目标。但在执行以下任何查询后,此信息(db state)正在刷新:

EXEC sp_helpdb N'TestDB'
ALTER DATABASE N'TestDB' SET SINGLE_USER WITH ROLLBACK IMMEDIATE
USE N'TestDB'
--etc
--all requests are terminated with the same error

Msg 5120, Level 16, State 101, Line 10
Unable to open the physical file "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB.mdf". Operating system error 3: "3(The system cannot find the path specified.)".
File activation failure. The physical file name "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log.ldf" may be incorrect.
File activation failure. The physical file name "C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB_log-2.ldf" may be incorrect.
Msg 5181, Level 16, State 5, Line 10
Could not restart database "TestDB". Reverting to the previous status.
Msg 5069, Level 16, State 1, Line 10
ALTER DATABASE statement failed.

那么你有什么想法吗? 而且我还问过这个问题看起来像here 不同。

【问题讨论】:

  • 是存在于C:\MOUNT\b4c059e8-3ba6-425f-9a2a-f1713e7719ca\TestDB.mdf的.mdf文件吗?
  • @UdItSolanki 没有。我已经删除了它。所以附加了数据库,但所有文件都被删除了
  • 我测试了它。我删除了一个测试数据库的 mdf 文件。它应该显示 state = 3 用于恢复待处理的数据库
  • @UdItSolanki 您到底执行了哪些查询?以及你是如何删除数据库文件的?
  • 没有查询.. 停止服务后刚刚从文件资源管理器中删除了 mdf。你是怎么做到的?

标签: sql sql-server database tsql


【解决方案1】:

终于,我找到了我真正需要的东西。 我可以通过 sql server 检查特定文件是否存在:

CREATE FUNCTION dbo.fn_FileExists(@path varchar(512))
RETURNS BIT
AS
BEGIN
     DECLARE @result INT
     EXEC master.dbo.xp_fileexist @path, @result OUTPUT
     RETURN cast(@result as bit)
END;
GO

所以我只需要为每个我可以通过执行以下查询获得的文件执行上面的函数:

SELECT 
    DISTINCT 'FILE_PATH' = physical_name 
FROM sys.master_files

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多