错误类型及描述:
expdp 导出表在表分析是开始出现报错。错误原因
1、用户SYS用户事物处于无效状态
2、用户SYS用户的事物被删除
3、存在无效的object
4、以前做过的流复制没有清理干净,残留下来的很多垃圾导致的无效object.
解决方法:
1、DELETE FROM exppkgact$ WHERE SCHEMA='EXFSYS';
2、用TOAD登入数据库,然后删除无效的object.
3、删除残余的流复制垃圾
Object Owner Cleanup
Log in as the user who owns the queue_table. (This username will replace the <schema> value where referred to below.)
Within sqlplus
SQL> SELECT object_name, object_type FROM user_objects WHERE object_name like '%<QUEUE_TABLE_NAME>%';
where <QUEUE_TABLE_NAME> is replaced with the appropriate value.
Depending on what parts of the queue table remain you could see a number of different objects.
SELECT object_name, object_type FROM user_objects
WHERE object_name like '%ALL1%' or object_name like '%ALL3%' or object_name like '%ALL2%';
2. Drop any sequences associated with <QUEUE_TABLE_NAME> via drop sequence ... .
drop sequence AQ$_CAPTURE_QUEUE_T_ALL1_N;
drop sequence AQ$_CAPTURE_QUEUE_T_ALL2_N;
drop sequence AQ$_CAPTURE_QUEUE_T_ALL3_N;
3. ALTER SESSION SET EVENTS '10851 trace name context forever, level 2';
4. DROP TABLE <QUEUE_TABLE_NAME> CASCADE CONSTRAINTS;
DROP TABLE CAPTURE_QUEUE_T_ALL1 CASCADE CONSTRAINTS;
DROP TABLE CAPTURE_QUEUE_T_ALL2 CASCADE CONSTRAINTS;
DROP TABLE CAPTURE_QUEUE_T_ALL3 CASCADE CONSTRAINTS;
5. Repeat for all the following tables
DROP TABLE AQ$_<QUEUE_TABLE_NAME>_<X> CASCADE CONSTRAINTS;
where <X> is replaced by the appropriate value.
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL1_H CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL1_G CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL1_C CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL1_D CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL1_I CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL1_S CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL1_T CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL1_L CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL1_P CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL2_H CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL2_G CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL2_C CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL2_D CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL2_I CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL2_S CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL2_T CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL2_L CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL2_P CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL3_H CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL3_G CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL3_C CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL3_D CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL3_I CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL3_S CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL3_T CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL3_L CASCADE CONSTRAINTS;
DROP TABLE AQ$_CAPTURE_QUEUE_T_ALL3_P CASCADE CONSTRAINTS;
SYSTEM User Cleanup
connect as system
1. SELECT schema, name, objno FROM SYSTEM.AQ$_QUEUE_TABLES WHERE name LIKE '%<QUEUE_TABLE_NAME>%';
take a note of the schema, objno, and name, for the relevant schema, if any is returned.
SELECT schema, name, objno FROM SYSTEM.AQ$_QUEUE_TABLES WHERE name IN ('CAPTURE_QUEUE_T_ALL1','CAPTURE_QUEUE_T_ALL2','CAPTURE_QUEUE_T_ALL3')
2. SELECT oid, eventid, table_objno, name FROM SYSTEM.AQ$_QUEUES WHERE name IN ('<QUEUE_NAME_1>','<QUEUE_NAME_2>',....) ;
take a note of the oids, table_objnos and names. The oid values, i.e, OID_1, etc., eventid and names, e.g. QUEUE_NAME_1, etc., will be used in the Data Dictionary Cleanup section.
SELECT oid, eventid, table_objno, name FROM SYSTEM.AQ$_QUEUES WHERE name IN ('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E') ;
3. DELETE FROM SYSTEM.AQ$_QUEUE_TABLES where objno=<objno from above>;
DELETE FROM SYSTEM.AQ$_QUEUE_TABLES where objno IN (SELECT objno FROM SYSTEM.AQ$_QUEUE_TABLES WHERE name IN ('CAPTURE_QUEUE_T_ALL1','CAPTURE_QUEUE_T_ALL2','CAPTURE_QUEUE_T_ALL3')
)
4. DELETE FROM SYSTEM.AQ$_QUEUES WHERE table_objno=<table_objno from above>;
DELETE FROM SYSTEM.AQ$_QUEUES WHERE table_objno IN (SELECT table_objno FROM SYSTEM.AQ$_QUEUES WHERE name IN ('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E') );
commit;
Data Dictionary Cleanup
connect as sys as sysdba
Find the owner# corresponding to the relevant <schema> from
select distinct o.owner# from obj$ o, user$ u where o.owner#=u.user# and u.name='<schema>';
This result will be referred to a <owner_num> in the statements below.
select distinct o.owner# from obj$ o, user$ u where o.owner#=u.user# and u.name='STRMADMIN';
86
Then
1. (a) and (b) are valid for all versions. (c) and (d) are valid only for
9.2.0.1 and above.
Queues (type#24)
(a) SELECT obj#,name FROM SYS.OBJ$ where type# ='24' AND owner# = <owner_num> AND name IN ('<QUEUE_NAME_1>','<QUEUE_NAME_2>',....);
where <QUEUE_NAME_1>, etc., are those found from the select of queue names.
SELECT obj#,name FROM SYS.OBJ$ where type# ='24' AND owner#='86'
and name in('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E')
Rule Sets (type#46)
(b) SELECT obj#,name FROM SYS.OBJ$ WHERE type#=46 AND owner# = <owner_num> AND name LIKE '%QUEUE_NAME_1%';
where <QUEUE_NAME_1>, etc., are those found from the select of queue names.
SELECT obj#,name FROM SYS.OBJ$ where type# =46 AND owner#=86
and name in('CAPTURE_QUEUE_ALL1_N','CAPTURE_QUEUE_ALL1_R','CAPTURE_QUEUE_ALL2_N','CAPTURE_QUEUE_ALL2_R','CAPTURE_QUEUE_ALL3_N','CAPTURE_QUEUE_ALL3_R')
Rules (type#59)
(c) SELECT obj#,name FROM SYS.OBJ$ WHERE type#=59 AND owner# = <owner_num> AND name LIKE '%QUEUE_NAME_1%';
where <QUEUE_NAME_1>, etc., are those found from the select of queue names.
SELECT obj#,name FROM SYS.OBJ$ WHERE type#=59 AND owner# = 86 AND ctime >= to_date('20131124','yyyymmdd') and ctime < to_date('20131130','yyyymmdd')
order by ctime
Evaluation Context (type#=62)
(d) SELECT obj#,name FROM SYS.OBJ$ WHERE type#=62 AND owner# = <owner_num> AND name LIKE '%QUEUE_TABLE_NAME%';
where <QUEUE_TABLE_NAME> is that found previously.
SELECT obj#,name FROM SYS.OBJ$ WHERE type#=62 AND owner# = 86 AND name IN('AQ$_CAPTURE_QUEUE_T_ALL1_V','AQ$_CAPTURE_QUEUE_T_ALL2_V','AQ$_CAPTURE_QUEUE_T_ALL3_V');
(b) DELETE FROM SYS.OBJ$ WHERE obj# IN (<obj#1>, <obj#2>, ...);
where <obj#1>, etc are all the obj# found from Step 1 (a).
DELETE FROM SYS.OBJ$ WHERE OBJ# IN (SELECT obj# FROM SYS.OBJ$ where type# ='24' AND owner#='86'
and name in('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E')
)
Using the name values for Step 1 (c) above
execute DBMS_RULE_ADM.DROP_RULE('<schema>.<rule_name>',TRUE);
SELECT 'execute DBMS_RULE_ADM.DROP_RULE(''' || 'STRMADMIN.' || name || ''',TRUE);' FROM SYS.OBJ$ WHERE type#=59 AND owner# = 86 AND ctime >= to_date('20131124','yyyymmdd') and ctime < to_date('20131130','yyyymmdd')
order by ctime
类似:
execute DBMS_RULE_ADM.DROP_RULE('STRMADMIN.CWREPORT_NAME74761',TRUE);
Using the name values for Step 1 (d) above
--如果无法清除,报错ORA-24170的错误,则执行下面的语句后再清除:
--ALTER SESSION SET EVENTS = '25475 TRACE NAME CONTEXT FOREVER, LEVEL 2';
execute DBMS_RULE_ADM.DROP_EVALUATION_CONTEXT('STRMADMIN.AQ$_CAPTURE_QUEUE_T_ALL1_V',TRUE);
execute DBMS_RULE_ADM.DROP_EVALUATION_CONTEXT('STRMADMIN.AQ$_CAPTURE_QUEUE_T_ALL2_V',TRUE);
execute DBMS_RULE_ADM.DROP_EVALUATION_CONTEXT('STRMADMIN.AQ$_CAPTURE_QUEUE_T_ALL3_V',TRUE);
3. DELETE FROM SYS.EXPACT$ WHERE owner='<schema>' AND name LIKE '%<QUEUE_TABLE_NAME>%';
4. DELETE FROM SYS.EXPACT$ WHERE owner='<schema>' AND name LIKE '%<QUEUE_NAME>%';
5. DELETE FROM SYS.NOEXP$ WHERE owner='<schema>' AND name LIKE '%<QUEUE_TABLE_NAME>%';
6. DELETE FROM SYS.NOEXP$ WHERE owner='<schema>' AND name LIKE '%<QUEUE_NAME>%';
commit;
select * from SYS.NOEXP$ WHERE owner='STRMADMIN' AND NAME IN ('AQ$_CAPTURE_QUEUE_T_ALL1_D','AQ$_CAPTURE_QUEUE_T_ALL1_P','AQ$_CAPTURE_QUEUE_T_ALL2_D','AQ$_CAPTURE_QUEUE_T_ALL2_P','AQ$_CAPTURE_QUEUE_T_ALL3_D','AQ$_CAPTURE_QUEUE_T_ALL3_P')
DELETE from SYS.NOEXP$ WHERE owner='STRMADMIN' AND NAME IN ('AQ$_CAPTURE_QUEUE_T_ALL1_D','AQ$_CAPTURE_QUEUE_T_ALL1_P','AQ$_CAPTURE_QUEUE_T_ALL2_D','AQ$_CAPTURE_QUEUE_T_ALL2_P','AQ$_CAPTURE_QUEUE_T_ALL3_D','AQ$_CAPTURE_QUEUE_T_ALL3_P')
commit;
Propagation Cleanup [Optional]
1. DELETE FROM SYS.AQ$_SCHEDULES WHERE oid IN ('<OID_1>', ....);
where the <OID_1> values are those obtained from the SYSTEM Cleanup stage.
SELECT * FROM SYS.AQ$_SCHEDULES WHERE oid IN (SELECT oid FROM SYSTEM.AQ$_QUEUES WHERE name IN ('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E') );
DELETE FROM SYS.AQ$_SCHEDULES WHERE oid IN (SELECT oid FROM SYSTEM.AQ$_QUEUES WHERE name IN ('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E') );
2. DELETE FROM SYS.AQ$_MESSAGE_TYPES WHERE queue_oid IN ('<OID_1>', ....);
where the <OID_1> values are those obtained from the SYSTEM Cleanup stage.
SELECT * FROM SYS.AQ$_MESSAGE_TYPES WHERE queue_oid IN (SELECT oid FROM SYSTEM.AQ$_QUEUES WHERE name IN ('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E') );
DELETE FROM SYS.AQ$_MESSAGE_TYPES WHERE queue_oid IN (SELECT oid FROM SYSTEM.AQ$_QUEUES WHERE name IN ('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E') );
3. SELECT MIN(sequence), MAX(sequence) from SYS.AQ$_PROPAGATION_STATUS WHERE queue_id IN ('eventid', ....);
where the <eventid> values are those obtained from the SYSTEM Cleanup stage.
SELECT * from SYS.AQ$_PROPAGATION_STATUS WHERE queue_id IN (SELECT eventid FROM SYSTEM.AQ$_QUEUES WHERE name IN ('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E'));
SELECT MIN(sequence), MAX(sequence) from SYS.AQ$_PROPAGATION_STATUS WHERE queue_id IN (SELECT eventid FROM SYSTEM.AQ$_QUEUES WHERE name IN ('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E'));
4. DELETE FROM SYS.AQ$_PROPAGATION_STATUS WHERE queue_id IN ('<eventid>', ....);
where the <eventid> values are those obtained from the SYSTEM Cleanup stage.
DELETE FROM SYS.AQ$_PROPAGATION_STATUS WHERE queue_id IN (SELECT eventid FROM SYSTEM.AQ$_QUEUES WHERE name IN ('CAPTURE_QUEUE_ALL1','CAPTURE_QUEUE_ALL2','CAPTURE_QUEUE_ALL3','AQ$_CAPTURE_QUEUE_T_ALL1_E','AQ$_CAPTURE_QUEUE_T_ALL2_E','AQ$_CAPTURE_QUEUE_T_ALL3_E'));
5. DELETE FROM SYS.AQ$_PENDING_MESSAGES WHERE sequence BETWEEN (<MIN>,<MAX);
where <MIN>, <MAX> are the minimum and maximum sequence values found in step 3.
commit;
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_0_GA1');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_1_GY1');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_1_GY2');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_1_GY3');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_2_LPS1');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_2_LPS2');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_2_LPS3');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_4_TR1');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_4_TR2');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_4_TR3');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_8_QDN1');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_8_QDN2');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_8_QDN3');
EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('PROPAGATION_9_QN1');
exec DBMS_RULE_ADM.DROP_RULE_SET(rule_set_name =>'CAPTURE_QUEUE_ALL2_R' ,delete_rules =>true );
exec DBMS_RULE_ADM.DROP_RULE_SET(rule_set_name =>'CAPTURE_QUEUE_ALL2_N' ,delete_rules =>true );
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';
Event 10046 trace is disabled at session level using
ALTER SESSION SET EVENTS '10046 trace name context off';
ALTER SESSION SET EVENTS '10851 trace name context off';
ALTER SESSION SET EVENTS '25475 trace name context off';
进过以上处理后,expdp就不会出错了。