এসকিউএল সার্ভারে সমস্ত ডাটাবেস ফাইল সম্পর্কিত তথ্য তালিকাভুক্ত করা হচ্ছে


90

এসকিউএল সার্ভারে সমস্ত ডাটাবেসের ফাইল (এমডিএফ / এলডিএফ) সম্পর্কিত তথ্য তালিকাভুক্ত করা কি সম্ভব?

লোকাল ডিস্কে কোন ডাটাবেসটি ব্যবহার করছে তা দেখিয়ে আমি একটি তালিকা পেতে চাই।

আমি যা চেষ্টা করেছি:

  • exec sp_databases সমস্ত ডাটাবেস
  • select * from sys.databases প্রতিটি ডাটাবেস সম্পর্কে প্রচুর তথ্য দেখায় - তবে দুর্ভাগ্যক্রমে এটি প্রতিটি ডাটাবেস দ্বারা ব্যবহৃত ফাইলগুলি প্রদর্শন করে না।
  • select * from sys.database_filesmasterডাটাবেসের mdf / ldf ফাইলগুলি দেখায় - তবে অন্যান্য ডাটাবেসগুলি নয় not

উত্তর:


123

আপনি sys.master_files ব্যবহার করতে পারেন ।

মাস্টার ডাটাবেসে সঞ্চিত হিসাবে একটি ডাটাবেসের প্রতিটি ফাইল প্রতি সারি থাকে। এটি একক, সিস্টেম-ব্যাপী দৃশ্য।


4
ধন্যবাদ, এটি (sys.databases এর সাথে যোগ দিয়েছিল) আমি যা খুঁজছিলাম!
এম

4
sys.master_files থেকে * নির্বাচন
Cosmin

4
@ DB_NAME(database_id)sys.databases
এম

84

আপনি যদি ডাটাবেসের অবস্থান পেতে চান তবে সমস্ত ডিবি অবস্থান পান তা পরীক্ষা করতে পারেন ।
আপনি sys.master_filesdb এর অবস্থান sys.databseপেতে এবং ডিবি নাম পেতে ব্যবহার করতে পারেন

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

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

আকার কেবিতে প্রকাশ করা হয়।


কী Use [?]করার কথা? এটি একটি ত্রুটি দেয় যা এটি সেই সঞ্চিত পদ্ধতিটি খুঁজে পায় না। এটি সরানো কেবলমাত্র একাধিকবার সিস্টেম ডাটাবেসগুলি দেখায়।
আবেল

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

নিম্নলিখিত এসকিএল সম্পাদন করা (এটি কেবল তখনই কাজ করবে যখন আপনার কাছে একই ডাটাবেসের জন্য একাধিক এমডিএফ / এলডিএফ ফাইল নেই)

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

এবং বাকী ডাটাবেস

যদি আপনার টেম্পডিবি'র একাধিক এমডিএফ থাকে (যেমন আমার আছে) তবে এই স্ক্রিপ্টটি ব্যর্থ হবে। তবে, আপনি ব্যবহার করতে পারেন

WHERE db.database_id > 4

শেষে এবং এটি সিস্টেম ডাটাবেস ব্যতীত সমস্ত ডাটাবেস ফিরিয়ে দেবে।


আমি বুঝতে পেরেছি এটি একটি ছোট ডেটাসেট, তবে এটি সম্পর্কিত সম্পর্কিত সাবকোয়ারিগুলি ব্যবহার করার কোনও কারণ নেই। তারা ওরাকলে ভাল থাকতে পারে তবে তারা এসকিউএল সার্ভারে গুরুতর পারফরম্যান্স কিলার, কারণ তারা সারি-সারি সারি প্রক্রিয়াকরণের কারণ করে। আপনার স্ক্রিপ্ট sys.datedias সারণীতে প্রতি সারির জন্য দু'বার sys.master_files টেবিলটি জিজ্ঞাসা করবে।
দাভোস

4
দাভোসের মন্তব্য ছাড়াও ... কোনও স্ক্রিনে কোনও ডাটাবেসের জন্য যদি আপনার একাধিক ডেটাফাইলে বা লগফাইলে থাকে তবে এই স্ক্রিপ্টটি ত্রুটিগুলির সাথেও ব্যর্থ হবে। (যেমন সাবকিউরি 1 টিরও বেশি মানের ফেরত দিয়েছে))
আরকাইন 55

@ ডেভস আমি জানি আপনি কী বলছেন তবে এটি নির্ভর করে আপনি কত ঘন ঘন এই কোয়েরিটি সম্পাদন করছেন অন্যথায় এটি প্রাক-অপ্টিমাইজেশন যা সম্ভবত আপনার প্রয়োজন নেই।
adeel41

4
আমি সাধারণত সম্মত হই যে প্রারম্ভিক অপ্টিমাইজেশনটি খারাপ, তবে আমি যা বলছি তা হল যে সম্পর্কযুক্ত সাবকোয়ারিগুলি কেবল একটি খারাপ প্যাটার্ন যা কখনই প্রথম স্থানে ব্যবহার করা উচিত নয়। 'কখনই নয়' বিধিগুলির সর্বদা ব্যতিক্রম রয়েছে, তবে এটি এই ক্ষেত্রে একটি নয়। আমি জানি এটি নাবালিকা এবং এটি এখানে সত্যই গুরুত্বপূর্ণ নয়, তবে এটি মূল বিষয় নয়। এটি এমন একটি সর্বজনীন ফোরাম যা নতুন অনুশীলনগুলি ভাল অনুশীলন শিখতে ব্যবহার করে, তাই আপনাকে রোল মডেল কোড সরবরাহ করতে হবে।
দাভোস

4
একাধিক ডেটা ডাটাবেস ডাটাবেসে ব্যবহার করা হলে ক্যোয়ারী ত্রুটি করবে। পরিবর্তে যোগদান করে আপনার ক্যোয়ারির একটি সংস্করণ এখানে। চিয়ার্স! DBName AS AS DBName, db.datedia_id, mfr.Physical_Name AS DataFile নির্বাচন করুন । মাস্টার_ফায়ালস এমএফএল অন ডিবি.ড্যাটাবেস_আইডি = এমএফএল.ড্যাটাবেস_আইডি এবং এমএফএল.টাইপ_ডেস্ক = 'লগ' অর্ডার db.datedia_id
রবার্ট

2

এই স্ক্রিপ্টটি ব্যবহার করে আপনি সমস্ত ডাটাবেসের নাম এবং ফাইলগুলি ব্যবহার করতে পারেন (সিস্টেম dbs ব্যতীত)।

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 the আসল মুক্ত স্থান পাওয়া কি সম্ভব? অথবা যে ড্রাইভে এলডিএফ রয়েছে সেখানে সর্বাধিক মুক্ত জায়গার সংখ্যাটি?
আবেল

হাই আবেল - আমি লেখার পরে অনেক সময় হয়ে গেছে এবং আমি আপনার সমস্যার বিষয়ে সত্যই নিশ্চিত নই। সিস.ডিএম_স_ভলিউম_স্ট্যাটস নামে XP_FIXEDDRIVES এর বিকল্প রয়েছে যাতে আপনি এটি ব্যবহার করে দেখতে পারেন। যদি সমস্যাটি হয় যে সময়ের সাথে সাথে ডাটাবেসের ফাইলের আকারগুলি পরিবর্তন হচ্ছে না তবে এটি স্বাভাবিক যেহেতু এসকিউএল সার্ভার তার ব্যবহারের জন্য খালি ডিস্কের একটি বড় পরিমাণ বরাদ্দ করে এবং তারপরে ফাইলটি পূর্ণ না হওয়া পর্যন্ত প্রসারিত হয় না। এটি নির্দিষ্ট ডাটাবেসের জন্য ফাইল সেটিংস দ্বারা নির্ধারিত পরিমাণের সাথে জাম্পে একটি ফাইল প্রসারিত করবে
জেরার্ড

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

নীচের স্ক্রিপ্টটি নিম্নলিখিত তথ্যগুলি ব্যবহার করতে ব্যবহার করা যেতে পারে: 1. ডিবি আকারের তথ্য 2. ফাইলস্পেসআইএনফো 3. অটো গ্রোথ 4. পুনরুদ্ধার মডেল 5. লগ_প্রযুক্তি_ব্যাকআপ তথ্য

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

শুধু আমার 2 সেন্ট যোগ করুন।

যদি বিশেষভাবে কেবলমাত্র ডেটা ফাইলগুলিতে বা সমস্ত ডাটাবেসে কেবল লগ ফাইলগুলিতে মোট মুক্ত স্থান সন্ধান করতে চান, আমরা "ডেটা_স্পেস_আইডি" কলামটি ব্যবহার করতে পারি। 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

আপনি যদি আপনার ডেটাবেসটির নাম পরিবর্তন করেন তবে এমএস এসকিউএল সার্ভার অন্তর্নিহিত ফাইলগুলির নাম পরিবর্তন করে না।

নিম্নলিখিত কোয়েরিটি আপনাকে ডাটাবেসের বর্তমান নাম এবং লজিকাল ফাইলের নাম দেয় (যা এটি তৈরি করার সময় ডাটাবেসের আসল নাম হতে পারে) এবং একই সাথে শারীরিক ফাইলের নামও দেয়।

দ্রষ্টব্য: কেবল আসল ডেটা ফাইলগুলি দেখতে শেষ লাইনে আন-মন্তব্য করুন

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-catolog-views/sys-master-files-transact-sql?view=sql-server-ver15

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


-3

আপনি নীচে ব্যবহার করতে পারেন:

SP_HELPDB [Master]
GO

এটি কেবলমাত্র একক নির্দিষ্ট ডাটাবেসের জন্য তথ্য সরবরাহ করে। প্রশ্ন সব ডাটাবেসের জন্য।
Thronk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.