Oracle 使用指令匯入 dmp 教學

在拿到一個 dmp 檔案後該怎麼匯入 Oracle 資料庫? 首先先把檔案放到 Oracle Database 所在的電腦中,如果是 linux ,通常會直接放在 /u01/app/oracle/admin/XE/dpdump/ 中

在 Docker 中的處理方式

如果 Oracle 資料庫位於 Docker 中,可以使用下面這行指令將 my_backup.dmp 複製進 oracle_11g 這個 docker 容器中:
    
docker cp my_backup.dmp oracle_11g:/u01/app/oracle/admin/XE/dpdump/
    

然後進入到容器中,此範例容器名稱為 oracle_11g
    
docker exec -it oracle_11g /bin/bash
    

還原 dmp

還原 dmp 的語法如下:
  • system/oracle@XE: 使用管理員權限登入,也可以切換為自己的使用者名稱/密碼(system/oracle)
  • file: dmp 檔案路徑
  • log: 匯入紀錄檔案
    
imp system/oracle@XE file=/u01/app/oracle/admin/XE/dpdump/my_backup.dmp log=/u01/app/oracle/admin/XE/dpdump/my_backup.log
    

運氣好的話就會直接匯入完成,但通常運氣不會這麼的好,下面就是常見的錯誤處理方式。

建立使用者

不想使用系統管理員匯入,又沒有使用者,建立一個新的使用者的方式如下:

在 Linux 中要先切換為 oracle 使用者:
    
su - oracle
    

使用 sqlplus 工具,以系統管理員登入:
    
sqlplus / as sysdba
    

建立使用者,此處範例使用者名稱: USER_001 密碼: Abcd1234
    
create user USER_001 identified by Abcd1234;
    

如果這時候直接匯入會出現缺少 CREATE SESSION 權限的錯誤:
    
IMP-00058: ORACLE error 1045 encountered
ORA-01045: user USER_001 lacks CREATE SESSION privilege; logon deniedUsername:
    

給予相對應的權限
    
GRANT CREATE SESSION TO USER_001;
    

不過其實這樣權限還是不夠,未來還會出現一個錯誤:
    
IMP-00007: must be a DBA to import objects to another user's account
IMP-00000: Import terminated unsuccessfully
    

上面的錯誤訊息顯示匯入需要 DBA 權限,解決方式就是給他權限,不過其實不用給到 DBA,只要有匯入的權限就可以了:
    
GRANT IMP_FULL_DATABASE TO USER_001;
    

就可以使用此使用者匯入了:
    
imp USER_001/Abcd1234@XE file=/u01/app/oracle/admin/XE/dpdump/my_backup.dmp log=/u01/app/oracle/admin/XE/dpdump/my_backup.log
    

使用者不同錯誤

如果當初匯出 dmp 的使用者和現在登入的使用者不同,就會彈出下面的錯誤,例如當初匯入的那個人叫做 USER_123 ,而我們叫做 USER_001,直接不給匯入
    
Warning: the objects were exported by USER_123, not by you

import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
export client uses ZHT16MSWIN950 character set (possible charset conversion)
. importing ITSMP's objects into USER_001
Import terminated successfully without warnings.
    

要解決也很簡單,使用 fromuser 參數告訴他說我知道是 USER_123 匯入的,但是我就是要匯入:
    
imp USER_001/Abcd1234@XE fromuser=USER_123 file=/u01/app/oracle/admin/XE/dpdump/my_backup.dmp log=/u01/app/oracle/admin/XE/dpdump/my_backup.log
    

沒有表空間權限

    
IMP-00003: ORACLE error 1950 encountered
ORA-01950: no privileges on tablespace 'SYSTEM'
Import terminated successfully with warnings.
    

筆者在匯入時遇到問題顯示沒有 SYSTEM 這個表空間權限,一般是不建議給予使用者 SYSTEM 表空間權限,不過如果真的要給予的話可以使用下面的指令給予不限制的表空間的特殊權限
    
GRANT UNLIMITED TABLESPACE TO USER_001;
    

表空間權限不足

在測試時發現下面的錯誤訊息:
    
ORA-00604: error occurred at recursive SQL level 1
ORA-01654: unable to extend index SYS.I_OBJ1 by 8 in tablespace SYSTEM
About to enable constraints...
Import terminated successfully with warnings.
    

很可能是因為表空間容量不足,查詢語法如下:
    
SELECT tablespace_name, SUM(bytes) / 1024 / 1024 AS size_mb, SUM(maxbytes) / 1024 / 1024 AS max_size_mb
FROM dba_data_files
GROUP BY tablespace_name;
    

查詢結果:
    
TABLESPACE_NAME                   SIZE_MB MAX_SIZE_MB
------------------------------ ---------- -----------
USER_001                              128           0
SYSAUX                                640  32767.9844
UNDOTBS1                               40  32767.9844
USERS                                 100       11264
SYSTEM                                600         600
    

的確,SYSTEM 表空間已經滿了,那該如何調整表空間大小呢?
    
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/XE/system.dbf' RESIZE 1G;
    

註: 再次說明非常不建議給予使用者或是將自訂資料寫入 SYSTEM 表空間

留言