coco_andy 发表于 2009-03-08 23:47

有关数据库大小计算的问题

遇见过这样的情况:
sybsystemprocs库损坏,系统存储过程无法使用,当时需要计算数据库大小sp_helpdb已不能使用。

查看master库sysusages表来计算数据库大小

dbid   segmap      lstart      size      vstart      pad    unreservedpgs
         crdate                     
------ ----------- ----------- ----------- ----------- ------ -------------
         --------------------------
      1         7         0      3072         4   NULL         821
                Oct 17 2007 10:29AM
      1         7      3072      145408      6660   NULL      144817
                Oct 17 2007 10:29AM
      2         7         0      1536      4100   NULL         925
                Oct 17 2007 10:29AM
      3         7         0      1024      3076   NULL         415
                Oct 17 2007 10:29AM
31513         7         0      1024      5636   NULL         367
                Oct 17 2007 10:29AM
31514         7         0      102400    16777216   NULL         72907
                Oct 17 2007 10:29AM




sp_helpdb:


name                     db_size       owner                  dbid
         created         
         status                                                                                                
------------------------ ------------- ------------------------ ------
         ------------------
         ------------------------------------------------------------------------------------------------------
master                        290.0 MB sa                            1
         Oct 17, 2007      
         mixed log and data                                                                                    
model                           2.0 MB sa                            3
         Oct 17, 2007      
         mixed log and data                                                                                    
sybsystemdb                     2.0 MB sa                        31513
         Oct 17, 2007      
         mixed log and data                                                                                    
sybsystemprocs                200.0 MB sa                        31514
         Oct 17, 2007      
         trunc log on chkpt, mixed log and data                                                               
tempdb                        3.0 MB sa                            2
         Mar 11, 2009      
         select into/bulkcopy/pllsort, trunc log on chkpt, mixed log and data


但是在这个表中的值必须乘2才是真正数据库的大小(恢复数据库的操作是老大做的,他给我说需要乘2),回来自己研究sp_helpdb存储过程也没看出来需要乘已2呀。小弟是新手对sp_helpdb 的存储过程看的不是很懂还请各位大哥给指点一下。

和db_size 有关也。

u.size参数:
还是从sysusages取出写到spbusages临时表了也没有乘2呀

select u.dbid, u.segmap, u.lstart, u.size, u.vstart, u.unreservedpgs, u.crdate
        into #spdbusages
        from #spdbdesc, master.dbo.sysusages u
        where #spdbdesc.dbid = u.dbid

@numpgsmb 参数:

declare @numpgsmb         float               

select @numpgsmb = (1048576. / v.low)
        from master.dbo.spt_values v
               where v.number = 1
               and v.type = "E"



db_size计算:
if (@len1 > 24 or @len2 > 24)
        select distinct name = d.name,
                db_size = str(sum(u.size) / @numpgsmb, 10, 1)
                        + " MB",
                owner = l.name,
                dbid = d.dbid,
                created = convert(char(14), d.crdate, 107),
                status = #spdbdesc.dbdesc
                        from master.dbo.sysdatabases d, master.dbo.syslogins l,
                               #spdbusages u, #spdbdesc
                where d.dbid = #spdbdesc.dbid
                        and d.suid = l.suid
                        and #spdbdesc.dbid = u.dbid
                group by #spdbdesc.dbid
                having d.dbid = #spdbdesc.dbid
                        and d.suid = l.suid
                        and #spdbdesc.dbid = u.dbid
                order by d.name
else
        select distinct name = convert(char(24), d.name),
                db_size = str(sum(u.size) / @numpgsmb, 10, 1)
                        + " MB",
                owner = convert(char(24), l.name),
                dbid = d.dbid,
                created = convert(char(14), d.crdate, 107),
                status = #spdbdesc.dbdesc
                        from master.dbo.sysdatabases d, master.dbo.syslogins l,
                               #spdbusages u, #spdbdesc
                where d.dbid = #spdbdesc.dbid
                        and d.suid = l.suid
                        and #spdbdesc.dbid = u.dbid
                group by #spdbdesc.dbid
                having d.dbid = #spdbdesc.dbid
                        and d.suid = l.suid
                        and #spdbdesc.dbid = u.dbid
                order by d.nam





还请高手给指点一下。谢谢了

[ 本帖最后由 coco_andy 于 2009-3-9 00:18 编辑 ]

camham 发表于 2009-03-09 09:50

sysuage是size是page的数量,
page size 是2k
102400*2K=200m

coco_andy 发表于 2009-03-09 14:46

哦。谢谢楼上这位大哥了,我也查了一下sysuages表中字段的意思。

名称                  数据类型                   说明
dbid                  smallint                   数据库ID
segmap            int                           可能的段赋值位图
lstart                  int                           第一个数据库(逻辑)页的页码
size                  int                           相邻数据可库(逻辑)页的数目
vstart               int                           起始虚拟页的页码
pad                  smallint                   未使用
unreservedpgs   int                        不属于已分配扩展的可用空间
页: [1]
查看完整版本: 有关数据库大小计算的问题