1. 程式人生 > >Oracle利用impdp 匯入資料庫的歸納

Oracle利用impdp 匯入資料庫的歸納

我們知道,當我們要匯入一個數據庫的時候,說起來很簡單,但是其中會遇到各種問題,這個就佔個位置慢慢整理吧:

1, 利用impdp匯入資料庫分類

    a, 完整匯入:就是加入full=y這個關鍵詞,不能和schemas, tables,等關鍵詞重用

 impdp \"/ as sysdba\" full=y directory=expdump dumpfile=test1.dmp logfile=test1_impdp.log PARALLEL=100

    b, 根據使用者匯入:即選擇Schema來匯入,加入schemas=.... 或者 remap_schema=....  把dump檔案中的某個schema 改名

impdp \"/ as sysdba\" schemas=user1,user2 remap_schema=user1:user3,user2:user4 directory=EXPDUMP dumpfile=test.dump logfile=test_schemas_impdp.log  PARALLEL=20

    c, 改變表空間匯入:其實就是利用remap_tablespace來匯入原來資料庫使用的表空間,這樣可以不需要再取建立表空間

impdp \"/ as sysdba\" schemas=user1,user2 remap_tablespace=tp1:tp3, tp2:tp4 directory=EXPDUMP dumpfile=test.dump logfile=test_schemas_impdp.log  PARALLEL=20

2, 匯入impdp的整個過程

    a, 試圖獲得要匯入的資料庫資料的匯出日誌

    b, 瞭解原來資料庫的資訊,比如字符集、本地字符集、資料庫時區等等,判斷源資料庫和目標資料庫是否一致

    c, 獲得要匯入的schema,檢視當前資料庫是否已有改schema。如果有,則最好執行drop user cascade。如果沒有,則判斷是否需要更改密碼,若不需要,則無需手動建立改使用者

    d, 獲得要匯入的資料庫資料相關的表空間

    e, 瞭解要匯入的資料庫資料、使用者的許可權問題

    f,  然後就可以開始匯入了

3, 匯入過程中可能會遇到這些問題:

    a, 目錄沒有建立或者沒有許可權

ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-39087: directory name expdump is invalid


說明expdump 目錄可能沒有在資料庫上建立,執行下面語句就可以建立

create directory expdump as "/expdump"; 

也可能是用來匯入資料的使用者沒有許可權,執行下面語句就可以

grant read on directory expdump to imp_user

    b, 建立tablespace失敗,或者tablespace不存在

ORA-01119: error in creating database file '/dbdata/dbservice1/test01.dbf'
ORA-27040: file create error, unable to create file
Linux-x86_64 Error: 2: No such file or directory

在新的資料庫檔案路徑不一樣,所以建立不成功,方法就是先建立它

CREATETABLESPACE "test" DATAFILE '+FDA1/dbservice1/test01.dbf'   SIZE 16597383

CREATE BIGFILE TABLESPACE "test" DATAFILE '+FDA1/dbservice1/test01.dbf'   SIZE 16597383

    c, 客戶端字符集的問題

ORA-39126: Worker unexpected fatal error in KUPW$WORKER.PUT_DDLS [TABLE_STATISTICS]
ORA-06502: PL/SQL: numeric or value error
LPX-00231: invalid character 63 ('?') found in a Name or Nmtoken


導致這種問題主要是因為客戶端的字符集和資料庫的字符集不符,解決方法如下:

SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';
VALUE
----------------------------------------
WE8MSWIN1252

Linux-Host: EXPORT LANG=WE8MSWIN1252

    d, 資料庫本地字符集的問題

ORA-39083: Object type TABLE:"test"."TESTLOG" failed to create with error:
ORA-00910: specified length too long for its datatype

原因是某些本地字符集能支援的最大長度只有2000,即NVARCHAR2(2000), 而要建立的表超過2000,就報錯,改為UTF8,能支援最大4000。

但是改字符集是個很大的工程,涉及export full (backup), character scan, character convert, drop national character related data, alter database national character等等,下面是簡單的方法,但internal_use 一般來說,Oracle不推薦用

SHUTDOWN IMMEDIATE;
STARTUP MOUNT; 
ALTER SYSTEM ENABLE RESTRICTED SESSION; 
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 
ALTER SYSTEM SET AQ_TM_PROCESSES=0; 
ALTER DATABASE OPEN; 
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;
SHUTDOWN IMMEDIATE;

    e, 作業系統執行緒、檔案問題

ORA-39095: Dump file space has been exhausted: Unable to allocate 8192 bytes


第一種可能是:dump的檔案不夠大,空間不足,作業系統能支援的檔案大小不夠等,只要增加dump檔案就可以

39095, 00000, "Dump file space has been exhausted: Unable to allocate %s bytes"
// *Cause:  The Export job ran out of dump file space before the job was
//          completed.
// *Action: Reattach to the job and add additional dump files to the job
//          restarting the job.


第二種可能是:因為執行緒太多,比如 parallel=100, 執行緒在寫入檔案的時候衝突導致寫入失敗,datadump認為dump檔案不足,但奇怪的是,刪除檔案再執行同樣的命令還會報錯,報錯的時間以及生成的檔案大小都不一樣。把parallel相應減小,比如 parallel=6, 就不再報錯


     f, 系統物件失效

OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPE         OWNER
------------------- ------------------------------
_ALL_REPCONFLICT
VIEW                SYS

_ALL_REPPARAMETER_COLUMN
VIEW                SYS

_ALL_REPRESOLUTION
VIEW                SYS

_ALL_REPCOLUMN_GROUP
VIEW                SYS


利用sysdba執行命令@?/rdbms/admin/utlrp.sql 基本就可以解決