如何在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。
- 先查询段的基本信息:
SELECT owner, segment_name, tablespace_name, blocks AS total_blocks FROM DBA_SEGMENTS WHERE owner = 'SCHEMA_NAME' AND segment_name = 'TABLE_NAME';
- 查询段的区分配详情(按区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
相关产品推荐
相关产品推荐

