Index
For example: ORA-01659
#> oerr ora 1659
For example: IMP-00032
#> oerr imp 32
當匯入資料庫完畢後,出現這個錯誤。
IMP-00041: Warning: object created with compilation warnings
"CREATE FORCE VIEW "WIN_FDC_STDB"."PROCSPECIAL_700464"
....
或者檢查 OEM GUI > Schema > Views
有些項目的狀態會顯示 Invalid
Invalid Object (View, Package, Trigger,...)
這是一個發生在資料庫匯入後的常見錯誤,發生的問題可能有兩種
IMP-00041: Warning: object created with compilation warnings "CREATE FORCE VIEW 或者 IMP-00041: Warning: object created with compilation warnings "CREATE TRIGGER
Ans:必須重新編譯出現 Invalid 的物件
列出 Invalid 物件
COL owner FORMAT A20 COL object_type FORMAT A10 COL object_name FORMAT A30 SELECT owner, object_type, object_name, status FROM dba_objects WHERE status = 'INVALID' ORDER BY owner, object_type, object_name;
a.手動編譯單一個物件,例如 WIN_FDC_STDB.PROCSPECIAL_700464
SQL> alter view WIN_FDC_STDB.PROCSPECIAL_700464 compile; NOTE: alter <object-type> <object-name> compile;
編譯完後,如果沒有出現任何錯誤,檢查 OEM GUI 的狀態,應該要顯示 Valid。
b.編譯多個物件時
使用 utlrp.sql & utlprp.sql
SQL> @?/rdbms/admin/utlrp.sql
c.編譯指定 Schema 的所有物件
SQL> exec dbms_utility.compile_schema('SCOTT');
TIP:
重新編譯物件的方式,除了以上所列以外,還有更多其他的方式,請參閱 http://www.oracle-base.com/articles/...ma-objects.php
Table Name 如果包含有小寫,執行任何 SQL 時會出現這個錯誤。
Ans:所有 Table Name 應該都是要大寫,如果不小心出現小寫,可以用雙引號。
SQL> select count(*) from CATEGORYDEF_copy; select count(*) from CATEGORYDEF_copy * ERROR at line 1: ORA-00942: table or view does not exist SQL> select count(*) from "CATEGORYDEF_copy"; COUNT(*) ---------- 0
Ans:
SQL> exec dbms_stats.gather_schema_stats('schema-name', cascade=>TRUE);
Ans:調整變數的長度,例如
var tbs_source varchar2; 改成 var tbs_source varchar2(100);
當 Oracle Enterprise Manager(OEM) 安裝在 Windows 7 時,如果使用非 Administrator 帳戶開啟 OEM 後,在啟動資料庫連線時,OEM 視窗會強制跳離,並且若在 CMD 模式執行 sqlplus 會出現這個錯誤訊息。
解決方式:
建立 Tablespace,將 BLOCKSIZE=16M 時,出現這個錯誤。
Ans: 解決方法是修改系統參數 db_16k_cache_size,DB 不用重啟
SQL> alter system set db_16k_cache_size=16M scope=both;
Ans:
檢查是否使用 ASMM
SQL> show parameters statistics_level VALUE = TYPICAL SQL> show parameters sga_target VALUE > 0 SQL> show parameters shared_pool_siz VALUE = 0 SQL> show parameters db_cache_size VALUE = 0
調整 DB 系統參數
--Backup old spfile first show parameters spfile CREATE pfile='/path/to/pfile.tmp' FROM spfile='/path/to/spfile.ora' CREATE spfile='/path/to/spfile.ora.20140313' FROM pfile='/path/to/pfile.tmp' alter system set sga_max_size=4096M scope=spfile; alter system set sga_target=4096M scope=spfile; shutdown immediate; startup;
ORA-39082: Object type VIEW:"WINSTDB"."V_PROCDEF_FDS_700464" created with compilation warnings
Ans: 匯入資料庫時,如果 source-owner 與 target-owner 不一樣,就可能這個問題,即使匯入指令時使用了 remap,但遇到某些 VIEW 或其他物件,原有 source-owner 識別並不會正確的 remap,所以針對這些物件錯誤,必須手動新增它們,例如重新建立 VIEW 等等
Solution: 由於匯入 log 出現的都是 VIEW 物件的錯誤,所以從 GUI 檢視 VIEW,發現有許多個 VIEW 的狀態出現 invalid,再次檢視這些 VIEW 的內容,發現 OWNER 還是 source 端的,所以執行以下 SQL 修正這些錯誤的 VIEW:
修正 VIEW:
SQL> create or replace view WINSTDB.V_PROCDEF_FDS_700397 as SELECT "SYSID","VARIABLENAME","DEFTABLE","DEFFIELD","COLLAPSABLE" FROM ( SELECT 'MAT03__FDS' AS SYSID FROM DUAL ) IDT, ( SELECT * FROM WINSTDB.PROCDEF_FDS_700397 WHERE VARIABLENAME NOT IN ('Step', 'StepLabel', 'Message') ) VART; SQL> alter view WINSTDB.V_PROCDEF_FDS_700397 compile;
檢查是否有物件的 status 是呈現 INVALID:
SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS from all_objects where status='INVALID';
更多物件的編譯指令:
SQL> ALTER PACKAGE <SchemaName>.<PackageName> COMPILE; SQL> ALTER PACKAGE <SchemaName>.<PackageName> COMPILE BODY; SQL> ALTER PROCEDURE my_procedure COMPILE; SQL> ALTER FUNCTION my_function COMPILE; SQL> ALTER TRIGGER my_trigger COMPILE; SQL> ALTER VIEW my_view COMPILE;
Ans: 當執行到這個步驟時,整個系統出現 hang 問題
ORA-39083: Object type INDEX_STATISTICS failed to create with error
Solution:
方法一:impdp 加上 EXCLUDE=statistics
$ impdp system SCHEMAS=<source-owner> REMAP_SCHEMA=<source-owner>:<target-owner> table_exists_action=replace DIRECTORY=dmp_dir DUMPFILE=expdp_SOURCE_OWNER.dmp LOGFILE=impdp_TARGET_OWNER.log EXCLUDE=statistics $ sqlplus / as sysdba SQL> exec dbms_stats.gather_schema_stats('<target-owner>');
Ans: 在 OEM UI(Java)操作下無法刪除 datafile,但可以用指令方式來作
SQL> alter tablespace <tablespace-name> drop datafile '/opt/oracle/oradata/win/STDB03.dbf';
Ans: 解決步驟如下:
如果連 SQL/PLUS 都無法有效被執行時,如何能強制關閉資料庫
$sqlplus -prelim "/ as sysdba" SQL> shutdown abort
移除 User 所屬的物件
set heading off set pages 0 set feedback off set echo off spool ./drop_MYUSER.sql select 'drop table MYUSER.'||table_name||';' from dba_tables where owner='MYUSER'; spool off
移除 User
drop user USER CASCADE;
Ans: Add a option buffer=1000000 in the import command
#> imp system/oracle buffer=1000000 .....
If it's still not working, try to find out the proper value of the SQL_LENGTH with the following command:
In the source DB you need to run
SQL> select dbms_lob.getlength (dbms_metadata.get_ddl('TABLE','<table-name>','<owner-name>')) "SQL_LENGTH" from dual; SQL_LENGTH ---------- 71203
NOTE: the table name can be one of the tables failed on import.
Ans: Solution