ORA-25205: the QUEUE SYS.KUPC$S_1_20180123193821 does not exist


[oracle@hbjfdba:/oratmp]#expdp \'XXX as sysdba\' DIRECTORY=TMP_DUMP_DIR DUMPFILE=NEW_LOCAL_HB_DMN_%U.dmp SCHEMAS=NEW_LOCAL_HB_DMN exclude=statistics logfile=NEW_LOCAL_HB_DMN_exp.log version=10.2.0.2 ;

Export: Release 10.2.0.4.0 - 64bit Production on Tuesday, 23 January, 2018 19:38:20

Copyright (c) 2003, 2007, Oracle. All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
Starting "SYS"."SYS_EXPORT_SCHEMA_03": 'sys/******** AS SYSDBA' DIRECTORY=TMP_DUMP_DIR DUMPFILE=NEW_LOCAL_HB_DMN_%U.dmp SCHEMAS=NEW_LOCAL_HB_DMN exclude=statistics logfile=NEW_LOCAL_HB_DMN_exp.log version=10.2.0.2 
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA

UDE-00008: operation generated ORACLE error 39078
ORA-39078: unable to dequeue message for agent KUPC$A_1_20180123193822 from queue "KUPC$S_1_20180123193821"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPC$QUE_INT", line 565
ORA-25205: the QUEUE SYS.KUPC$S_1_20180123193821 does not exist
ORA-06512: at "SYS.DBMS_DATAPUMP", line 2772
ORA-06512: at "SYS.DBMS_DATAPUMP", line 3886
ORA-06512: at line 1

-- 可能存在的原因, streams_pool 太小,稍稍调大一点
SQL> show parameter stream

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
streams_pool_size big integer 400M

SQL> alter system set streams_pool_size=500m scope=both sid='hbdw1';

System altered.

SQL> alter system set streams_pool_size=500m scope=both sid='hbdw2';

System altered.

调整后,没有报错。

<think>我们遇到了在清理审计跟踪时出现ORA-46258错误的问题。根据引用[1]和[3],我们知道Oracle提供了DBMS_AUDIT_MGMT包来管理审计记录,包括清理。ORA-46258错误通常与清理操作的条件不满足有关。 根据Oracle文档,ORA-46258错误表示:在尝试清理审计跟踪时,没有找到符合指定条件的审计记录。这可能是由于清理操作的时间范围设置不正确,或者审计记录已经被清理过。 解决步骤: 1. **检查当前审计记录的时间范围** 首先,我们需要确认审计记录中最早和最晚的时间戳,以确定清理的时间范围是否合理。 ```sql SELECT MIN(EXTENDED_TIMESTAMP), MAX(EXTENDED_TIMESTAMP) FROM AUD$; ``` 2. **初始化清理设置(如果尚未初始化)** 使用`DBMS_AUDIT_MGMT.INIT_CLEANUP`过程初始化审计清理设置。需要指定清理间隔(以小时为单位)和默认清理时间窗口(例如,24小时前)。 ```sql BEGIN DBMS_AUDIT_MGMT.INIT_CLEANUP( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, DEFAULT_CLEANUP_INTERVAL => 24 /* 小时 */); END; / ``` 3. **设置归档时间戳** 使用`DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP`设置一个时间戳,表示清理操作将删除该时间戳之前的所有审计记录。注意:这个时间戳必须早于当前最早的审计记录时间戳,否则会出现ORA-46258。 ```sql DECLARE l_last_archive_time TIMESTAMP := SYSTIMESTAMP - INTERVAL '30' DAY; -- 清理30天前的记录 BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, LAST_ARCHIVE_TIME => l_last_archive_time); END; / ``` 4. **执行清理操作** 使用`DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL`过程清理审计记录。注意:如果之前没有设置归档时间戳,或者设置的时间戳没有早于任何审计记录的时间戳,则可能引发ORA-46258。 ```sql BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, USE_LAST_ARCH_TIMESTAMP => TRUE); EXCEPTION WHEN OTHERS THEN IF SQLCODE = -46258 THEN DBMS_OUTPUT.PUT_LINE('没有找到符合清理条件的审计记录。'); ELSE RAISE; END IF; END; / ``` 5. **检查清理配置** 如果仍然遇到问题,检查是否已经正确初始化清理配置: ```sql SELECT * FROM DBA_AUDIT_MGMT_CONFIG_PARAMS; ``` 确保`PARAMETER_NAME`为`DEFAULT CLEAN UP INTERVAL`和`LAST ARCHIVE TIMESTAMP`的值正确。 6. **手动删除(谨慎使用)** 如果上述方法无效,可以考虑手动删除(但需谨慎,因为可能影响数据库完整性): ```sql DELETE FROM AUD$ WHERE EXTENDED_TIMESTAMP < SYSTIMESTAMP - INTERVAL '30' DAY; COMMIT; ``` 注意:手动删除后需要重建索引: ```sql ALTER INDEX I_AUD1 REBUILD; ALTER INDEX I_AUD2 REBUILD; ``` **预防措施**: - 定期执行清理任务,避免审计记录堆积(引用[3]提到审计记录可能撑爆表空间) - 将审计表(AUD$)从SYSTEM表空间迁移到其他表空间(引用[2]和[3]提到SYSAUX表空间满的问题) - 关闭不必要的审计(引用[2]提到关闭审计功能) 迁移AUD$表到其他表空间: ```sql -- 创建新的表空间(如果需要) CREATE TABLESPACE audit_ts DATAFILE '/path/to/audit01.dbf' SIZE 1G AUTOEXTEND ON; -- 迁移AUD$表 BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, AUDIT_TRAIL_LOCATION_VALUE => 'AUDIT_TS'); END; / ``` **相关问题**: 1. 如何配置Oracle自动清理审计记录? 2. 迁移AUD$表到其他表空间的步骤是什么? 3. 关闭Oracle数据库审计功能的方法有哪些? 4. 如何监控Oracle审计记录的增长? 5. 除了DBMS_AUDIT_MGMT,还有哪些方法可以清理审计记录? 通过以上步骤,应该可以解决ORA-46258错误。如果问题仍然存在,请检查Oracle版本(引用[1]提到11.2增强的清理功能)并确认操作是否符合版本要求。 [^1]: Oracle11gr2 AUDIT清除功能增强(二) [^2]: SYSAUX表空间因审计而满的解决方法 [^3]: 清理Oracle审计记录的方法</think>### 解决 ORA-46258 错误的完整指南 当使用 `DBMS_AUDIT_MGMT` 清理审计跟踪时出现 **ORA-46258: 未找到符合指定条件的审计记录** 错误,通常是由于清理条件配置不当导致的。以下是系统化的解决方案: --- ### 错误原因分析 1. **清理时间范围设置错误** - 指定的清理时间范围(`LAST_ARCHIVE_TIME`)没有覆盖任何审计记录 - 审计记录的时间戳早于数据库初始化时间 2. **初始化步骤未完成** - 未正确执行 `INIT_CLEANUP` 过程初始化清理环境 3. **审计类型不匹配** - 清理操作指定的审计类型与实际存储类型不一致 --- ### 解决方案步骤 #### 步骤 1:验证审计记录时间范围 ```sql SELECT MIN(EXTENDED_TIMESTAMP) AS oldest_record, MAX(EXTENDED_TIMESTAMP) AS newest_record FROM AUD$; ``` #### 步骤 2:正确初始化清理环境 ```sql BEGIN DBMS_AUDIT_MGMT.INIT_CLEANUP( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, -- 标准审计 DEFAULT_CLEANUP_INTERVAL => 24 * 60 -- 清理间隔(分钟) ); END; / ``` #### 步骤 3:设置有效的归档时间戳 ```sql DECLARE l_last_archive_time TIMESTAMP := SYSTIMESTAMP - INTERVAL '30' DAY; -- 清理30天前记录 BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, LAST_ARCHIVE_TIME => l_last_archive_time ); END; / ``` #### 步骤 4:执行清理操作(关键修复) ```sql BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, USE_LAST_ARCH_TIMESTAMP => TRUE, -- 必须设置为TRUE CONTAINER => DBMS_AUDIT_MGMT.CONTAINER_CURRENT -- 多租户环境需指定 ); END; / ``` #### 步骤 5:验证清理结果 ```sql SELECT COUNT(*) FROM AUD$ WHERE EXTENDED_TIMESTAMP < SYSTIMESTAMP - INTERVAL '30' DAY; ``` --- ### 高级配置建议 1. **创建定期清理任务** ```sql BEGIN DBMS_AUDIT_MGMT.CREATE_PURGE_JOB( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, AUDIT_TRAIL_PURGE_INTERVAL => 24, -- 每24小时执行 AUDIT_TRAIL_PURGE_NAME => 'AUDIT_CLEAN_JOB', USE_LAST_ARCH_TIMESTAMP => TRUE ); END; / ``` 2. **迁移审计表到专用表空间** ```sql -- 创建专用表空间 CREATE TABLESPACE audit_ts DATAFILE '/u01/app/oracle/oradata/audit01.dbf' SIZE 1G AUTOEXTEND ON; -- 迁移审计表 BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, AUDIT_TRAIL_LOCATION_VALUE => 'AUDIT_TS' ); END; / ``` 3. **关闭不必要的审计(可选)** ```sql -- 查看当前审计配置 SELECT * FROM DBA_PRIV_AUDIT_OPTS; -- 关闭特定审计 NOAUDIT SELECT TABLE BY SCOTT; ``` --- ### 常见错误排查表 | 错误现象 | 原因 | 解决方案 | |----------|------|----------| | ORA-46258 | 时间范围不匹配 | 使用`MIN(EXTENDED_TIMESTAMP)`设置正确时间戳 | | ORA-00904: "EXTENDED_TIMESTAMP" | Oracle版本<11g | 使用`NTIMESTAMP#`替代`EXTENDED_TIMESTAMP` | | ORA-06550: 程序包不存在 | 未安装DBMS_AUDIT_MGMT | 执行`@?/rdbms/admin/cataudit.sql` | | ORA-01555: 快照过旧 | 清理期间有长事务 | 在低峰期执行清理 | --- ### 预防措施 1. **定期监控审计表空间** ```sql SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024) AS size_mb, ROUND(SUM(bytes - NVL(free_space,0))/1024/1024) AS used_mb FROM dba_data_files JOIN (SELECT tablespace_name, SUM(bytes) free_space FROM dba_free_space GROUP BY tablespace_name) USING (tablespace_name) WHERE tablespace_name IN ('SYSTEM','SYSAUX','AUDIT_TS') GROUP BY tablespace_name; ``` 2. **设置审计表空间警报** ```sql BEGIN DBMS_SERVER_ALERT.SET_THRESHOLD( metrics_id => DBMS_SERVER_ALERT.TABLESPACE_PCT_FULL, warning_operator => DBMS_SERVER_ALERT.OPERATOR_GE, warning_value => '85', critical_operator => DBMS_SERVER_ALERT.OPERATOR_GE, critical_value => '97', observation_period => 1, consecutive_occurrences=> 1, instance_name => NULL, object_type => DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE, object_name => 'AUDIT_TS' ); END; / ``` --- ### 相关问题 1. 如何将Oracle审计记录迁移到专用表空间? 2. Oracle 19c中审计清理有哪些新特性? 3. 如何配置自动清理不同审计类型(标准审计/FGA审计/操作系统审计)? 4. 审计记录清理后如何恢复? 5. 多租户环境下如何集中管理PDB的审计记录? > 通过合理配置自动清理策略[^1],可有效预防审计表空间膨胀导致的系统故障。定期检查审计设置是DBA关键维护任务之一[^3]。 [^1]: Oracle11gr2 AUDIT清除功能增强(二) [^2]: SYSAUX表空间因审计而满的解决方法 [^3]: 清理Oracle审计记录的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值