SQL Server의 모든 데이터베이스 파일에 대한 정보 나열


92

SQL Server에있는 모든 데이터베이스의 파일 (MDF / LDF)에 대한 정보를 나열 할 수 있습니까?

어떤 데이터베이스가 로컬 디스크의 어떤 파일을 사용하고 있는지 보여주는 목록을 얻고 싶습니다.

내가 시도한 것 :

  • exec sp_databases 모든 데이터베이스
  • select * from sys.databases 각 데이터베이스에 대한 많은 정보를 표시하지만 안타깝게도 각 데이터베이스에서 사용하는 파일은 표시하지 않습니다.
  • select * from sys.database_filesmaster데이터베이스 의 mdf / ldf 파일을 표시 하지만 다른 데이터베이스는 표시하지 않습니다.

답변:


124

sys.master_files 를 사용할 수 있습니다 .

master 데이터베이스에 저장된 데이터베이스의 파일 당 행을 포함합니다. 이것은 시스템 전체의 단일보기입니다.


4
고마워요, (sys.databases와 조인) 제가 찾고 있던 것입니다!
M4N 2012 년

1
select * from sys.master_files
Cosmin

2
@ M4N 데이터베이스 이름을 얻으려면 DB_NAME(database_id)대신 전화 를 걸 수 있습니다.sys.databases
Cleptus


18

스크립트를 사용하여 각 파일에 빈 공간을 확보하고 있습니다.

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로 표시됩니다.


무엇 Use [?]을해야합니까? 저장 프로 시저를 찾을 수 없다는 오류가 발생합니다. 제거하면 시스템 데이터베이스가 여러 번 표시됩니다.
Abel

4

이 쿼리를 만들었습니다.

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

3

이것을 시도 할 수도 있습니다.

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

3

다음 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
--------------------------------------------------------------------------------
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

마지막에 시스템 데이터베이스를 제외한 모든 데이터베이스를 반환합니다.


작은 데이터 세트라는 것을 알고 있지만 상관 하위 쿼리를 사용할 이유는 없습니다. Oracle에서는 괜찮을 수 있지만 행 단위 처리를 유발하기 때문에 SQL Server에서는 심각한 성능 저하 요인입니다. 스크립트는 sys.databases 테이블의 모든 행에 대해 sys.master_files 테이블을 두 번 쿼리합니다.
Davos

2
Davos의 주석 외에도 ...이 스크립트는 데이터베이스에 대해 여러 데이터 파일 또는 로그 파일이있는 경우 오류와 함께 실패합니다. (예를 들어 하위 쿼리는 1 개 이상의 값을 반환했습니다.)
Arkaine55

@Davos 나는 당신이 말하는 것을 알고 있지만이 쿼리를 얼마나 자주 실행하는지에 달려 있습니다. 그렇지 않으면 아마도 필요하지 않은 사전 최적화입니다.
adeel41

2
나는 일반적으로 초기 최적화가 나쁘다는 데 동의하지만 상관 된 하위 쿼리는 처음에는 절대 사용해서는 안되는 나쁜 패턴이라는 것입니다. '절대'규칙에는 항상 예외가 있지만, 이것은 그러한 경우 중 하나가 아닙니다. 나는 그것이 사소하고 여기에서 실제로 중요하지 않을 수도 있다는 것을 알고 있지만 그게 요점이 아닙니다. 이 포럼은 초보자가 모범 사례를 배우기 위해 사용하는 공개 포럼이므로 역할 모델 코드를 제공해야합니다.
다 보스

1
데이터베이스 중 하나에서 여러 데이터 파일을 사용하면 쿼리가 오류가 발생합니다. 대신 조인을 사용하는 쿼리 버전은 다음과 같습니다. 건배! 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
Robert

2

이 스크립트를 사용하면 사용 된 모든 데이터베이스 이름과 파일을 표시 할 수 있습니다 (시스템 DB 제외).

select name,physical_name from sys.master_files where database_id > 4

1

이 스크립트는 사용자가 찾고있는 대부분의 항목을 나열하며 필요에 따라 수정할 수 있습니다. 거기에 영구 테이블이 생성된다는 점에 유의하십시오. 변경할 수 있습니다. 다양한 서버의 백업 및 작업 정보를 요약하는 더 큰 스크립트의 하위 집합입니다.

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] 

그대로 복사 / 붙여 넣기 및 사용할 수있는 훌륭한 스크립트입니다. 그러나 한 가지 질문 LogVolumeFreeSpaceMB은 모든 파일에 대해 항상 동일한 양을 보여줍니다 (제 경우 44756). 실제 여유 공간을 얻을 수 있습니까? 아니면 LDF가있는 드라이브의 최대 여유 공간 수입니까?
Abel '

안녕하세요 Abel-제가 글을 쓴 지 오래되었으며 귀하의 문제가 확실하지 않습니다. XP_FIXEDDRIVES 대신 sys.dm_os_volume_stats라는 대안이 있으므로 사용해 볼 수 있습니다. 문제가 데이터베이스의 파일 크기가 시간이 지남에 따라 변경되지 않는 경우 SQL Server가 사용을 위해 빈 디스크 공간의 큰 덩어리를 할당 한 다음 파일이 채워질 때까지 해당 파일을 확장하지 않기 때문에 정상입니다. 특정 데이터베이스에 대한 파일 설정에 의해 결정된 양으로 점프에서 파일을 확장합니다
Gerard

1

아래 스크립트를 사용하여 다음 정보를 얻을 수 있습니다. 1. DB 크기 정보 2. FileSpaceInfo 3. AutoGrowth 4. 복구 모델 5. Log_reuse_backup 정보

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

0

데이터베이스 중 하나에서 여러 데이터 파일 (예 : ".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

0

그냥 내 2 센트를 추가합니다.

특별히 데이터 파일에서만 또는 모든 데이터베이스의 로그 파일에서만 총 여유 공간을 찾으려면 "data_space_id"열을 사용할 수 있습니다. 1은 데이터 파일 용이고 0은 로그 파일 용입니다.

암호:

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

데이터베이스 이름을 바꾸면 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'

참고:

https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-master-files-transact-sql?view=sql-server-ver15

https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-databases-transact-sql?view=sql-server-ver15


-3

아래를 사용할 수 있습니다.

SP_HELPDB [Master]
GO

지정된 단일 데이터베이스에 대한 정보 만 제공합니다. 문제는 모든 데이터베이스에 대한 것입니다.
Thronk 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.