列出有关SQL Server中所有数据库文件的信息

是否可以列出有关SQL Server上所有数据库的文件(MDF / LDF)的信息?

我想获得一个列表,显示哪个数据库正在使用本地磁盘上的文件。

我试过的:

  • exec sp_databases所有数据库
  • select * from sys.databases显示了很多关于每个数据库的信息 – 但不幸的是它没有显示每个数据库使用的文件。
  • select * from sys.database_files显示master数据库的mdf / ldf文件 – 但不包括其他数据库

你可以使用sys.master_files 。

包含存储在主数据库中的每个数据库文件的行。 这是一个单一的系统范围的观点。

如果你想获得数据库的位置,你可以检查获取所有数据库位置 。
您可以使用sys.master_files获取db和sys.databse位置来获取db名称

 SELECT db.name AS DBName, type_desc AS FileType, Physical_Name AS Location FROM sys.master_files mf INNER JOIN sys.databases db ON db.database_id = mf.database_id 

我正在使用脚本来获得每个文件中的空白空间:

 Create Table ##temp ( DatabaseName sysname, Name sysname, physical_name nvarchar(500), size decimal (18,2), FreeSpace decimal (18,2) ) Exec sp_msforeachdb ' Use [?]; Insert Into ##temp (DatabaseName, Name, physical_name, Size, FreeSpace) Select DB_NAME() AS [DatabaseName], Name, physical_name, Cast(Cast(Round(cast(size as decimal) * 8.0/1024.0,2) as decimal(18,2)) as nvarchar) Size, Cast(Cast(Round(cast(size as decimal) * 8.0/1024.0,2) as decimal(18,2)) - Cast(FILEPROPERTY(name, ''SpaceUsed'') * 8.0/1024.0 as decimal(18,2)) as nvarchar) As FreeSpace From sys.database_files ' Select * From ##temp drop table ##temp 

大小以KB表示。

执行下面的sql(只有当你没有对同一个数据库有多个mdf / ldf文件时才能工作)

 SELECT db.name AS DBName, (select mf.Physical_Name FROM sys.master_files mf where mf.type_desc = 'ROWS' and db.database_id = mf.database_id ) as DataFile, (select mf.Physical_Name FROM sys.master_files mf where mf.type_desc = 'LOG' and db.database_id = mf.database_id ) as LogFile FROM sys.databases db 

将返回这个输出

 DBName DataFile LogFile
 -------------------------------------------------- ------------------------------
主C:\ .... \ master.mdf C:\ .... \ mastlog.ldf
 tempdb C:\ .... \ tempdb.mdf C:\ .... \ templog.ldf
模型C:\ .... \ model.mdf C:\ .... \ modellog.ldf

和其他数据库

你也可以试试这个。

  select db_name(dbid) dbname, filename from sys.sysaltfiles 

这个脚本列出了大部分你正在寻找的东西,希望能够根据你的需要进行修改。 请注意,它正在创build一个永久表 – 你可能想要改变它。 它是一个较大脚本的子集,它也汇总了各种服务器上的备份和作业信息。

 IF OBJECT_ID('tempdb..#DriveInfo') IS NOT NULL DROP TABLE #DriveInfo CREATE TABLE #DriveInfo ( Drive CHAR(1) ,MBFree INT ) INSERT INTO #DriveInfo EXEC master..xp_fixeddrives IF OBJECT_ID('[dbo].[Tmp_tblDatabaseInfo]', 'U') IS NOT NULL DROP TABLE [dbo].[Tmp_tblDatabaseInfo] CREATE TABLE [dbo].[Tmp_tblDatabaseInfo]( [ServerName] [nvarchar](128) NULL ,[DBName] [nvarchar](128) NULL ,[database_id] [int] NULL ,[create_date] datetime NULL ,[CompatibilityLevel] [int] NULL ,[collation_name] [nvarchar](128) NULL ,[state_desc] [nvarchar](60) NULL ,[recovery_model_desc] [nvarchar](60) NULL ,[DataFileLocations] [nvarchar](4000) ,[DataFilesMB] money null ,DataVolumeFreeSpaceMB INT NULL ,[LogFileLocations] [nvarchar](4000) ,[LogFilesMB] money null ,LogVolumeFreeSpaceMB INT NULL ) ON [PRIMARY] INSERT INTO [dbo].[Tmp_tblDatabaseInfo] SELECT @@SERVERNAME AS [ServerName] ,d.name AS DBName ,d.database_id ,d.create_date ,d.compatibility_level ,CAST(d.collation_name AS [nvarchar](128)) AS collation_name ,d.[state_desc] ,d.recovery_model_desc ,(select physical_name + ' | ' AS [text()] from sys.master_files m WHERE m.type = 0 and m.database_id = d.database_id ORDER BY file_id FOR XML PATH ('')) AS DataFileLocations ,(select sum(size) from sys.master_files m WHERE m.type = 0 and m.database_id = d.database_id) AS DataFilesMB ,NULL ,(select physical_name + ' | ' AS [text()] from sys.master_files m WHERE m.type = 1 and m.database_id = d.database_id ORDER BY file_id FOR XML PATH ('')) AS LogFileLocations ,(select sum(size) from sys.master_files m WHERE m.type = 1 and m.database_id = d.database_id) AS LogFilesMB ,NULL FROM sys.databases d WHERE d.database_id > 4 --Exclude basic system databases UPDATE [dbo].[Tmp_tblDatabaseInfo] SET DataFileLocations = CASE WHEN LEN(DataFileLocations) > 4 THEN LEFT(DataFileLocations,LEN(DataFileLocations)-2) ELSE NULL END ,LogFileLocations = CASE WHEN LEN(LogFileLocations) > 4 THEN LEFT(LogFileLocations,LEN(LogFileLocations)-2) ELSE NULL END ,DataFilesMB = CASE WHEN DataFilesMB > 0 THEN DataFilesMB * 8 / 1024.0 ELSE NULL END ,LogFilesMB = CASE WHEN LogFilesMB > 0 THEN LogFilesMB * 8 / 1024.0 ELSE NULL END ,DataVolumeFreeSpaceMB = (SELECT MBFree FROM #DriveInfo WHERE Drive = LEFT( DataFileLocations,1)) ,LogVolumeFreeSpaceMB = (SELECT MBFree FROM #DriveInfo WHERE Drive = LEFT( LogFileLocations,1)) select * from [dbo].[Tmp_tblDatabaseInfo] 

你可以使用下面的:

 SP_HELPDB [Master] GO