2008-10-06 20 views
72

SQL सर्वर 2005/2008 एक्सप्रेस संस्करण में 4 जीबी प्रति डेटाबेस की सीमा निर्धारित करें। जहां तक ​​मुझे पता है कि डेटाबेस इंजन केवल डेटा को मानता है, इस प्रकार लॉग फाइलों, अप्रयुक्त स्थान और अनुक्रमणिका आकार को छोड़कर।SQL सर्वर डेटाबेस आकार

एमडीएफ फ़ाइल की लंबाई प्राप्त करना SQL सर्वर सीमा के संदर्भ में सही डेटाबेस आकार नहीं देना चाहिए। मेरा सवाल है कि डेटाबेस आकार कैसे प्राप्त करें?

उत्तर

91

+5

sp_spaceused खाते में लॉग फ़ाइल आकार लेता है, तो आप एक बहुत छोटा सा डाटाबेस और एक बहुत बड़ा लॉग फ़ाइल, अगर रेसुल SP_spaceused से टी यह निर्धारित करने का प्रयास करते समय भ्रामक होगा कि आप 4 जीबी सीमा के करीब कितने करीब हैं। – Lamar

+0

प्रश्न स्पष्ट रूप से शामिल होने के लिए लॉग फ़ाइल के लिए पूछता है। क्या वह 4 जीबी सीमा की ओर आवेदन करने वाली लॉग फ़ाइल के बारे में गुमराह है? शॉर्टनेस के लिए –

+1

+1। मुझे छोटे जवाब पसंद हैं! – ren

14

sp_spaceused एसक्यूएल प्रबंधन स्टूडियो में, एक डेटाबेस पर राइट क्लिक करें और संदर्भ मेनू से "गुण" का चयन करें। "आकार" आकृति को देखो।

16

SQL2000 सहायता के अनुसार, sp_spaceused डेटा और अनुक्रमणिका शामिल हैं।

यह स्क्रिप्ट करना चाहिए:

CREATE TABLE #t (name SYSNAME, rows CHAR(11), reserved VARCHAR(18), 
data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18)) 

EXEC sp_msforeachtable 'INSERT INTO #t EXEC sp_spaceused ''?''' 
-- SELECT * FROM #t ORDER BY name 
-- SELECT name, CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3)) FROM #t ORDER BY name 
SELECT SUM(CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3))) FROM #t 
DROP TABLE #t 
+0

यह एक महान जवाब है। लिपि के लिए धन्यवाद - बहुत उपयोगी! –

74

sp_helpdb

जरूरत नहीं पाशन, के विपरीत sp_spaceused।

+0

ग्रेट !! वास्तव में मदद करता है। –

+4

आवंटित डीबी आकार (एमडीएफ फ़ाइल का आकार) देता है, वास्तविक उपयोग आकार नहीं। – Mrchief

6

सबसे अच्छा समाधान प्रत्येक डेटाबेस फ़ाइल के आकार की गणना करने के sys.sysfiles दृश्य का उपयोग कर, प्रत्येक पृष्ठ के लिए 8 KB का आकार को देखते हुए इस प्रकार हो सकता है है:

USE [myDatabase] 
GO 

SELECT 
    [size] * 8 
    , [filename] 
FROM sysfiles 

[field] स्तंभ पेज के आकार का प्रतिनिधित्व करता है, पृष्ठों में (MSDN Reference to sysfiles)।

आपको कम से कम दो फ़ाइलें (MDF और एलडीएफ) नहीं होगा देखेंगे: इन फ़ाइलों की राशि आप पूरे डेटाबेस का सही आकार दे देंगे ...

+5

+1 'चयन एसयूएम (आकार) /128.0 एसएसफ़ाइल से एएस आकार 'sp_spaceused' के समान मान देता है, लेकिन स्वचालित रूप से विश्लेषण करना आसान हो सकता है। –

+0

हां, बहुत आसान! – MAXE

2

आप के रूप में इस पुराने जमाने एक इस्तेमाल कर सकते हैं अच्छी तरह से ...

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 

DECLARE @iCount int, @iMax int, @DatabaseName varchar(200), @SQL varchar (8000) 

Select NAME, DBID, crdate, filename, version 
INTO #TEMP 
from MAster..SYSDatabASES 

SELECT @iCount = Count(DBID) FROM #TEMP 

Select @SQL='Create Table ##iFile1 (DBName varchar(200) NULL, Fileid INT, FileGroup int, TotalExtents INT , USedExtents INT , 
Name varchar(100), vFile varchar (300), AllocatedSpace int NUll, UsedSpace int Null, PercentageFree int Null) '+ char(10) 
exec (@SQL) 


Create Table ##iTotals (ServerName varchar(100), DBName varchar(200) NULL, FileType varchar(10),Fileid INT, FileGroup int, TotalExtents INT , USedExtents INT , 
Name varchar(100), vFile varchar (300), AllocatedSpace int NUll, UsedSpace int Null, PercentageFree int Null) 


WHILE @iCount>0 
BEGIN  
    SELECT @iMax =Max(dbid) FROM #TEMP 
    Select @DatabaseName = Name FROM #TEMP where dbid [email protected] 

    SELECT @SQL = 'INSERT INTO ##iFile1(Fileid , FileGroup , TotalExtents , USedExtents , Name , vFile) 
    EXEC (''USE [' + @DatabaseName + '] DBCC showfilestats'') ' + char(10) 

    Print (@SQL) 
    EXEC (@SQL) 


    SELECT @SQL = 'UPDATE ##iFile1 SET DBName ='''+ @DatabaseName +''' WHERE DBName IS NULL' 
    EXEC (@SQL) 


    DELETE FROM #TEMP WHERE dbid [email protected] 
    Select @iCount [email protected] -1 
END 
UPDATE ##iFile1 
SET AllocatedSpace = (TotalExtents * 64.0/1024.0), UsedSpace =(USedExtents * 64.0/1024.0) 

UPDATE ##iFile1 
SET PercentageFree = 100-Convert(float,UsedSpace)/Convert(float,AllocatedSpace )* 100 
WHERE USEDSPACE>0 

CREATE TABLE #logspace (
    DBName varchar(100), 
    LogSize float, 
    PrcntUsed float, 
    status int 
    ) 
INSERT INTO #logspace 
EXEC ('DBCC sqlperf(logspace)') 



INSERT INTO ##iTotals(ServerName, DBName, FileType,Name, vFile,PercentageFree,AllocatedSpace) 
select @@ServerName ,DBNAME, 'Data' as FileType,Name, vFile, PercentageFree , AllocatedSpace 
from ##iFile1 
UNION 
select @@ServerName ,DBNAME, 'Log' as FileType ,DBName,'' as vFile ,PrcntUsed , LogSize 
from #logspace 

Select * from ##iTotals 

select ServerName ,DBNAME, FileType, Sum(AllocatedSpace) as AllocatedSpaceMB 
from ##iTotals 
Group By ServerName ,DBNAME, FileType 
Order By ServerName ,DBNAME, FileType 


select ServerName ,DBNAME, Sum(AllocatedSpace) as AllocatedSpaceMB 
from ##iTotals 
Group By ServerName ,DBNAME 
Order By ServerName ,DBNAME 



drop table ##iFile1 
drop table #logspace 
drop table #TEMP 
drop table ##iTotals 
4

मैं हमेशा यह बाद सीधे जा रहा पसंद है:

SELECT 
    DB_NAME(dbid) AS DatabaseName, 
    CAST((SUM(size) * 8)/(1024.0 * 1024.0) AS decimal(10, 2)) AS DbSizeGb 
FROM 
    sys.sysaltfiles 
GROUP BY 
    DB_NAME(dbid) 
+2

ध्यान रखें कि SQL 2005 + में, sysaltfiles को मूल उपयोगकर्ता खाते द्वारा पढ़ा नहीं जा सकता है (यानी विशेष अनुमतियों के बिना)। यहां तक ​​कि यदि आप मास्टर डेटाबेस में लॉगिन जोड़ते हैं और मास्टर..साइटलफाइल या sys.sysaltfiles पर अनुदान चयन करते हैं, तो इस तालिका पर एक चयनित कथन एक खाली रिकॉर्डसेट लौटाएगा। एक sysadmin खाता का उपयोग कर कोई समस्या नहीं है '। – Mike

संबंधित मुद्दे