IT分销/经销数据库

怎么解决定期删除大表的数据

db2v9.7
现在库里有几张以日期命名的表,从0101 到1231日 365张表
数据保留90天左右,那么超过90天的表需要删除。

这样类型的表有4张,大家有什么好的方法来做这个事情!  每张表每天大概300万的数据量,以后会逐步增加

我自己想到的几个方法:
方法一:
delete table    我担心大表delete 太慢,会影响其他事务处理
reorge table

方法2:
truncate table immediate; 但是在储存过程中调用这个的时候报错 SQL0428N
查询了一下原因 ,大概意思是说 执行这个命令前 需要 关闭游标(储存过程中就是用游标把表名选择出来的,关闭游标,那么就无法循环了)

方法3:
alter table activate not logged initially with empty table;        --把表变成 not logged ,怎么把表变回logged 呢?
reorg table table_name    ;

想征求一个比较好的方法 ,我在一个表里维护了要删除表的信息
t_delete_manage表里维护了一下信息
TNAME(不好意思,表名替换一下)                 DELETE_COL                     DELETE_PERIOD      
a                                                 BUSINESSDAY                                      90
b                                                 BUSINESSDAY                                      90
c                                                BUSINESSDAY                                      90
d                                                 BUSINESSDAY                                      90
e                                                 FILE_RECEIVED_TIME                               90
f                                              FILE_RECEIVED_TIME                               90
根据这个表里的信息,组成sql 进行 删除操作
我写了这么个储存过程
CREATE OR REPLACE  PROCEDURE  CRB_TEST
()
LANGUAGE SQL
BEGIN
    declare      sqlcode         integer default 0; --
    declare      v_notfound       integer default 0; --
    declare      v_tname          varchar(50);--
    declare      v_delete_col     varchar(30); --
    declare      v_delete_rows    integer;--
    declare      v_delete_log     varchar(100);--
    declare      v_delete_period  integer;--
    declare      sqlStr           varchar(300);--
    declare      condition1       varchar(100);--
    declare      n_is_partition  integer;--
    declare fetchSeqCursor cursor for
            select tname,delete_col,delete_period,IS_PARTITION from tsy_delete_manage order by tname;--
  
    declare  CONTINUE  handler for NOT FOUND set v_notfound = 100; --
    set  v_notfound = 0;--
    open fetchSeqCursor;--
    fetch fetchSeqCursor into v_tname, v_delete_col,v_delete_period,n_is_partition;--
    WHILE  v_notfound=0 DO
   
              set sqlStr='truncate table  '||v_tname||'_'||to_char(current_date-90 days,'mm')||to_char(current_date-90 days,'dd')||' IMMEDIATE';--
              execute immediate sqlStr ;--
              
    set  v_notfound = 0;--
    fetch fetchSeqCursor into v_tname, v_delete_col,v_delete_period,n_is_partition;--
    end WHILE;--
    close fetchSeqCursor;--
END
commit;

call crb_test
SQL0428N  只允许将该 SQL 语句作为工作单元的第一条语句。  SQLSTATE=25001
大家有什么好的方法赐教一下 ,谢谢了
参与26

25同行回答

nowhillnowhill系统工程师
回复  nowhill     如果是给开发的更简单,你用SQL查询出结果为truncate table  XXX.XXX immediate这样 ...hmily1688 发表于 2012-3-2 11:22 谢谢你的解答,这个方法考虑一下    truncate 如果执行失败会有错误信息吗?   ...显示全部
回复  nowhill


    如果是给开发的更简单,你用SQL查询出结果为truncate table  XXX.XXX immediate这样 ...
hmily1688 发表于 2012-3-2 11:22


谢谢你的解答,这个方法考虑一下

    truncate 如果执行失败会有错误信息吗?
    怎么记录日志啊?
    失败日志?收起
IT分销/经销 · 2012-03-02
浏览475
飘叶飘叶数据库管理员volkswagen
回复 12# nowhill     如果是给开发的更简单,你用SQL查询出结果为truncate table  XXX.XXX immediate这样的一个列表,放到一个list中,然后让开发遍历这个list,逐句执行就可以了吧,不一定非要用procedure来实现啊,个人感觉!...显示全部
回复 12# nowhill


    如果是给开发的更简单,你用SQL查询出结果为truncate table  XXX.XXX immediate这样的一个列表,放到一个list中,然后让开发遍历这个list,逐句执行就可以了吧,不一定非要用procedure来实现啊,个人感觉!收起
汽车 · 2012-03-02
浏览401
是整表的数据删除吗? 可否drop table ,再create table 。显示全部
是整表的数据删除吗? 可否drop table ,再create table 。收起
2012-03-02
浏览440
nowhillnowhill系统工程师
set sqlstr='reorg table '||v_tname||'_'||to_char(current_date-90 days,'mm')||to_char(current_date-90 days,'dd');--call SYSPROC.ADMIN_CMD(sqlstr);-- 这个命令也报错SQL0501N  FETCH 语句或 CLOSE 语句中指定的游标尚未打开,或者游标标量函数引用中的...显示全部
set sqlstr='reorg table '||v_tname||'_'||to_char(current_date-90 days,'mm')||to_char(current_date-90 days,'dd');--
call SYSPROC.ADMIN_CMD(sqlstr);--

这个命令也报错
SQL0501N  FETCH 语句或 CLOSE
语句中指定的游标尚未打开,或者游标标量函数引用中的游标变量尚未打开。
SQLSTATE=24501

SQL0501N  FETCH 语句或 CLOSE 语句中指定的游标尚未打开,或者游标标量函数引用中的游标变量尚未打开。

说明:

程序试图执行下列其中一项操作:

*  当指定的游标未打开时,试图使用该游标进行访存(FETCH)。
*  当指定的游标未打开时,试图关闭(CLOSE)该游标。
*  在 OPEN 语句中引用游标变量,但该游标变量尚未打开。
*  引用游标标量函数(例如 CURSOR_ROWCOUNT 函数),但该游标变量尚未打开。

无法处理该语句。

用户响应:

检查先前的消息 (SQLCODE),它可能关闭了游标。注意,在关闭游标后,任何访
存或关闭游标语句都接收到 SQLCODE -501。

如果未发出任何先前的 SQLCODE,那么更正应用程序,确保游标在执行 FETCH 或
CLOSE 语句时是打开的。

如果在游标标量函数中引用游标变量,那么请验证该游标是否不为空、已定义并
且已打开,否则将该游标变量替换为处于该状态的游标变量。

sqlcode:-501

sqlstate:24501收起
IT分销/经销 · 2012-03-02
浏览479
nowhillnowhill系统工程师
我感觉可以换一种思路,你写成shell行吗?db2 connect to newoadb2 "select 'truncate table  '||tabsche ...hmily1688 发表于 2012-3-2 10:58    这个储存过程会在java里调用,写成shell ,不知道开发人员会怎么想 ,^_^...显示全部
我感觉可以换一种思路,你写成shell行吗?
db2 connect to newoa
db2 "select 'truncate table  '||tabsche ...
hmily1688 发表于 2012-3-2 10:58



   这个储存过程会在java里调用,写成shell ,不知道开发人员会怎么想 ,^_^收起
IT分销/经销 · 2012-03-02
浏览398
wp28556259wp28556259软件架构设计师CMBC
回复 7# nowhill    还有,问一下TRUNCATE后,表还是可恢复的吗?这个操作也是不记日志的呀,如果这个操作导致表不可恢复,那和NOT LOGGED一样了。也不用TRUNCATE了显示全部
回复 7# nowhill


   还有,问一下TRUNCATE后,表还是可恢复的吗?这个操作也是不记日志的呀,如果这个操作导致表不可恢复,那和NOT LOGGED一样了。也不用TRUNCATE了收起
银行 · 2012-03-02
浏览487
wp28556259wp28556259软件架构设计师CMBC
回复 3# daolin2005    但是DETACH是一个异步的过程,在存储过程里调用经常报错。以前试过好多次,也不知道该怎么解决。请指点呀显示全部
回复 3# daolin2005


   但是DETACH是一个异步的过程,在存储过程里调用经常报错。以前试过好多次,也不知道该怎么解决。请指点呀收起
银行 · 2012-03-02
浏览505
wp28556259wp28556259软件架构设计师CMBC
回复 6# nowhill    其实用NOT LOGGED方法也行,只要你定期备份,也不会丢失数据的显示全部
回复 6# nowhill


   其实用NOT LOGGED方法也行,只要你定期备份,也不会丢失数据的收起
银行 · 2012-03-02
浏览475
nowhillnowhill系统工程师
partition table ,detach. 具体语法可参考infor center.daolin2005 发表于 2012-3-2 10:35 没法改成partition table了,这个方法我也想的显示全部
partition table ,detach.
具体语法可参考infor center.
daolin2005 发表于 2012-3-2 10:35



没法改成partition table了,这个方法我也想的收起
IT分销/经销 · 2012-03-02
浏览482
nowhillnowhill系统工程师
方法2:TRUNCATE好像只是说放在一个事务的第一行就行了呀?INFOCENTER现在挂了,也看不了,记得好像是这样, ...wp28556259 发表于 2012-3-2 10:38 对于方法二,我试过在truncate 放commit,但是游标还得关闭,但是我的 tname,信息都是从游标里得出来,组合成truncate命令没有游标,就没有t...显示全部
方法2:TRUNCATE好像只是说放在一个事务的第一行就行了呀?INFOCENTER现在挂了,也看不了,记得好像是这样, ...
wp28556259 发表于 2012-3-2 10:38



对于方法二,我试过在truncate 放commit,但是游标还得关闭,但是我的 tname,信息都是从游标里得出来,组合成truncate命令
没有游标,就没有truncate 语句,而truncate 又要关闭游标 我郁闷

看来方法三 行不通

方法一 我在二楼写了个储存过程,好像reorg命令也不行,你帮我看看收起
IT分销/经销 · 2012-03-02
浏览476

提问者

nowhill
系统工程师

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2012-03-02
  • 关注会员:1 人
  • 问题浏览:12252
  • 最近回答:2012-03-03
  • X社区推广