Chinaunix

标题: 怎么查看设备文件上还有多少空间没有被分配出去 [打印本页]

作者: yiguihuo    时间: 2011-08-24 11:10
标题: 怎么查看设备文件上还有多少空间没有被分配出去
1、怎么查看设备文件上还有多少空间没有被分配出去
2、怎么查看设备文件上有哪几个库并分别分配了多少空间
其实查看这些信息用ASE 15的central图像管理工具很容易就看出来了,但连接数据库时都用SQL Advantage管理,而且很少有机器安装ASE 15的central软件,所有想知道用命令怎么查看和图像界面一样的信息

设备文件大小及未分配出去的(未使用)大小


设备文件上有哪几个库及分别分配了多少空间
作者: Eisen    时间: 2011-08-24 13:11
sp_helpdevice devname
go
作者: yiguihuo    时间: 2011-08-24 18:42
那有那么简单呀,sp_helpdevice devname只能看看设备路径、大小等信息。多少空间没有被分配出去和分配给那个库了根本看不出来
作者: andkylee    时间: 2011-08-25 08:23
你可以使用isql命令中执行sp_helpdevice进行查看。
ASE12.5.x版本中不会显示设备剩余空间,ASE15.x中会显示。
作者: Eisen    时间: 2011-08-25 08:50
你不是再用ase15的嘛。
作者: yiguihuo    时间: 2011-08-25 10:42
你可以使用isql命令中执行sp_helpdevice进行查看。
ASE12.5.x版本中不会显示设备剩余空间,ASE15.x中会显示 ...
andkylee 发表于 2011-08-25 08:23


sp_helpdevice这命令用了有上万遍了,能输出什么不用想也知道,只能看看设备路径、大小等信息。多少空间没有被分配出去和分配给那个库了根本看不出来
数据库都用的12.5,只是偶然装个15的客户端(觉得比12多了些功能)
觉得我提的问题已经很清楚了,连图片都加上了,图片是用15的客户机连接12.5的数据库显示的信息,就是想知道用isql命令行怎么得到图片中想要的结果
作者: Eisen    时间: 2011-08-25 11:17
本帖最后由 Eisen 于 2011-08-25 11:20 编辑

好牛的提问啊……
怎么看都觉得好像我们这里谁欠了楼主一堆钱啊。
作者: andkylee    时间: 2011-08-25 12:05
本帖最后由 andkylee 于 2011-08-26 13:58 编辑

回复 6# yiguihuo


    楼主的问题很清楚、明白。 在平常运维中,我也遇到和楼主一样的问题。执行:sp_helpdevice 设备名 的时候不能查看到设备剩余空间以及具体分配给了哪些数据库。
通过查看ase12.5.4中过程sp_helpdevice的语法,发现:ase15之前的所有版本都不支持上述功能,只有ase15版本后才会显示剩余空间以及分配信息。

既然楼主都使用sp_helpdevice上万遍了,且楼主发现sybase central等图形工具支持该功能,那楼主为什么不去研究一下这些工具是怎么实现的呢?

很早之前就想写一个能查询设备剩余空间的存储工程,现在恰好楼主问这个问题。就写了一个能够查看设备总空间以及剩余空间,还有设备上具体分配信息的存储过程sp_helpdevice2
我参考了ASE12.5.4和ASE15.0.3中的sp_helpdevice的语法完成该过程sp_helpdevice2的编写。分别在ASE v11.0.1, ASE v11.5.1, ASE v11.9.2, ASE v12.5, v12.5.0.3, v12.5.4 平台上进行了测试。


/*
* 此存储过程在ASE v11.0.1, ASE v11.5.1, ASE v11.9.2, ASE v12.5, v12.5.0.3, v12.5.4 平台测试通过!适用于 ASE v11.x, v12.x,不能用于ASE15。实际上ASE15.x中的sp_helpdevice完全能够实现该功能!
* ASE v11.x版本中系统表 sysusages中没有crdate这个表示设备段分配时间的字段,考虑到支持ASEv11.x为了简单处理,没有在Allocation information 中列出设备段的具体分配时间!
*/
use sybsystemprocs
go

if exists(select 1 from dbo.sysobjects where type='P' and name='sp_helpdevice2')
  drop procedure sp_helpdevice2
go

create procedure sp_helpdevice2
@devname varchar(30) = "%"
as

declare @numpgsmb float
declare @numpgsmb2 float
declare @Major_Version int

set nocount on
select @numpgsmb = (1048576. / @@pagesize)
select @numpgsmb2 = (1048576. / @@maxpagesize)
--select @version_as_num = @@version_as_integer
select @Major_Version= convert(int, right(substring(@@version,1,charindex('.',@@version)-1),2) )

if @Major_Version >= 15 or @Major_Version < 11
begin
        print "this procedure is available for ASE versions from v11.x to v12.5.x, not for ASE15.x!"
        return (1)
end

/*  See if the device exists.*/
if not exists (select *
                        from master.dbo.sysdevices
                                where name like @devname)
begin
        /* 17610, "No such i/o device exists." */
        raiserror 17610
        return (1)
end

/* total size of device */
select d.name,
    totalsizeMB = (1. + (d.high - d.low)) / @numpgsmb
  into #totalsize
        from master.dbo.sysdevices d
                where d.status & 2 = 2
                        and name like @devname
                group by d.name

/* Calculate used size in MB */
select d.name,
    usedsizeMB = isnull(sum(u.size) / @numpgsmb2,0)
  into #usedsize                 
        from master.dbo.sysdevices d, master.dbo.sysusages u
                where u.vstart >= d.low and u.vstart <= d.high                           
                        and d.status & 2 = 2
                        and d.name like @devname
                group by d.name
union
select d.name, 0.
from master.dbo.sysdevices d
  where not exists ( select 1 from master.dbo.sysusages u where u.vstart >= d.low and u.vstart <= d.high )
      and d.status & 2 = 2
      and d.name like @devname

set nocount off
/* Calculate the free size of device */
select d.name ,TotalSize = str(#totalsize.totalsizeMB,10,2), UsedSize = str(#usedsize.usedsizeMB,10,2),FreeSize = str(#totalsize.totalsizeMB - #usedsize.usedsizeMB,10,2),phyname = convert(varchar(50),d.phyname)
  from master.dbo.sysdevices d, #totalsize, #usedsize
  where        d.name = #totalsize.name
    and #totalsize.name = #usedsize.name
  order by low,high


if (select count(*) from master.dbo.sysdevices where name like @devname) = 1
begin
        print ""
        print "========================== Allocate Information =========================="
        /*if @Major_Version = 12
                select dbname = db_name(dbid), "size(MB)"=str(size/@numpgsmb2,10,2), allocated = u.crdate, vstart, lstart
                  from master.dbo.sysusages u, master.dbo.sysdevices d
                    where d.status & 2 = 2
                      and d.name like @devname
                      and (u.vstart >= d.low and u.vstart <= d.high )
                   order by dbname,vstart
         else if @Major_Version = 11
         */
                select dbname = db_name(dbid), "size(MB)"=str(size/@numpgsmb2,10,2), vstart, lstart
                  from master.dbo.sysusages u, master.dbo.sysdevices d
                    where d.status & 2 = 2
                      and d.name like @devname
                      and (u.vstart >= d.low and u.vstart <= d.high )
                   order by dbname,vstart

end

drop table #totalsize
drop table #usedsize
go

/* grant the execute privilege to public */
grant execute on sp_helpdevice2 to public
go
作者: Eisen    时间: 2011-08-25 14:17
回复  yiguihuo


    楼主的问题很清楚、明白。 在平常运维中,我也遇到和楼主一样的问题。执行:sp_h ...

  1. /*
  2. * 此存储过程在ASE v11.0.1, ASE v11.5.1, ASE v11.9.2, ASE v12.5, v12.5.0.3, v12.5.4 平台测试通过!适用于 ASE v11.x, v12.x,不能用于ASE15。实际上ASE15.x中的sp_helpdevice完全能够实现该功能!
  3. * ASE v11.x版本中系统表 sysusages中没有crdate这个表示设备段分配时间的字段,考虑到支持ASEv11.x为了简单处理,没有在Allocation information 中列出设备段的具体分配时间!
  4. */
  5. use sybsystemprocs
  6. go

  7. if exists(select 1 from dbo.sysobjects where type='P' and name='sp_helpdevice2')
  8.   drop procedure sp_helpdevice2
  9. go

  10. create procedure sp_helpdevice2
  11. @devname varchar(30) = "%"
  12. as

  13. declare @numpgsmb float
  14. declare @Major_Version int

  15. set nocount on
  16. select @numpgsmb = (1048576. / @@pagesize)
  17. --select @version_as_num = @@version_as_integer
  18. select @Major_Version= convert(int, right(substring(@@version,1,charindex('.',@@version)-1),2) )
复制代码
andkylee 发表于 2011-08-25 12:05



    哈。佩服andkylee...
这样无影脚踢的……
作者: wfcjz    时间: 2011-08-25 14:20
Eisen今天郁闷了。呵呵

不过说实话,楼主没有说清楚用的是ASE15的客户端连的是12.5的库。这个不怪Eisen了。
作者: Eisen    时间: 2011-08-25 14:38
本来有一点点小郁闷,后来被an兄开解了,甚慰……
作者: yiguihuo    时间: 2011-08-25 16:16
对于帮助解决问题的,我都是很感激的,绝对没有什么态度上问题。也许是发帖太少,有什么语言上的问题多见谅了
作者: andkylee    时间: 2011-08-25 16:27
回复 9# Eisen


    实际上,我看了楼主的回复也感觉他说话的语气咄咄逼人。可能楼主做甲方做久了吧。
我说此问题比较清晰、明白,是因为我之前也遇到此问题了。
作者: Eisen    时间: 2011-08-25 17:10
是啊,在ase15之前的版本,这个问题一直很烦人,所以促使我去研究sysdevices和sysusages两个表里面high,low和vstart的关系,而这个东西看懂了之后,自己往往就可以临时写sql解决问题了,不过像你这样形成一个procedure应该还是最终的解决方法。
不过提一点小醒—— select @numpgsmb = (1048576. / @@pagesize)此处…… 嘿嘿。
作者: andkylee    时间: 2011-08-26 13:57
回复 14# Eisen


    恩。select @numpgsmb = (1048576. / @@pagesize)此处的确有问题。

sysdevices页号大小为:@@pagesize=2048,sysusages中页号大小为:@@maxpagesize=配置的页面大小。

8楼的存储过程sp_helpdevice2内容也相应做了更新了。
作者: echoaix    时间: 2011-08-30 14:37
很清楚了,其实系统表里几乎什么都有,就看你怎么组合选取了。
sybase我几乎都忘光了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2