查询数据和日志在同一设备中的 Sybase 数据库的日志段使用情况

Query log segment usage for a Sybase database where data and log are in same device

有没有办法从数据和日志段位于 Sybase 的同一设备中的数据库中获取日志使用情况?

我已经搜索过,并且有显示所有数据库和用法的查​​询示例,但许多人评论说,当数据库段 = 7(数据和登录在同一设备中)时,它将显示相同的值,因为它们在同一设备中.

当发生日志暂停时,数据使用量不一定已满,这就是为什么我想问是否有办法显示数据和日志的真实使用情况,即使它们在同一设备中。

这是我正在使用的查询:

select 
ceiling(sum(case when u.segmap != 4 then u.size/1048576.*@@maxpagesize end )), 
ceiling(sum(case when u.segmap != 4 then size - curunreservedpgs(u.dbid, u.lstart, u.unreservedpgs) end)/1048576.*@@maxpagesize), 
ceiling(sum(case when u.segmap = 4 then u.size/1048576.*@@maxpagesize end)), 
ceiling(sum(case when u.segmap = 4 then u.size/1048576.*@@maxpagesize end) - lct_admin('logsegment_freepages',d.dbid)/1048576.*@@maxpagesize) 
from master..sysdatabases d, master..sysusages u 
where u.dbid = d.dbid  and d.status != 256 and u.dbid = db_id('DBNAME') group by d.dbid

搜索 sp_spaceused 的源代码,我找到了混合数据和日志的部分。

/* 
** For a mixed log and data database, we cannot
** deduce the log used space from the total space
** as it is mixed with data. So we take the expensive
** way by scanning syslogs.
*/
select @total_pages = sum(u.size)
from master.dbo.sysusages u
where u.segmap & 4 = 4
and u.dbid = db_id()

select @used_pages = lct_admin("num_logpages", db_id())
 
/* Account allocation pages as used pages */
select @used_pages = @used_pages + (@total_pages / 256)

得到结果后,我们需要将页面转换为KB或MB,所以我们要查询页面大小:

select @@maxpagesize

我这里是2048(2K页),对应Sybase infocenter中的512的值,所以我们只需要除以@used_pages / 512 得到 space 以 MB 为单位。