iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >分区表或分区索引的BLOCK_ID很大导致DATAFILE无法RESIZE的解决方法
  • 518
分享到

分区表或分区索引的BLOCK_ID很大导致DATAFILE无法RESIZE的解决方法

2024-04-02 19:04:59 518人浏览 薄情痞子
摘要

一 前言最近发现磁盘空间有3T的性能机器出现了磁盘空间不足的现象,该机器主要部署oracle数据库,所以,猜测很可能是表空间数据文件变更导致的。接下来,就需要一步步的排查问题了,最终确认是ORACLE BL

一 前言

最近发现磁盘空间有3T的性能机器出现了磁盘空间不足的现象,该机器主要部署oracle数据库,所以,猜测很可能是表空间数据文件变更导致的。接下来,就需要一步步的排查问题了,最终确认是ORACLE BLOCK_ID惹的祸。


二 定位磁盘空间占用情况

首先需要确定是哪些文件占用空间,使用du -sh * ,果不其然,有个表空间增加了20个数据文件,而且每个数据文件设置30G,Word天,谁这么狠,居然找不到元凶,好吧,那我就任意处置了,不能影响后面的性能测试


三 删除数据文件

既然发现这么多数据文件,当然想直接drop掉,于是,不以为然的执行alter tablespace TEST drop datafile '/oradata/dat20.dbf';先把最后一个干掉,结果执行报错“ORA-03262: THE FILE IS NON-EMPTY”,呵,居然有数据,直接删不掉。于是,就想查询这个表空间的表,把数据TRUNCATE掉,但又考虑到该表空间TABLE就有上千张,而且不能确定哪张表可删,不能太鲁莽,事实证明,真和数据无关。


四 退而求其次-RESIZE 数据文件释放空间

既然不能drop 数据文件,那就resize它,就不信拿不回空间。于是,先查下可以释放多少空间出来,先执行如下命令:

select d.file_name,d.file_id,d.bytes/1024/1024 as d_byte,sum(f.bytes/1024/1024) as free_byte 

from dba_data_files d,dba_free_space f 

where d.file_id=f.file_id and d.file_id=67 

group by d.file_name,d.file_id,d.bytes/1024/1024;

输出显示67号数据文件可用空间29.9G,看到这里,心里暗骂,是谁这么不靠谱,乱加乱设数据文件。不过,都是小问题,resize成1G就行了。于是,又兴冲冲的赶紧执行ALTER DATABASE DATAFILE '/oradata/hisdat20.dbf' RESIZE 1G; 居然又报错了,

“ORA-03297:file contains used data beyond requested RESIZE value”,看到这个报错,开始意识到可能问题没有这么简单。


五 shrink space降低高水位

既然实际数据很少,resize却不能成功,就表明是某些数据块位于数据文件的末端,那就先降降HWM高水位,对表空间的表进行操作,主要命令如下:

alter table test_table enable row movement;

alter table test_table shrink space; ---降低高水位,释放空间

alter table test_table disable row movement;


当然,这样一个个的执行不显示,需要批量执行,命令如下:

SELECT DISTINCT 'alter table ' || segment_name || ' enable row movement;'||

                'alter table ' || segment_name || ' shrink space;'||

                'alter table ' || segment_name || ' disable row movement;'

 FROM dba_extents

 WHERE tablespace_name = 'TEST'

 AND segment_type = 'TABLE'


降低HWM后,再次执行RESIZE操作,报错依旧,好吧,既然这样都没搞定,需要认真研究下了。


六 找到真凶和解决方法

通过上述尝试,发现数据文件可用空间充足,但对ORACLE而言,数据文件使用了30G,所以RESIZE到1G会报错失败,尽快进行了降高水位或TRUNCATE操作都无济于事。于是,排查和解决思路是这样的:

1)查询数据文件的最大BLOCK_ID

select max(block_id) from dba_extents where file_id=67;


2)确定该BLOCK_ID与哪个表或索引有关

SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, A.PARTITioN_NAME FROM DBA_EXTENTS A WHERE FILE_ID = 67 AND block_id = 3839929;

查询后,发现最大的BLOCK_ID都是与分区表或分区索引有关的。


3)针对最大BLOCK_ID出现在分区表的处理方法

对分区表出现最大BLOCK_ID的情况,采用先降分区表高水位,然后MOVE表空间,命令如下:

alter table TEST_TABLE MODIFY PARTITION P101101 shrink space;---注意降低高水位并不能降低数据文件中block_id大小

alter table TEST_TABLE move partition P101101 tablespace TEST;---move操作数据移动表空间最前面的空闲block,注意需要重建索引


4)针对最大BLOCK_ID出现在索引分区的处理方法

对索引分区出现最大BLOCK_ID的情况,重建分区索引即可,命令如下:

ALTER INDEX IDX_TEST_TABLE REBUILD PARTITION P201201


5)处理完后,再次执行RESIZE操作,数据文件大小修改成功。


最后,因为同个文件号上可能出现多个分区表,分区索引需要处理的情况,建议像第五步写成批量执行,提高效率。


关于shrink space降低高水位,可以参考博文Oracle delete操作隐藏着你可能不知道的秘密


您可能感兴趣的文档:

--结束END--

本文标题: 分区表或分区索引的BLOCK_ID很大导致DATAFILE无法RESIZE的解决方法

本文链接: https://www.lsjlt.com/news/36370.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • sql怎么查看表的索引
    通过查询系统表,可以获取表的索引信息,包括索引名称、是否唯一、索引类型、索引列和行数。常用系统表有:mysql 的 information_schema.statistics、postg...
    99+
    2024-05-14
    mysql oracle
  • sql怎么查看索引
    您可以使用 sql 通过以下方法查看索引:show indexes 语句:显示表中定义的索引列表及其信息。explain 语句:显示查询计划,其中包含用于执行查询的索引。informat...
    99+
    2024-05-14
  • sql怎么查看存储过程
    如何查看 sql 存储过程的源代码:使用 show create procedure 语句直接获取创建脚本。查询 information_schema.routines 表的 routi...
    99+
    2024-05-14
  • sql怎么查看视图表
    要查看视图表,可以使用以下步骤:使用 select 语句获取视图中的数据。使用 desc 语句查看视图的架构。使用 explain 语句分析视图的执行计划。使用 dbms 提供...
    99+
    2024-05-14
    oracle python
  • sql怎么查看创建的视图
    可以通过sql查询查看已创建的视图,具体步骤包括:连接到数据库并执行查询select * from information_schema.views;查询结果将显示视图的名称、...
    99+
    2024-05-14
    mysql
  • sql怎么用循环语句实现查询
    可以通过 do 和 while 语句创建循环,并在循环内执行查询,详细步骤包括:定义循环变量设置循环初始值循环执行查询更新循环变量执行查询循环退出条件 SQL 中使用循环语句实现查询 ...
    99+
    2024-05-14
  • sql怎么用代码修改表中数据
    通过 sql 代码修改表中数据的方法包括:修改单个记录:使用 update 语句设置列值并指定条件。修改多条记录:在 update 语句中指定多个条件来修改满足条件的所有记录。增加新列:...
    99+
    2024-05-14
  • sql怎么用命令创建数据库
    在 sql 中使用 create database 命令创建新数据库,其语法包含以下步骤:指定数据库名称。指定数据库文件和日志文件的位置(可选)。指定数据库大小、最大大小和文件增长(可选...
    99+
    2024-05-14
  • sql怎么用身份证提取年龄
    sql 中提取身份证号码中的年龄的方法:提取出生日期部分(身份证号码中第 7-14 位);使用 to_date 函数转换为日期格式;使用 extract 函数计算与当前日期之间的年差。 ...
    99+
    2024-05-14
  • sql怎么看字段长度
    有两种方法可查看 sql 中的字段长度:使用 information_schema 架构,其中包含元数据信息,可用于查询字段长度。使用内建函数,如 length(),其适用于字符串数据类...
    99+
    2024-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作