运维人员误操作drop分区导致的性能问题与解决

需积分: 36 2 下载量 160 浏览量 更新于2024-09-10 收藏 698KB PDF 举报
在本篇文章中,作者付义,一位新炬网络的高级技术专家,分享了在一次由运营商系统的数据库运维人员清理历史数据分区时引发的性能问题案例。该运维人员在晚上7点左右使用`alter table`命令`droppartition`来清理数据,导致与该表关联的查询模块效率明显下降,历时约80分钟,影响范围相对较小。 运维人员首先通过`dba_tab_partitions`查询确定了需要清理的分区,然后按照日期范围执行了分区删除操作。问题的出现源于清理操作导致了全局索引失效,这直接影响了查询性能。解决方法是重建了索引并收集了统计信息,从而恢复了业务的正常运行。 运维人员的初衷是为了应对临时需求,因发现表空间不足而决定清理历史数据。然而,他们发现即使清理了两个月的数据,释放的空间并未达到预期,因此进一步清理了另一个月份的分区。文章通过模拟实际场景,创建了一个名为`fuyi_rpart`的测试表,并填充了大量的数据,展示了如何通过`create table`和`insert`语句来模拟真实的分区和数据插入过程。 当运维人员执行`droppartition`操作时,由于分区的删除会改变表的物理结构,特别是对依赖于这些分区的索引产生了影响。当查询涉及到被删除的分区时,如果没有及时更新索引或统计信息,查询优化器可能无法有效地利用现有的数据,导致查询性能下降。 文章的核心知识点包括: 1. **分区管理与性能影响**:分区是一种常见的数据库优化策略,用于分割大表,提高查询性能。但不当的分区清理可能会破坏依赖关系,如索引失效,影响查询性能。 2. **全局索引与分区删除**:全局索引通常覆盖整个表,删除分区可能导致索引不完整,从而影响到对表数据的快速访问。 3. **数据库维护和性能监控**:运维人员需要密切关注清理操作对业务的影响,确保在操作期间采取措施避免对现有查询造成负面影响。 4. **问题排查与解决**:遇到性能问题时,需要通过日志、性能监控工具和深入分析数据库结构来定位问题,并采取相应的修复措施,如重建索引和统计信息。 5. **数据库操作的最佳实践**:对于临时性的空间需求调整,应谨慎评估清理操作的影响,考虑是否可以通过其他方式(如归档、备份等)处理历史数据,以最小化对实时业务的影响。 通过对这次事件的深入剖析,作者强调了数据库管理和优化的重要性,提醒运维人员在执行此类操作时务必充分理解其潜在影响,确保操作的正确性和及时性。
2012-12-25 上传
支持自动ORACLE大表分区: 版本进度: 31. 20110420 V2.2 支持任意表任意时间字段分区 以下为安装部署部分: 1.分区相关脚本部署执行顺序,安装前请确保该用户拥有管理员权限, 同时请执行GRANT CREATE ANY TABLE TO DBUSER, 因为使用到了动态的CREATE TABLE语句; 01) >AGGRE_ERROR_INFO_DDL.SQL 如果日志表AGGRE_ERROR_INFO已经存在,该步骤跳过。 02) >GET_MILLISECOND.SQL 如果函数GET_MILLISECOND已经存在,该步骤跳过。 03) >GET_DATE_FROM_MILLISECOND.SQL 如果函数GET_DATE_FROM_MILLISECOND已经存在,该步骤跳过。 04) >AGGRE_PM_PARTITIONF.SQL 2.注意事项: 01) >部署完后注意检查分区维护JOB[对应存储过程为AGGRE_PM_PARTITIONM], 如果有多个相同的分区维护JOB,则请删除后面创建的JOB,只保留一个分区维护JOB。 检查脚本如下:select t.what,t.* from user_jobs t 02) >本产品中使用的分区调度表名称为AGGRE_PARTITION_TASK,可以根据该表中信息观察分区情况。 以下为说明解释部分: 2.分区改造主过程:AGGRE_PM_PARTITIONF.SQL, 意思是PARTITIONING THE FIRST TIME; 参数解释如下: -- @PARAM VARCHAR2 PARTTABLENAME---可以指定对某个表大小大于等于TABLEONSIZE_M(单位为MB)的表进行按指定时间字段的自动分区; -- @PARAM NUMBER TABLEONSIZE_M---大表自动分区起始大小,单位为兆字节(MB),如不想指定具体大小则置0即可; -- @PARAM NUMBER PARTINTERVAL----取值范围为[1/24,365],表的分区时长,单位为天,默认为1,采用一天一分区; -- @PARAM 若为7,则采用一周一分区,若为30,则采用一月一分区; -- @PARAM NUMBER PARTRESERVED----表数据保留时长,单位为天; -- @PARAM NUMBER BACKINTERVAL----取值范围为[3600,7*86400],表数据回迁时的循环步长,即一次回迁多长时间的数据,单位为秒; -- @PARAM VARCHAR2 PARTWEEKDAY-----取值范围为(SUN,MON),PARTINTERVAL为7时起作用,指定一周的起始天为星期日还是星期一; -- @PARAM VARCHAR2 PARTFIELD-------指定的分区时间字段名称 -- @PARAM VARCHAR2 FIELDFORMAT-----指定的分区时间字段的格式 -- @PARAM VARCHAR2 TISPARTITIONED--取值范围为(TRUE,FALSE),指定PARTTABLENAME参数所指定的表是否是分区表,默认为FALSE -- @PARAM VARCHAR2 PARTEXCHANGE----取值范围为(TRUE,FALSE),是否使用交换分区方法实现非分区表的分区化改造,默认为FALSE -- @PARAM 注意:当PARTEXCHANGE参数为TRUE时,TISPARTITIONED参数只能为FALSE, -- @PARAM 即已经分好区的分区表是不能够使用交换分区的方法转换为另一种分区表的; -- @PARAM VARCHAR2 DROPPABLE-------取值范围为(TRUE,FALSE),指定分区完后是否DROP掉分区备份表; 其中参数FIELDFORMAT的取值范围如下: /** * FIELDFORMAT * 0 NUMBER/CHAR MILLISECOND 1300200064000 13BITS * 1 NUMBER/CHAR SECOND 1300200064 10BITS * 2 NUMBER/CHAR YYYYMMDDHH24MISS 20110315224030 * 3 NUMBER/CHAR YYYYMMDDHH24MI 201103152240 * 4 NUMBER/CHAR YYYYMMDDHH24 2011031522 * 5 NUMBER/CHAR YYYYMMDD 20110315 * 6 NUMBER/CHAR YYYYMM 201103 * 7 NUMBER/CHAR YYYY 2011 * 8 CHAR YYYY-MM 2011-03 * 9 CHAR YYYY-MM-DD 2011-03-15 * 10 CHAR YYYY-MM-DD HH24 2011-03-15 22 * 11 CHAR YYYY-MM-DD HH24:MI 2011-03-15 22:40 * 12 CHAR YYYY-MM-DD HH24:MI:SS 2011-03-15 22:40:30 * 13 CHAR YYYY-MM-DD HH24:MI:SSXFF 2011-03-15 22:40:30.765000 * 14 CHAR YYYY"年" 2011年 * 15 CHAR YYYY"年"MM"月" 2011年03月 * 16 CHAR YYYY"年"MM"月"DD"日" 2011年03月15日 * 17 CHAR YYYY"年"MM"月"DD"日" HH24"时" 2011年03月15日 22时 * 18 CHAR YYYY"年"MM"月"DD"日" HH24"时"MI"分" 2011年03月15日 22时40分 * 19 CHAR YYYY"年"MM"月"DD"日" HH24"时"MI"分"SS"秒" 2011年03月15日 22时40分30秒 * 100 DATE 2011-3-15 23:00:01 * 101 TIMESTAMP 15-3月 -11 10.59.30.953000 下午 +08:00 */ -- 第一次分区尽量在数据库闲时操作,这样更能保证分区表的数据一致性; -- 通常使用的现有大表的分区方法:A.使用RENAME分区 B.使用交换分区 C.使用联机重定义 只有C方案才能保证数据的完全一致性; -- 但是经过测试发现方案B和C都存在分区过程的不透明性,对EXCEPTION不好控制,另外C方案比较适合手工操作,不适合自动运行; -- B方案比较适合将非分区表中的数据放到分区表中的一个分区中,不符合要求,所以本分区存储过程默认采用A方案; -- 当然,也支持通过新增参数PARTEXCHANGE来控制是否使用B方案;PARTEXCHANGE为TRUE,使用B方案,为FALSE,使用A方案; -- 手动运行示例: 自动对800M以上的非分区大表PM_RAW_B_RESTEST进行分区,一天一分区; -- 手动运行示例: SQL> EXEC AGGRE_PM_PARTITIONF('PM_RAW_B_RESTEST',800,1,10,3600,'SUN','DCTIME','0','FALSE','FALSE','FALSE'); -- 推荐以以上这种方式对单个表进行分区,并将DROPPABLE参数设为'FALSE', -- 这样有什么问题可以跟踪,等完后再可手动将分区备份表DROP掉; -- 注意:分区之前请确保相关表空间足够大。 -- 注意:如果在分区化改造过程中数据回迁之前抛出异常,则手动数据回迁前注意检查分区表有无主键索引。 3.分区维护主过程:AGGRE_PM_PARTITIONM.SQL, 意思是PARTITION MANAGEMENT; 4.创建分区维护JOB -- 对在分区调度表中的已经分区的表进行分区清理以及分区追加等 -- 分区维护操作由该JOB自动完成,该过程不用手动干预。