You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Oracle 19c中确定非分区堆表段的低高水位标记(LHWM)?

确定Oracle 19c(LMT+ASSM)非分区堆表的LHWM位置

在Red Hat系统上的Oracle 19c企业版(本地管理表空间+自动段空间管理)环境中,可通过以下几种方法定位非分区堆表段的低高水位标记(LHWM):

方法一:使用DBMS_SPACE.SPACE_USAGE过程

该过程直接返回段的空间使用统计数据,可辅助计算LHWM位置。

执行以下PL/SQL代码(替换SCHEMA_NAME和TABLE_NAME为实际值):

DECLARE
  l_total_blocks    NUMBER;
  l_unused_blocks   NUMBER;
  l_last_used_extid NUMBER;
  l_last_used_blkid NUMBER;
  l_last_used_blknum NUMBER;
BEGIN
  DBMS_SPACE.SPACE_USAGE(
    segment_owner     => 'SCHEMA_NAME',
    segment_name      => 'TABLE_NAME',
    segment_type      => 'TABLE',
    total_blocks      => l_total_blocks,
    total_bytes       => NULL,
    unused_blocks     => l_unused_blocks,
    unused_bytes      => NULL,
    last_used_extent_id => l_last_used_extid,
    last_used_block_id  => l_last_used_blkid,
    last_used_block_num => l_last_used_blknum,
    partition_name    => NULL
  );
  
  DBMS_OUTPUT.PUT_LINE('段总块数: ' || l_total_blocks);
  DBMS_OUTPUT.PUT_LINE('LHWM以上未使用块数: ' || l_unused_blocks);
  DBMS_OUTPUT.PUT_LINE('已使用到的最后一个区ID: ' || l_last_used_extid);
  DBMS_OUTPUT.PUT_LINE('最后使用块的区起始块ID: ' || l_last_used_blkid);
  DBMS_OUTPUT.PUT_LINE('最后使用块在区内的偏移号: ' || l_last_used_blknum);
END;
/

结果解读:

  • LHWM对应的是已使用块的边界,l_total_blocks - l_unused_blocks即为LHWM以下的已分配且至少部分使用的块数。
  • 结合l_last_used_blkid和l_last_used_blknum,可算出最后一个有数据的块位置:l_last_used_blkid + l_last_used_blknum - 1,LHWM则位于该块的下一个位置。

方法二:查询数据字典视图

通过DBA_SEGMENTS和DBA_EXTENTS视图,结合区的分配情况定位LHWM。

  1. 先查询段的基本信息:
SELECT owner, segment_name, tablespace_name, blocks AS total_blocks
FROM DBA_SEGMENTS
WHERE owner = 'SCHEMA_NAME' AND segment_name = 'TABLE_NAME';
  1. 查询段的区分配详情(按区ID倒序):
SELECT extent_id, file_id, block_id, blocks AS extent_blocks
FROM DBA_EXTENTS
WHERE owner = 'SCHEMA_NAME' AND segment_name = 'TABLE_NAME'
ORDER BY extent_id DESC;

结果解读:

在ASSM模式下,LHWM是包含已使用块的最后一个区的结束位置。计算方式为:最后一个有数据区的block_id + extent_blocks,该值即为LHWM起始的块号。

注:需确保表的统计信息最新,可先执行EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA_NAME', 'TABLE_NAME');刷新统计。

方法三:使用DBMS_SPACE_ADMIN生成段验证报告

该方法生成详细的段空间使用报告,直接标注LHWM位置。

执行以下PL/SQL代码(替换路径和名称):

BEGIN
  DBMS_SPACE_ADMIN.SEGMENT_VERIFY(
    segment_owner     => 'SCHEMA_NAME',
    segment_name      => 'TABLE_NAME',
    segment_type      => 'TABLE',
    partition_name    => NULL,
    verify_option     => DBMS_SPACE_ADMIN.VERIFY_EXTENTS,
    report_file       => '/tmp/lhwm_report.txt', -- Red Hat路径,需确保Oracle用户有写权限
    report_format     => DBMS_SPACE_ADMIN.REPORT_TEXT
  );
END;
/

执行完成后,在Red Hat系统上用cat /tmp/lhwm_report.txt查看报告,报告中会明确列出LHWM对应的文件ID和块号。

权限说明:

执行上述操作需要以下权限之一:

  • 授予SELECT_CATALOG_ROLE和EXECUTE_CATALOG_ROLE角色
  • 单独授予EXECUTE权限在DBMS_SPACE、DBMS_SPACE_ADMIN包上,以及SELECT权限在DBA_SEGMENTS、DBA_EXTENTS视图上

内容的提问来源于stack exchange,提问作者Alex Bartsmon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:43:11