经过上面的诸多处理后,还剩下ORA错误21个,IMP错误15个。错误越剩越少,解决起来也越来越困难。
观察错误日志,发现OE用户下有一个视图创建出现了告警,本以为会和OLAPSYS或WKSYS用户的错误相同,结果检查发现,既不是权限的问题,也不是视图中用到的函数还没有导入的问题。
排除了其他问题后,基本上确定了问题和UNDER VIEW有关。可能是IMP工具在处理UNDER VIEW时有些问题。看来要想解决这个问题,最好的办法时删除用户时保留OE用户,这样避免IMP工具导入OC_CORPORATE_CUSTOMERS视图。
但是,保留了OE用户,会导致主键冲突的问题。于是,修改删除用户脚本的同时在删除用户数据的脚本中加入了OE用户,但是导入的时候仍然存在问题,由于OE用户的表存在着主外键关系,而且在导入的时候,这个约束已经在起作用了,所以导入很多的数据无法插入。
于是,只好通过删除OE用户下表的方法来避免这个问题。解决完表的问题又出现了新的问题,由于OE用户下的对象没有删除,在导入的时候,Oracle检查到了对象具有不同的OID。于是采用前面处理ORDSYS等用户对象错误的方法,为OE的CATEGORY_TYP已源数据库的OID重建,并编译失效的对象。
进行完这些处理后,重新导入,这时候OE用户的导入告警也消失了,整个IMP操作还剩下ORA错误21个,IMP错误14个。
检查这35个错误可以发现,这35个错误是7个队列表在进行导入的后期处理时产生的。
通过查询METALINK发现,这些错误属于Oracle的bug。Oracle9208以下版本都会受到影响。如果想要解决这个问题,需要把Oracle版本升级到9208,单独的补丁居然只有AIX平台下有,且要求Oracle rdbms版本必须是9207。
既然是Oracle的bug,这里就不费劲去解决了。
下面简单总结一下:全库导入操作带来的问题很多,其中有些错误必须要给予足够的重视,比较SYS对象的权限问题,以及XMLTYPE无法显示的问题,这些问题不解决,可能导致导入的失败,或者导入后数据库权限与导出数据库不一致。
对于其他部分错误,其实大部分可以简单忽略掉,或者仅对需要用到的用户额外关注一下,不过为了完整起见,这里还是将这几篇文章中,全库导入前的所有操作根据执行顺序完整的列出来,并对其中部分内容进行了简化:
SQL> DECLARE 2 TYPE T_VARCHAR_TAB IS TABLE OF VARCHAR2(32767) INDEX BY BINARY_INTEGER; 3 V_PRIVS_STR T_VARCHAR_TAB; 4 V_ROLE_STR T_VARCHAR_TAB; 5 V_DROP_STR VARCHAR2(32767); 6 V_CREATE_STR VARCHAR2(32767); 7 BEGIN 8 FOR I IN (SELECT USERNAME FROM DBA_USERS 9 WHERE USERNAME NOT IN ('SYS', 'SYSTEM', 'DBSNMP', 'WMSYS', 'ORDSYS', 'OE')) LOOP 10 11 SELECT DBMS_METADATA.GET_DDL('USER', I.USERNAME) INTO V_CREATE_STR FROM DUAL; 12 13 SELECT 'GRANT ' || PRIVILEGE || ' ON ' || OWNER || '.' || TABLE_NAME || ' TO ' || GRANTEE 14 BULK COLLECT INTO V_PRIVS_STR 15 FROM DBA_TAB_PRIVS WHERE GRANTEE = I.USERNAME; 16 17 SELECT 'GRANT ' || GRANTED_ROLE || ' TO ' || GRANTEE 18 BULK COLLECT INTO V_ROLE_STR 19 FROM DBA_ROLE_PRIVS WHERE GRANTEE = I.USERNAME; 20 21 SELECT 'DROP USER ' || I.USERNAME || ' CASCADE' INTO V_DROP_STR FROM DUAL; 22 23 EXECUTE IMMEDIATE V_DROP_STR; 24 EXECUTE IMMEDIATE V_CREATE_STR; 25 FOR I IN 1..V_PRIVS_STR.COUNT LOOP 26 BEGIN 27 EXECUTE IMMEDIATE V_PRIVS_STR(I); 28 EXCEPTION 29 WHEN OTHERS THEN 30 NULL; 31 END; 32 END LOOP; 33 FOR I IN 1..V_ROLE_STR.COUNT LOOP 34 EXECUTE IMMEDIATE V_ROLE_STR(I); 35 END LOOP; 36 END LOOP; 37 END; 38 /
PL/SQL 过程已成功完成。
SQL> DROP PUBLIC SYNONYM GENREMOTETASKINTERRUPTEDEXCEPT;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENREMOTEOBJECTCLOSEDEXCEPTION;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENCONNECTIONPARAMETERINFOSEQU;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENREMOTEAUTHENTICATIONEXCEPTI;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENREMOTEAPIVERSIONMISMATCHEXC;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENMETADATAPROPERTYVALUESUNION;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENMETADATAPROPERTYBAGSEQUENCE;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENCONNECTIONPARAMETERINFOSTRU;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENCONNECTIONPARAMETERTYPEENUM;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENREMOTESPECIFICATIONUPDATENE;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENCOMPOUNDCURSORBLOCKSEQUENCE;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENPARENTSTARTENDBLOCKSEQUENCE;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENINVALIDINDEXSPECIFICATIONEX;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENINCLUDEDDEPENDENCYBLOCKSTRU;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENDEPENDENCYBLOCKSEQUENCESEQU;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENCURSORSPECIFIERSEQUENCESEQU;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENRECURSIVEJOINDEFINITIONSTRU;
同义词已删除。
SQL> DROP PUBLIC SYNONYM GENCONSTANTLISTDEFINITIONSTRUC;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLREMOTETASKINTERRUPTEDEXCEPT;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLMETADATAPROPERTYVALUESUNION;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLMETADATAPROPERTYBAGSEQUENCE;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLREMOTEAUTHENTICATIONEXCEPTI;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLREMOTEAPIVERSIONMISMATCHEXC;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLCONNECTIONPARAMETERINFOSEQU;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLCONNECTIONPARAMETERTYPEENUM;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLCONNECTIONPARAMETERINFOSTRU;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLPARENTSTARTENDBLOCKSEQUENCE;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLINCLUDEDDEPENDENCYBLOCKSTRU;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLREMOTESPECIFICATIONUPDATENE;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLINVALIDINDEXSPECIFICATIONEX;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLDEPENDENCYBLOCKSEQUENCESEQU;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLCOMPOUNDCURSORBLOCKSEQUENCE;
同义词已删除。
SQL> DROP PUBLIC SYNONYM SQLCONSTANTLISTDEFINITIONSTRUC;
同义词已删除。
SQL> SET SERVEROUT ON SQL> DECLARE 2 V_CNT NUMBER := 0; 3 V_DEL NUMBER := 0; 4 V_LOOP NUMBER := 0; 5 V_RESULT NUMBER := 0; 6 BEGIN 7 <<LABLE_FOR_LOOP>> 8 FOR I IN (SELECT OWNER || '.' || TABLE_NAME TABLE_NAME FROM DBA_TABLES 9 WHERE OWNER IN ('SYSTEM', 'WMSYS', 'ORDSYS', 'OE')) LOOP 10 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || I.TABLE_NAME INTO V_RESULT; 11 IF V_RESULT != 0 THEN 12 BEGIN 13 V_CNT := V_CNT + 1; 14 EXECUTE IMMEDIATE 'DELETE ' || I.TABLE_NAME; 15 V_DEL := V_DEL + 1; 16 EXCEPTION 17 WHEN OTHERS THEN 18 NULL; 19 END; 20 END IF; 21 END LOOP; 22 V_LOOP := V_LOOP + 1; 23 DBMS_OUTPUT.PUT_LINE(V_LOOP || ':' || ' COUNT ' || V_CNT || ', DEL ' || V_DEL); 24 IF V_CNT != V_DEL THEN 25 V_CNT := 0; 26 V_DEL := 0; 27 GOTO LABLE_FOR_LOOP; 28 END IF; 29 END; 30 / 1: COUNT 25, DEL 22 2: COUNT 3, DEL 3
PL/SQL 过程已成功完成。
SQL> COMMIT;
提交完成。
SQL> BEGIN 2 FOR I IN (SELECT 'ALTER TABLE ' || OWNER || '.' || TABLE_NAME || ' DROP CONSTRAINT ' || CONSTR AINT_NAME DROP_CONS 3 FROM DBA_CONSTRAINTS 4 WHERE OWNER = 'SYSTEM' 5 AND CONSTRAINT_NAME NOT LIKE 'SYS%' 6 AND CONSTRAINT_TYPE = 'C') 7 LOOP 8 9 EXECUTE IMMEDIATE I.DROP_CONS; 10 END LOOP; 11 END; 12 /
PL/SQL 过程已成功完成。
SQL> CREATE OR REPLACE TYPE MDSYS.SDO_ORDINATE_ARRAY OID '3796C48378FC407AE03400400B407D5F' 2 AS VARRAY(1048576) OF NUMBER; 3 /
类型已创建。
SQL> CREATE OR REPLACE TYPE MDSYS.SDO_ELEM_INFO_ARRAY OID '3796C48378FD407AE03400400B407D5F' 2 AS VARRAY (1048576) of NUMBER; 3 /
类型已创建。
SQL> CREATE OR REPLACE TYPE MDSYS.SDO_POINT_TYPE AS OBJECT (X NUMBER, Y NUMBER, Z NUMBER); 2 /
类型已创建。
SQL> CREATE OR REPLACE TYPE MDSYS.SDO_GEOMETRY OID '3796C48378FE407AE03400400B407D5F' AS OBJECT ( 2 SDO_GTYPE NUMBER, 3 SDO_SRID NUMBER, 4 SDO_POINT SDO_POINT_TYPE, 5 SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY, 6 SDO_ORDINATES SDO_ORDINATE_ARRAY, 7 MEMBER FUNCTION GET_GTYPE 8 RETURN NUMBER DETERMINISTIC, 9 MEMBER FUNCTION GET_DIMS 10 RETURN NUMBER DETERMINISTIC, 11 MEMBER FUNCTION GET_LRS_DIM 12 RETURN NUMBER DETERMINISTIC); 13 /
类型已创建。
SQL> GRANT EXECUTE ON MDSYS.SDO_ORDINATE_ARRAY TO PUBLIC WITH GRANT OPTION;
授权成功。
SQL> GRANT EXECUTE ON MDSYS.SDO_ELEM_INFO_ARRAY TO PUBLIC WITH GRANT OPTION;
授权成功。
SQL> GRANT EXECUTE ON MDSYS.SDO_POINT_TYPE TO PUBLIC WITH GRANT OPTION;
授权成功。
SQL> GRANT EXECUTE ON MDSYS.SDO_GEOMETRY TO PUBLIC WITH GRANT OPTION;
授权成功。
SQL> CREATE OR REPLACE FUNCTION WKSYS.WK$USER 2 RETURN VARCHAR2 3 AS 4 BEGIN 5 return nvl(sys_context('WK$CONTEXT', 'USER'), 6 sys_context('USERENV', 'SESSION_USER')); 7 END; 8 /
函数已创建。
SQL> CREATE OR REPLACE FUNCTION WKSYS.WK$USERID 2 RETURN NUMBER 3 AS 4 FUNCTION GET_DATABASE_USERID RETURN VARCHAR2 AS 5 ID NUMBER; 6 BEGIN 7 SELECT USER# INTO ID FROM SYS.USER$ 8 WHERE NAME = SYS_CONTEXT('USERENV','SESSION_USER'); 9 RETURN ID; 10 END; 11 BEGIN 12 RETURN NVL(TO_NUMBER(SYS_CONTEXT('WK$CONTEXT','USERID')), 13 GET_DATABASE_USERID); 14 END; 15 /
函数已创建。
SQL> CREATE TABLE WKSYS.WK$SYS_PRIV ( 2 SP_USERID NUMBER, 3 SP_USER VARCHAR2(100), 4 SP_OPTIONS VARCHAR2(10), 5 PRIMARY KEY (SP_USERID, SP_USER) USING INDEX TABLESPACE DRSYS 6 ) TABLESPACE DRSYS;
表已创建。
SQL> CREATE OR REPLACE FUNCTION WKSYS.WK$IS_ADMIN( 2 WITH_OPTION IN VARCHAR2 DEFAULT NULL 3 ) 4 RETURN NUMBER 5 AS 6 CUSER VARCHAR2(200) := WK$USER; 7 CUID NUMBER := WK$USERID; 8 BEGIN 9 IF (CUID >= 0 AND CUSER IN ('WKSYS', 'SYS')) THEN 10 IF (WITH_OPTION IS NULL OR INSTR('G', WITH_OPTION) > 0) THEN 11 RETURN 1; 12 END IF; 13 ELSIF (CUID = -2 AND CUSER IN ('IAS_ADMIN')) THEN 14 IF (WITH_OPTION IS NULL OR INSTR('G', WITH_OPTION) > 0) THEN 15 RETURN 1; 16 END IF; 17 ELSE 18 FOR C IN (SELECT SP_USERID FROM WK$SYS_PRIV 19 WHERE SP_USER = CUSER AND SP_USERID = CUID AND 20 (WITH_OPTION IS NULL OR 21 INSTR(SP_OPTIONS, WITH_OPTION) > 0)) 22 LOOP 23 RETURN 1; 24 END LOOP; 25 END IF; 26 RETURN 0; 27 END; 28 /
函数已创建。
SQL> DECLARE 2 V_COUNT NUMBER; 3 V_RESULT NUMBER; 4 BEGIN 5 <<LABLE_FOR_LOOP>> 6 SELECT COUNT(*) INTO V_COUNT FROM DBA_OBJECTS WHERE OWNER = 'OE' AND OBJECT_TYPE = 'TABLE'; 7 V_RESULT := V_COUNT; 8 FOR I IN (SELECT 'DROP TABLE OE.' || OBJECT_NAME DROP_STR FROM DBA_OBJECTS 9 WHERE OWNER = 'OE' AND OBJECT_TYPE = 'TABLE') LOOP 10 BEGIN 11 EXECUTE IMMEDIATE I.DROP_STR; 12 V_COUNT := V_COUNT - 1; 13 EXCEPTION 14 WHEN OTHERS THEN 15 NULL; 16 END; 17 END LOOP; 18 DBMS_OUTPUT.PUT_LINE('REMAIN :' || V_RESULT); 19 IF V_COUNT != V_RESULT THEN 20 GOTO LABLE_FOR_LOOP; 21 END IF; 22 END; 23 / REMAIN :10 REMAIN :2 REMAIN :1 REMAIN :0
PL/SQL 过程已成功完成。
SQL> DROP TYPE OE.CATEGORY_TYP FORCE;
类型已删除。
SQL> CREATE OR REPLACE TYPE OE.CATEGORY_TYP OID '82A4AF6A4CDC656DE034080020E0EE3D' 2 AS OBJECT 3 ( CATEGORY_NAME VARCHAR2(50) 4 , CATEGORY_DESCRIPTION VARCHAR2(1000) 5 , CATEGORY_ID NUMBER(2) 6 , NOT INSTANTIABLE 7 MEMBER FUNCTION CATEGORY_DESCRIBE RETURN VARCHAR2 8 ) 9 NOT INSTANTIABLE NOT FINAL 10 ALTER TYPE OE.CATEGORY_TYP 11 ADD ATTRIBUTE (PARENT_CATEGORY_ID NUMBER(2)) CASCADE; 12 /
类型已创建。
SQL> ALTER TYPE OE.SUBCATEGORY_REF_LIST_TYP COMPILE;
类型已变更。
SQL> ALTER TYPE OE.LEAF_CATEGORY_TYP COMPILE;
类型已变更。
SQL> ALTER TYPE OE.COMPOSITE_CATEGORY_TYP COMPILE;
类型已变更。
SQL> ALTER TYPE OE.CATALOG_TYP COMPILE;
类型已变更。
SQL> ALTER SESSION SET CURRENT_SCHEMA=OLAPSYS;
会话已更改。
SQL> @?/cwmlite/admin/oneputlp.pls
程序包已创建。
SQL> @?/cwmlite/admin/cwm2asec.pls
程序包已创建。
没有错误。SQL> ALTER SESSION SET CURRENT_SCHEMA=SYS;
会话已更改。
$ imp "sys as sysdba" file=testmv_full.dmp full=y buffer=20480000 ignore=y log=testmv_full.log toid_novalidate=(sys.aq$_jms_userproparray, sys.aq$_jms_text_message, system.repcat$_object_null_vector, ordsys.orddoc, ordsys.ordaudio, ordsys.ordvideo, ordsys.ordp_w_picpathsignature, ordsys.ordp_w_picpath)
执行完导入任务后,检查日志信息,错误信息仅包括由于Oracle自身bug造成的35个警告,比原来总共的3400多个错误缩小了近100倍。
最后声明一下,所有操作均针对Oracle920数据库,如果数据库为其他版本,不要效仿这些操作,不过解决问题的思路是一致的。