Можно ли перечислить информацию о файлах (MDF / LDF) всех баз данных на SQL Server?
Я хотел бы получить список, показывающий, какая база данных какие файлы использует на локальном диске.
Что пробовал:
exec sp_databases
все базы данныхselect * from sys.databases
показывает много информации о каждой базе данных, но, к сожалению, не показывает файлы, используемые каждой базой данных.select * from sys.database_files
показывает файлы mdf / ldfmaster
базы данных, но не другие базы данных
DB_NAME(database_id)
вместо этого позвонить, присоединившись кsys.databases
Если вы хотите получить местоположение базы данных, вы можете проверить Get All DBs Location .
вы можете использовать
sys.master_files
для получения местоположения db иsys.databse
для получения имени dbSELECT 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
Размер выражается в КБ.
источник
Use [?]
делать? Выдает ошибку, что не может найти эту хранимую процедуру. При его удалении системные базы данных отображаются только несколько раз.Я создал этот запрос:
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
источник
Вы также можете попробовать это.
select db_name(dbid) dbname, filename from sys.sysaltfiles
источник
Выполнение следующего 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 (например, у меня), этот скрипт завершится ошибкой. Однако вы можете использовать
в конце, и он вернет все базы данных, кроме системных баз данных.
источник
Используя этот скрипт, вы можете показать все имена баз данных и используемые файлы (за исключением системных dbs).
select name,physical_name from sys.master_files where database_id > 4
источник
Этот сценарий перечисляет большую часть того, что вы ищете, и, надеюсь, его можно изменить в соответствии с вашими потребностями. Обратите внимание, что он создает там постоянную таблицу - вы можете изменить ее. Это подмножество более крупного сценария, который также обобщает информацию о резервном копировании и заданиях на различных серверах.
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?Нижеприведенный сценарий может быть использован для получения следующей информации: 1. Информация о размере БД 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
источник
Запрос выдаст ошибку, если в одной из баз данных используются несколько файлов данных (например, типы файлов ".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
источник
просто добавляю свои 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
источник
Если вы переименуете свою базу данных, 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
источник
Вы можете использовать следующее:
источник