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 基本就可以解決