方案一
清理队列表数据。
清理队列表又分为两种方式:
方式一,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;