oracle清除队列方案

方案一
清理队列表数据。
清理队列表又分为两种方式:
方式一,drop队列并重建
方式二,delete队列表,然后对表进行row move和shrink space降水位。
Drop比delete更慢。
案例:几千万的数据使用脚本运行了半小时。
脚本为:队列表清理及其重建.sql
方案二
数据库建立新的队列,停止应用。
修改应用配置,不同服务器上的应用使用新的队列,重启应用。
然后再清理老的队列。
该方案停机时间短。但如果生产部署模式为被管模式,多路应用版本必须一致,该方案不可行。

清理脚本

DECLARE
v_options sys.dbms_aqadm.aq$_purge_options_t;
BEGIN
SYS.DBMS_AQADM.STOP_QUEUE ( QUEUE_NAME => 'CBSD_LOG_Q_11');--对名名称
dbms_aqadm.purge_queue_table('CBSD_LOG_T_11',NULL,v_options);
SYS.DBMS_AQADM.START_QUEUE(QUEUE_NAME => 'CBSD_LOG_Q_11');
END;
/

队列表清理及其重建

/* Formatted on 2015-1-30 11:32:37 (QP5 v5.185.11230.41888) */
SET SERVEROUTPUT ON;

DECLARE
   v_objname   user_objects.object_name%TYPE;
   v_objtype   user_objects.object_type%TYPE;
   v_count     NUMBER := 1;
   v_rownum    NUMBER := 10000;

   CURSOR cur
   IS
      SELECT OBJECT_NAME, OBJECT_TYPE
        FROM user_objects
       WHERE object_name LIKE '%CBSD_LOG_T%' AND object_type = 'TABLE';
BEGIN
   OPEN CUR;

   LOOP
      FETCH CUR
      INTO v_objname, v_objtype;

      EXIT WHEN cur%NOTFOUND;
      v_count := 1;

      BEGIN
         WHILE v_count != 0
         LOOP
            EXECUTE IMMEDIATE 'select count(1) from ' || v_objname
               INTO v_count;

            DBMS_OUTPUT.put_line (v_objname || ' count [' || v_count || ']');

            IF v_count > 0
            THEN
               EXECUTE IMMEDIATE
                     'delete from '
                  || v_objname
                  || ' where rownum < '
                  || v_rownum;

               COMMIT;
            END IF;
         END LOOP;
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line (
               '删除' || v_objname || '数据失败' || SQLERRM);
      END;

      BEGIN
         EXECUTE IMMEDIATE
            'alter table ' || v_objname || ' enable row movement';
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line (
               '在线movement' || v_objname || '失败' || SQLERRM);
            DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_backtrace);
            DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack);
      END;

      BEGIN
         EXECUTE IMMEDIATE 'alter table ' || v_objname || ' shrink space';
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line (
               '在线重建' || v_objname || '失败' || SQLERRM);
            DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_backtrace);
            DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack);
      END;
   END LOOP;
   CLOSE CUR;
END;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值