近日,由于部门数据库读库空间过小,提出删除掉两个月之前日志表的分区(数据库分区是按时间月分区),记述如下:

上网搜索资料发现删除表分区大概分这么几步:

1、查询需要删除掉的分区:

select t.DATAPARTITIONNAME from syscat.datapartitions t where  tabname = '?'   with ur

syscat.datapartitions表存放所有的分区,根据表名时间查询出所要删除的分区名。

2、detach分区到一张临时表(该操作会创建临时表,临时表已存在会报错),detach是分离分区的意思:

alter table 表名 detach partition 分区名 into table 临时表名;

3、最后再drop掉临时表。

然后我就代码:

1)据时间、表名查出要删除的分区名,存在list;

2)遍历这个list,循环中先detach分区,再删除临时表。

PS:问题来了,测试中发现drop临时表的时候会报错,报该临时表有分区数据再往里面迁,这里我就怀疑detach操作是异步的了,上网一看相关资料,果不其然。

原来detach操作会先将syscat.datapartitions表中的分区改名,但是所属表名不会改,然后将status状态打为L,表明该分区正在迁移中。

于是我代码先根据表名判断存不存在status为L的数据,没有再进行删表,本地测试成功,批量删除分区成功。然而一放到测试环境,测试人员反馈说报错,又是删表出错,这时候奇怪了,不是判断过状态L了吗,而且本地是可以的,纠结了好久!!!最后想通了,detach既然是异步的,那么打上这个L状态也是异步的了,还没打我后续代码就开心的来判断L状态进行删表了。。。幹!!!那搞这个状态有个屁用。

后面我给了两种方案:

1、设置休眠  Thread.sleep(),由于这个时间不好把控,而且我们库表都是有很多分表的,粗粗估计了下,要删除的分区大概是3张总表*72张分表*40个分区,每个停个100毫秒就耗时很大了,故此方案pass。(不考虑用线程并发,因为DBA不允许。。)

2、递归删表  直至成功

public void drop(表名){

try{

     删表操作

}catch(Exception e){

    drop();

}

}

其实第二种方法是可行的,没办法,代码评审被否掉,于是给了第三种方案:

3、搞两个定时任务

1)先detach分区  分离到拼接的临时表:tmp+表名+分区名,然后新建一张表,存这些被分离的临时表名字,这张表有三个字段:临时表名、状态(删除,未删除)、更新时间

2)然后过段时间,去做删除临时表操作,删完将临删除状态更新为已删除,做了个查询功能监控待删除这张表。

DB2删除表分区的更多相关文章

  1. Oracle 删除表分区

    删除表分区(drop partition)    删除表分区包含两种操作,分别是:   Ø 删除分区:alter table [tbname] drop partition [ptname] UPDA ...

  2. db2删除表中数据

    DB2数据库系统建表后,难免会有将表中数据清空的需求,本文将为您介绍DB2数据库中四种数据删除的方法,供您参考,您可以根据实际情况来进行选择,希望能对有所帮助. 1. 使用 DELETE 语句,即: ...

  3. sqlserver 删除表分区

    我们都知道,SQL server2008R2企业版以及一些其它的版本支持分区函数,当你在这些数据库备份后想在一些不支持分区函数的数据库做还原时,就会失败. 下面我们来解决这个问题. 1.备份数据库!备 ...

  4. DB2表分区删除

    近日,由于部门数据库读库空间过小,提出删除掉两个月之前日志表的分区(数据库分区是按时间月分区),记述如下: 上网搜索资料发现删除表分区大概分这么几步: 1.查询需要删除掉的分区: select t.D ...

  5. Oracle-13:Oracle中的表分区

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客记录了表分区 表分区的含义: 典型的拿空间换时间的案例! 表分区对一张表进行分区,分区之后表中的数据存 ...

  6. 创建,增加,删除mysql表分区

    1.测试添加分区和删除分区 ###添加删除range分区 (1)创建一个分区: CREATE TABLE titles (     emp_no      INT NOT NULL,     titl ...

  7. MySQL-如何删除hash表分区

    一个大表,之前是以hash分区表的形式存在的, MySQL> show create table history_uint; | history_uint | CREATE TABLE `his ...

  8. 查询/删除/建立DB2数据表的主键

    一.查询表主键. describe indexes for table <instancename>.<tablename> 例: describe indexes for t ...

  9. DB2 建表,添加字段,删除字段,修改字段等常用操作

    转载:http://blog.sina.com.cn/s/blog_67aaf4440100v01p.html,稍作修改. --创建数据库 create database Etp; --连接数据库 c ...

随机推荐

  1. PyTorch框架+Python 3面向对象编程学习笔记

    一.CNN情感分类中的面向对象部分 sparse.py super(Embedding, self).__init__() 表示需要父类初始化,即要运行父类的_init_(),如果没有这个,则要自定义 ...

  2. IntelliJ IDEA出现Search for无法退出的问题

    说明: 1.这个不是安装了Vim导致的 解决方式: 1.可能是在不正确的系统时间启动的IDEA,然后启动完成后又把时间改成正确的. 2.直接方式是重启. 3.间接方式是修改完时间后再重启一下全部IDE ...

  3. Maven创建Web工程并执行构建/测试/打包/部署

    创建工程基本参考上一篇Java Application工程,不同的是命令参数变了,创建Web工程的命令如下: mvn archetype:generate -DgroupId=com.jsoft.te ...

  4. 算法题1+2+...+N

    题目:求1+2+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C). int solve(int n) { int i = 1 ...

  5. sql的一些知识

    查询 查询表中的所有列(所有信息) SELECT * FROM userinfo 查询某一列(指定) select name from userinfo 查询某一列(指定,去重) SELECT DIS ...

  6. react 通过 classnames 处理 多个class 的问题

    react原生动态添加多个className会报错: import style from './style.css' <div className={style.class1 style.cla ...

  7. nyoj 135 取石子(二) 【NIM】

    取石子(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 小王喜欢与同事玩一些小游戏.今天他们选择了玩取石子. 游戏规则例如以下:共同拥有N堆石子.已知每堆中石子 ...

  8. mysql 海量数据删除

    百度知道 - mysql删除海量数据   MySQL 数据库删除大批量数据的优化     看到这儿的话,最后看下这篇文章,对于操作海量数据的sql深入分析 cnblogs - 深度分析DROP,TRU ...

  9. Can&#39;t open named pipe to host: . pipe: MySQL

    今天遇到mysql连接odbc时报例如以下错误:Can't open named pipe to host: . pipe: MySQL 错误截图例如以下: 依照网上说的方法包含mysql的官方说法都 ...

  10. 何时使用Entity或DTO

    关注公众号: 锅外的大佬 每日推送国外优秀的技术翻译文章,励志帮助国内的开发者更好地成长! JPA和Hibernate允许你在JPQL和Criteria查询中使用DTO和Entity作为映射.当我在我 ...