如何快速生成表MOVE相关操作

事情来由

前段时间某数据库存储空间不足,领导让我把旧表空间删掉,用以回收存储空间给当前在用的表空间使用,所以有了写一个脚本快速生成move表相关操作并且move方式对生产的影响能做到尽可能小的想法。时间紧迫,这里用了较为熟悉的shell方式。表空间情况描述

旧表空间数据文件有一个多T,但实际使用空间只有300多G,很多表已经清空了,表结构还在。查询了表的类型和索引类型,可以说是各种类型都有,部分表还带LOB字段,总之就是表很多,种类很杂,简单的SQL语句拼接肯定是不行了。思路梳理及脚本

总结可能会碰到的情况,实际上有以下几种:

  1. 表为普通表,有普通索引和分区索引
  2. 表为普通表,仅有普通索引
  3. 表为普通表,仅有分区索引
  4. 表为普通表,无索引
  5. 表为分区表,有全局索引和本地索引
  6. 表为分区表,仅有全局索引
  7. 表为分区表,仅有本地索引
  8. 表为分区表,无索引

*表含有LOB字段的情况,可以后续单独处理,因为情况相对较少,仅普通LOB字段和分区LOB字段

我的处理思路是:

1、编辑好参数文件,包含属主、表名、move并行度、表move目标表空间、索引move目标表空间。读取一行后,将表的情况输出至表临时文件,将索引的情况输出至索引临时文件,内容如下图:

如何快速生成表MOVE相关操作

2.将得出的表和索引临时文件根据是否分区的标志位“YES”“NO”做处理。如下图所示:

如何快速生成表MOVE相关操作

3.根据相应的文件是否存在,从而根据不同的情况输出不同情况下的SQL操作语句。

如果是普通表,则直接先move表,若表既有普通索引又有分区索引,则先rebuild普通索引,再将分区索引按分区rebuild(无法整个rebuild);若只有一种索引,则在move表后rebuild即可。如下图所示:

如何快速生成表MOVE相关操作

4.如果是分区表,则要复杂一些。如果分区表既有全局索引又有分区索引,那么先rebuild全局索引,然后逐个move分区(加updateglobalindexes参数防止全局索引失效),当move一个分区后,随即rebuild这个分区上的所有分区索引的对应分区,再循环操作下一个表分区。如果分区表仅有一种索引,则也是根据索引类型,输出对应的SQL操作语句即可。

如何快速生成表MOVE相关操作

后续操作

执行脚本后,就将所有的move相关操作都输出到了统一的SQL文件中,并将处理过的表按普通和分区表分区做了跟踪列表。只需找个空闲的窗口后台调用此SQL文件即可。如下图所示:

如何快速生成表MOVE相关操作


问题处理及总结

当然,脚本只是个工具,是辅助我们提高工作效率的,在move过程中,应当做好监控,防止有异常产生,并写好应对异常的预案,比如失效索引批量重建啥的。而对于LOB字段,更应当根据实际情况来处理,需要考虑数据库本身配置、性能以及LOB字段大小等。在真正删除表空间及数据文件前,也应当最后确认一下是否还有对象,并做自包含检查。在删除表空间之后,为防止特殊情况,可以再建一个同名的表空间,给一个很小的数据文件即可。

来源:IT那活儿,本文观点不代表自营销立场,网址:https://www.zyxiao.com/p/120480

发表评论

登录后才能评论
侵权联系
返回顶部