Listing information about all database files in SQL Server

后端 未结 13 2104
遥遥无期
遥遥无期 2021-02-01 00:08

Is it possible to list information about the files (MDF/LDF) of all databases on an SQL Server?

I\'d like to get a list showing which database is using what files on th

相关标签:
13条回答
  • 2021-02-01 00:30

    I've created this query:

    SELECT 
        db.name AS                                   [Database Name], 
        mf.name AS                                   [Logical Name], 
        mf.type_desc AS                              [File Type], 
        mf.physical_name AS                          [Path], 
        CAST(
            (mf.Size * 8
            ) / 1024.0 AS DECIMAL(18, 1)) AS         [Initial Size (MB)], 
        'By '+IIF(
                mf.is_percent_growth = 1, CAST(mf.growth AS VARCHAR(10))+'%', CONVERT(VARCHAR(30), CAST(
            (mf.growth * 8
            ) / 1024.0 AS DECIMAL(18, 1)))+' MB') AS [Autogrowth], 
        IIF(mf.max_size = 0, 'No growth is allowed', IIF(mf.max_size = -1, 'Unlimited', CAST(
            (
                    CAST(mf.max_size AS BIGINT) * 8
            ) / 1024 AS VARCHAR(30))+' MB')) AS      [MaximumSize]
    FROM 
         sys.master_files AS mf
         INNER JOIN sys.databases AS db ON
                db.database_id = mf.database_id
    
    0 讨论(0)
  • 2021-02-01 00:32

    just adding my 2 cents .

    if specifically looking to find total free space only in Data files or only in Log files in all the databases, we can use "data_space_id" column. 1 is for data files and 0 for log files.

    CODE:

    Create Table ##temp
    (
        DatabaseName sysname,
        Name sysname,
        spacetype sysname,
        physical_name nvarchar(500),
        size decimal (18,2),
        FreeSpace decimal (18,2)
    )   
    Exec sp_msforeachdb '
    Use [?];
    
    Insert Into ##temp (DatabaseName, Name,spacetype, physical_name, Size, FreeSpace)
        Select DB_NAME() AS [DatabaseName], Name,   ***data_space_id*** , physical_name,
        Cast(Cast(Round(cast(size as decimal) * 8.0/1024.0,2) as decimal(18,2))/1024 as nvarchar) SizeGB,
        Cast(Cast(Round(cast(size as decimal) * 8.0/1024.0,2)/1024 as decimal(18,2)) -
            Cast(FILEPROPERTY(name, ''SpaceUsed'') * 8.0/1024.0 as decimal(18,2))/1024 as nvarchar) As FreeSpaceGB
        From sys.database_files'
    
    
    select  
        databasename
        , sum(##temp.FreeSpace) 
    from 
        ##temp 
    where 
        ##temp.spacetype = 1  
    group by 
        DatabaseName
    
    drop table ##temp 
    
    
    0 讨论(0)
  • 2021-02-01 00:34

    Executing following sql (It will only work when you don't have multiple mdf/ldf files for same database)

    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
    

    will return this output

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

    and rest of the databases

    If your TempDB's have multiple MDF's (like mine have), this script will fail. However, you can use

    WHERE db.database_id > 4
    

    at the end and it will return all databases except system databases.

    0 讨论(0)
  • 2021-02-01 00:37

    Using this script you can show all the databases name and files used (with exception of system dbs).

    select name,physical_name from sys.master_files where database_id > 4
    
    0 讨论(0)
  • 2021-02-01 00:40

    This script lists most of what you are looking for and can hopefully be modified to you needs. Note that it is creating a permanent table in there - you might want to change it. It is a subset from a larger script that also summarises backup and job information on various servers.

    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] 
    
    0 讨论(0)
  • 2021-02-01 00:40

    You can use the below:

    SP_HELPDB [Master]
    GO
    
    0 讨论(0)
提交回复
热议问题