Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 列出有关SQL Server中所有数据库文件的信息_Sql Server_Sql Server 2008_Tsql_Database Management - Fatal编程技术网

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

Sql server 列出有关SQL Server中所有数据库文件的信息,sql-server,sql-server-2008,tsql,database-management,Sql Server,Sql Server 2008,Tsql,Database Management,是否可以列出有关SQL Server上所有数据库的文件(MDF/LDF)的信息 我想得到一个列表,显示哪个数据库正在使用本地磁盘上的哪些文件 我尝试的是: exec sp_数据库所有数据库 select*from sys.databases显示了有关每个数据库的大量信息,但不幸的是,它没有显示每个数据库使用的文件 select*from sys.database_files显示master数据库的mdf/ldf文件,但不显示其他数据库 您可以使用 包含存储在主数据库中的数据库的每个文件的一行

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

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

我尝试的是:

  • exec sp_数据库
    所有数据库
  • select*from sys.databases
    显示了有关每个数据库的大量信息,但不幸的是,它没有显示每个数据库使用的文件
  • select*from sys.database_files
    显示
    master
    数据库的mdf/ldf文件,但不显示其他数据库
    • 您可以使用

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


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

      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表示。

      如果您想获得数据库的位置,可以检查。
      您可以使用
      sys.master_文件
      获取数据库的位置,并使用
      sys.database
      获取数据库名称

      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
      
      执行以下sql(仅当同一数据库中没有多个mdf/ldf文件时,它才起作用)

      将返回此输出

      DBName       DataFile                     LogFile
      --------------------------------------------------------------------------------
      master       C:\....\master.mdf           C:\....\mastlog.ldf
      tempdb       C:\....\tempdb.mdf           C:\....\templog.ldf
      model        C:\....\model.mdf            C:\....\modellog.ldf
      
      和其他数据库

      如果您的TempDB有多个MDF(像我的一样),此脚本将失败。 但是,您可以使用

      WHERE db.database_id > 4
      
      最后,它将返回除系统数据库之外的所有数据库。

      您可以使用以下命令:

      SP_HELPDB [Master]
      GO
      

      你也可以试试这个

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

      这个脚本列出了您正在寻找的大部分内容,希望可以根据您的需要进行修改。请注意,它正在其中创建一个永久表-您可能需要更改它。它是一个较大脚本的子集,该脚本还总结了各种服务器上的备份和作业信息

      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] 
      

      如果其中一个数据库中使用了多个数据文件(例如“.ndf”文件类型),则查询将出错

      这是一个使用联接而不是子查询的查询版本

      干杯

      SELECT
          db.name AS DBName,
          db.database_id,
          mfr.physical_name AS DataFile,
          mfl.physical_name AS LogFile
      FROM sys.databases db
          JOIN sys.master_files mfr ON db.database_id=mfr.database_id AND mfr.type_desc='ROWS'
          JOIN sys.master_files mfl ON db.database_id=mfl.database_id AND mfl.type_desc='LOG'
      ORDER BY db.database_id
      

      我已创建此查询:

      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
      

      以下脚本可用于获取以下信息: 1.数据库大小信息 2.文件空间信息 3.自生 4.恢复模型 5.日志\u重用\u备份信息

      CREATE TABLE #tempFileInformation
      (
      DBNAME          NVARCHAR(256),
      [FILENAME]      NVARCHAR(256),
      [TYPE]          NVARCHAR(120),
      FILEGROUPNAME   NVARCHAR(120),
      FILE_LOCATION   NVARCHAR(500),
      FILESIZE_MB     DECIMAL(10,2),
      USEDSPACE_MB    DECIMAL(10,2),
      FREESPACE_MB    DECIMAL(10,2),
      AUTOGROW_STATUS NVARCHAR(100)
      )
      GO
      
      DECLARE @SQL VARCHAR(2000)
      
      SELECT @SQL = '
       USE [?]
                  INSERT INTO #tempFileInformation
                  SELECT  
                      DBNAME          =DB_NAME(),     
                      [FILENAME]      =A.NAME,
                      [TYPE]          = A.TYPE_DESC,
                      FILEGROUPNAME   = fg.name,
                      FILE_LOCATION   =a.PHYSICAL_NAME,
                      FILESIZE_MB     = CONVERT(DECIMAL(10,2),A.SIZE/128.0),
                      USEDSPACE_MB    = CONVERT(DECIMAL(10,2),(A.SIZE/128.0 - ((A.SIZE - CAST(FILEPROPERTY(A.NAME,''SPACEUSED'') AS INT))/128.0))),
                      FREESPACE_MB    = CONVERT(DECIMAL(10,2),(A.SIZE/128.0 -  CAST(FILEPROPERTY(A.NAME,''SPACEUSED'') AS INT)/128.0)),
                      AUTOGROW_STATUS = ''BY '' +CASE is_percent_growth when 0 then cast (growth/128 as varchar(10))+ '' MB - ''
                                                                        when 1 then cast (growth as varchar(10)) + ''% - '' ELSE '''' END
                                                                        + CASE MAX_SIZE WHEN 0 THEN '' DISABLED '' 
                                                                                        WHEN -1 THEN '' UNRESTRICTED''
                                                                                        ELSE '' RESTRICTED TO '' + CAST(MAX_SIZE/(128*1024) AS VARCHAR(10)) + '' GB '' END
                                                                      + CASE IS_PERCENT_GROWTH WHEn 1 then '' [autogrowth by percent]'' else '''' end
          from sys.database_files A
          left join sys.filegroups fg on a.data_space_id = fg.data_space_id
          order by A.type desc,A.name
          ;
          '
      
          --print @sql
      
          EXEC sp_MSforeachdb @SQL
          go
      
          SELECT dbSize.*,fg.*,d.log_reuse_wait_desc,d.recovery_model_desc
          FROM #tempFileInformation fg
          LEFT JOIN sys.databases d on fg.DBNAME = d.name
          CROSS APPLY
          (
              select dbname,
                      sum(FILESIZE_MB) as [totalDBSize_MB],
                      sum(FREESPACE_MB) as [DB_Free_Space_Size_MB],
                      sum(USEDSPACE_MB) as [DB_Used_Space_Size_MB]
                  from #tempFileInformation
                  where  dbname = fg.dbname
                  group by dbname
          )dbSize
      
      
      go
      DROP TABLE #tempFileInformation
      

      使用此脚本,您可以显示所有使用的数据库名称和文件(system dbs除外)


      加上我的2美分

      如果专门查找所有数据库中的数据文件或日志文件中的总可用空间,我们可以使用“Data\u space\u id”列。1表示数据文件,0表示日志文件

      代码:


      如果重命名数据库,MS SQL Server不会重命名基础文件

      下面的查询为您提供数据库的当前名称和逻辑文件名(可能是数据库创建时的原始名称)以及相应的物理文件名

      注意:取消注释最后一行以仅查看实际数据文件

      select  db.database_id, 
              db.name "Database Name", 
              files.name "Logical File Name",
              files.physical_name
      from    sys.master_files files 
              join sys.databases db on db.database_id = files.database_id 
      --                           and files.type_desc = 'ROWS'
      
      参考:


      谢谢,这(与sys.databases一起)正是我想要的!从sys.master中选择*_files@M4N如果您只想获取数据库名称,还可以调用
      DB\u name(database\u id)
      而不是加入
      sys.databases
      我意识到这是一个小数据集,但这不是使用相关子查询的理由。它们在Oracle上可能很好,但在SQL Server上却是严重的性能杀手,因为它们会导致逐行处理。您的脚本将为sys.databases表中的每一行查询sys.master_files表两次。。。如果任何数据库都有多个数据文件或日志文件,此脚本也将失败并出现错误。(例如,子查询返回的值超过1。)@Davos我知道你在说什么,但这取决于你执行此查询的频率,否则可能是预优化,而你可能不需要。我普遍认为早期优化不好,但我想说的是,相关子查询只是一种糟糕的模式,根本不应该使用它。“从不”规则总是有例外,但这不是其中之一。我知道这是次要的,在这里可能真的不重要,但这不是重点。这是新手用来学习良好实践的公共论坛,因此您需要提供角色模型代码。如果其中一个数据库中使用了多个数据文件,则查询将出错。这是一个使用联接的查询版本。干杯选择db.name作为DBName,选择db.database_id,选择mfr.Physical_name作为数据文件,mfl.Physical_Name作为sys.databases db中的日志文件连接sys.master_files mfr ON db.database_id=mfr.database_id和mfr.type_desc='ROWS'连接sys.master_files mfl ON db.database_id=mfl.database_id和mfl.type_desc='LOG'ORDER BY db.database_id这只提供单个指定数据库的信息。问题是针对所有数据库。
      使用[?]
      应该做什么?它给出了一个找不到该存储过程的错误。删除它只会多次显示系统数据库。这是一个优秀的脚本,可以复制/粘贴并按原样使用。不过有一个问题,我发现对于
      LogVolumeFreeSpaceMB
      来说,所有文件的显示量都是相同的,在我的例子中是44756。有可能得到实际的可用空间吗?或者这是LDF所在驱动器上的最大可用空间数?嗨,Abel-我写这篇文章已经有一段时间了,我真的不确定你的问题。XP_FIXEDDRIVES有一个名为sys.dm_os_volume_stats的替代品,您可以尝试使用它。如果问题是数据库的文件大小没有随着时间的推移而改变,那么这是正常的,因为SQL Server会分配一大块空白磁盘空间供其使用,然后在文件填满之前不会扩展该文件。它将以跳转方式展开文件,扩展量由该特定数据库的文件设置确定
      select name,physical_name from sys.master_files where database_id > 4
      
      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 
      
      
      select  db.database_id, 
              db.name "Database Name", 
              files.name "Logical File Name",
              files.physical_name
      from    sys.master_files files 
              join sys.databases db on db.database_id = files.database_id 
      --                           and files.type_desc = 'ROWS'