免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7520 | 回复: 15
打印 上一主题 下一主题

怎么查看设备文件上还有多少空间没有被分配出去 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:54:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-24 11:10 |只看该作者 |正序浏览
1、怎么查看设备文件上还有多少空间没有被分配出去
2、怎么查看设备文件上有哪几个库并分别分配了多少空间
其实查看这些信息用ASE 15的central图像管理工具很容易就看出来了,但连接数据库时都用SQL Advantage管理,而且很少有机器安装ASE 15的central软件,所有想知道用命令怎么查看和图像界面一样的信息

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


设备文件上有哪几个库及分别分配了多少空间

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-20 06:20:00
16 [报告]
发表于 2011-08-30 14:37 |只看该作者
很清楚了,其实系统表里几乎什么都有,就看你怎么组合选取了。
sybase我几乎都忘光了。

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
15 [报告]
发表于 2011-08-26 13:57 |只看该作者
回复 14# Eisen


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

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

8楼的存储过程sp_helpdevice2内容也相应做了更新了。

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
14 [报告]
发表于 2011-08-25 17:10 |只看该作者
是啊,在ase15之前的版本,这个问题一直很烦人,所以促使我去研究sysdevices和sysusages两个表里面high,low和vstart的关系,而这个东西看懂了之后,自己往往就可以临时写sql解决问题了,不过像你这样形成一个procedure应该还是最终的解决方法。
不过提一点小醒—— select @numpgsmb = (1048576. / @@pagesize)此处…… 嘿嘿。

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
13 [报告]
发表于 2011-08-25 16:27 |只看该作者
回复 9# Eisen


    实际上,我看了楼主的回复也感觉他说话的语气咄咄逼人。可能楼主做甲方做久了吧。
我说此问题比较清晰、明白,是因为我之前也遇到此问题了。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:54:45
12 [报告]
发表于 2011-08-25 16:16 |只看该作者
对于帮助解决问题的,我都是很感激的,绝对没有什么态度上问题。也许是发帖太少,有什么语言上的问题多见谅了

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
11 [报告]
发表于 2011-08-25 14:38 |只看该作者
本来有一点点小郁闷,后来被an兄开解了,甚慰……

论坛徽章:
34
ChinaUnix元老
日期:2018-07-04 15:10:362015年亚洲杯之阿联酋
日期:2015-02-06 17:15:532015亚冠之武里南联
日期:2015-06-06 15:40:252015亚冠之北京国安
日期:2015-06-17 15:42:412022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:322015亚冠之阿尔纳斯尔
日期:2015-09-20 09:42:1215-16赛季CBA联赛之北京
日期:2016-01-15 10:03:5915-16赛季CBA联赛之青岛
日期:2016-04-26 16:44:4915-16赛季CBA联赛之广夏
日期:2018-07-04 15:33:21C
日期:2016-10-25 16:12:142017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之同曦
日期:2017-02-22 22:41:10
10 [报告]
发表于 2011-08-25 14:20 |只看该作者
Eisen今天郁闷了。呵呵

不过说实话,楼主没有说清楚用的是ASE15的客户端连的是12.5的库。这个不怪Eisen了。

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
9 [报告]
发表于 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...
这样无影脚踢的……

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 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
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP