Oracle 11G 數據庫遷移【expdp/impdp】


轉自:http://www.th7.cn/db/Oracle/201802/263773.shtml

0x01 環境 

A 機器,操作系統 CentOS7.3,Oracle版本:11G,IP地址:192.168.1.11B 機器,操作系統 CentOS7.3,Oracle版本:11G,IP地址:192.168.1.12

 

將數據庫從A機器遷移到B機器A機器 Oracle 監聽SID:orcl, 帳號:CINRAD,密碼:*, 表空間名稱:CINRAD_DATA, 表空間文件大小:共10個文件,每個文件初始大小10G,可自動增長,增長幅度100M,最大大小為30G,表空間中的數據約為120G左右

 

B機器 Oracle 監聽SID:orcl


0x02 遷移 
1. 使用dba登錄A機器的Oracle數據庫 
sqlplus / as sysdba2. 創建數據庫導出目錄 

目錄可自定義。若系統中無該目錄,則手動創建,並賦予777權限


SQL > create directory dumpdir as '/data/oracle/dump';3. 賦予Oracle用戶對於導出目錄的讀寫權限 
SQL > grant write,read on directory dumpdir to CINRAD;4. 使用expdp導出數據 

進入Linux命令行,登錄Oracle帳號,使用導出工具expdp對CINRAD用戶下的所有數據導出【可使用並行參數paraller進行多文件同時導出】單文件導出:


expdp CINRAD/cinrad@orcl directory=dumpdir dumpfile=cinrad.dump

多文件並行導出:


expdp CINRAD/cinrad@orcl directory=dumpdir dumpfile=cinrad_20180204_%U.dump filesize=500M paraller=5
// filesize=500M單文件最大500M
// paraller = 5 並行數為5

這里,我導出的是單文件,下面,以單文件導出為例,繼續進行。


5. 傳輸導出文件 

將A機器導到的dump文件傳輸到B機器/data/oracle/dump目錄下


scp /data/oracle/dump/cinrad.dump root@192.168.1.12:/data/oracle/dump/cinrad.dump
scp /data/oracle/dump/export.log root@192.168.1.12:/data/oracle/dump/export.log

也可以將兩個導出文件壓縮后一起傳輸


6. 使用dba登錄B機器的Oracle數據庫 
sqlplus / as sysdba 7. 創建與A機器相同的數據表空間 
create tablespace CINRAD_DATA datafile '/share/database/oracle/cinrad01.dbf' size 10G autoextend on next 100Mmaxsize 30G;
alter tablespace CINRAD_DATA add datafile '/share/database/oracle/cinrad02.dbf' size 10G autoextend on next 100M maxsize 30G;
alter tablespace CINRAD_DATA add datafile '/share/database/oracle/cinrad03.dbf' size 10G autoextend on next 100M maxsize 30G;
alter tablespace CINRAD_DATA add datafile '/share/database/oracle/cinrad04.dbf' size 10G autoextend on next 100M maxsize 30G;
alter tablespace CINRAD_DATA add datafile '/share/database/oracle/cinrad05.dbf' size 10G autoextend on next 100M maxsize 30G;
alter tablespace CINRAD_DATA add datafile '/share/database/oracle/cinrad06.dbf' size 10G autoextend on next 100M maxsize 30G;
alter tablespace CINRAD_DATA add datafile '/share/database/oracle/cinrad07.dbf' size 10G autoextend on next 100M maxsize 30G;
alter tablespace CINRAD_DATA add datafile '/share/database/oracle/cinrad08.dbf' size 10G autoextend on next 100M maxsize 30G;
alter tablespace CINRAD_DATA add datafile '/share/database/oracle/cinrad09.dbf' size 10G autoextend on next 100M maxsize 30G;
alter tablespace CINRAD_DATA add datafile '/share/database/oracle/cinrad10.dbf' size 10G autoextend on next 100M maxsize 30G;

創建數據表空間,並向該表空間中添加數據文件


8. 創建用戶,並指定默認表空間 

創建與A機器相同的用戶,表將表空間CINRAD_DATA指定給該用戶


SQL > CREATE USER CINRAD IDENTIFIED BY cinrad DEFAULT TABLESPACE CINRAD_DATA
// IDENTIFIED BY cinrad 此cinrad 為密碼,可更換
// DEFAULT TABLESPACE CINRAD_DATACINRAD_DATA 為指定的默認表空間9. 授權 

B機器的相應的Oracle用戶創建完畢之后,需要給該用戶相應的數據庫操作權限,與A相同或者直接賦予所有權限


SQL > grant all privileges to CINRAD
// CINRAD 為用戶名10. 創建導入目錄 

在B機器上創建導入目錄 ,並授予該目錄777 權限 ,在Oracle中創建該目錄


SQL > create directory dumpdir as '/data/oracle/dump';11. 授予Oracle用戶導入目錄讀寫權限 
SQL > grant write,read on directory dumpdir to CINRAD;12. 使用impdp導入數據 

進入Linux命令行,登錄Oracle帳號,使用導出工具impdp對數據進行導入


impdp system/oracle@orcl directory=dumpdir dumpfile=cinrad.dump parallel=10

此次導出從晚上22點開始,次日01:13:58結束,耗時過長,需要優化。 主要針對索引導入的效率, 導入日志見附件。導入選項:

table_exists_action : skip 是如果已存在表,則跳過並處理下一個對象;append是為表增加數據;truncate是截斷表,然后為其增加新數據;replace是刪除已存在表,重新建表並追加數據 13. 檢查遷移數據 
0x03 錯誤 

若沒有遇到報錯,則可忽略,進行0x04的優化


1. 使用expdp/impdp工具時報錯 
1. Oracle軟件與數據庫不匹配錯誤: 

問題描述:


ORA-31626: job does not exist 
ORA-31637: cannot create job SYS_EXPORT_SCHEMA_01 for user SYSTEM 
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95 
ORA-00942:table or view does not exist

解決方案:

使用DBA用戶登錄Oracle數據庫 
執行以下代碼SQL>@?/rdbms/admin/catalog.sql
SQL>@?/rdbms/admin/catproc.sql 
[后續此庫出現問題:EXP-00056: ORACLE error 932 encountered] , 可繼續執行SQL> @?/rdbms/admin/catmetx.sql 
SQL> @?/rdbms/admin/utlrp.sql2. 重啟Oracle數據庫報錯 
1. 數據庫無法正常關閉,並鎖定內存問題 

問題描述:在數據庫中執行shutdown immediate關閉數據庫,報錯:


ORA-27102: out of memory
Linux Error: 12: Cannot allocate memory

查看Linux中虛擬內存/dev/shm的占用情況 [命令:df -hT],發現占用在90%以上,內存已經被鎖定無法釋放

 

解決方案:

在Linux中執行 ps -ef | grep oracle ,查看oracle進行的pid 
使用 kill -9 {pid} 的方式將Oracle進程殺死 
使用DBA登錄Oracle 
startup 啟動數據庫 3. 數據導入過程中報錯 
1. DB_LINK創建失敗,權限不足 

問題描述: 導入過程中,導入DB_LINK時提示,權限不足解決方案: 賦予該用戶DBA的權限或所有權限即可


2. DB_LINKE 創建失敗,缺失關鍵字 

問題描述:


失敗的 sql 為:
CREATE DATABASE LINK "ASOM"CONNECT TO "ASOM" IDENTIFIED BY VALUES '05535CD93437C21A745CE9EB530617B269'AUTHENTICATED BY "ASOM" IDENTIFIED BY VALUES '0506C0E222927A938BF9F44DCB31C2038D'USING '10.36.6.55:1521/orcl'
ORA-00905: 缺失關鍵字

解決方案:待解決,暫時導入完成后手動創建。


3. 用戶不存在 

問題描述:


處理對象類型 SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
ORA-39083: 對象類型 OBJECT_GRANT 創建失敗, 出現錯誤:
ORA-01917: 用戶或角色 'CINRAD_META' 不存在
失敗的 sql 為:
GRANT SELECT ON "CINRAD"."STA_RADAR" TO "CINRAD_META"
ORA-39083: 對象類型 OBJECT_GRANT 創建失敗, 出現錯誤:
ORA-01917: 用戶或角色 'CINRAD_META' 不存在
失敗的 sql 為:
GRANT SELECT ON "CINRAD"."TEST_STA_RADAR" TO "CINRAD_META"

解決方案: 若該用戶下的數據里有你想要導入的數據,則創建該用戶重新導入,若沒有你想導入的數據,則忽略即可。


4. 視圖存在編譯警告 

問題描述:


ORA-39082: 對象類型 VIEW:"CINRAD"."V_AWS_OBSERVE_DATA" 已創建, 但帶有編譯警告
ORA-39082: 對象類型 VIEW:"CINRAD"."V_SONDE_OBSERVE_DATA" 已創建, 但帶有編譯警告
ORA-39082: 對象類型 VIEW:"CINRAD"."V_FLASHLIGHT_OBSERV_DATA_HIS" 已創建, 但帶有編譯警告
ORA-39082: 對象類型 VIEW:"CINRAD"."V_STA_AWS_REG" 已創建, 但帶有編譯警告
ORA-39082: 對象類型 VIEW:"CINRAD"."V_AWS_OBSERVE_REG" 已創建, 但帶有編譯警告
ORA-39082: 對象類型 VIEW:"CINRAD"."V_EVA_THUNDER_EFF" 已創建, 但帶有編譯警告
ORA-39082: 對象類型 VIEW:"CINRAD"."V_EVA_THUNDER_OUTSIDE" 已創建, 但帶有編譯警告
ORA-39082: 對象類型 VIEW:"CINRAD"."V_EVA_THUNDER_UTILIZATION" 已創建, 但帶有編譯警告
ORA-39082: 對象類型 VIEW:"CINRAD"."V_EVA_THUNDER_PARTAKE" 已創建, 但帶有編譯警告
ORA-39082: 對象類型 VIEW:"CINRAD"."V_EVA_THUNDER_LOCATEMODE" 已創建, 但帶有編譯警告
ORA-39082: 對象類型 PACKAGE_BODY:"CINRAD"."GP_DISPATCHER" 已創建, 但帶有編譯警告

解決方案:使用PLSQL連接數據庫,右擊該視圖,編輯,回車,即可解決。


0x04 優化 
1. Oracle內存優化 

假設服務器內存32G


1. 查看用於Oracle的虛擬內存[/dev/shm]大小, 執行命令 df -hT 

tmpfs tmpfs 16G 2.1G 14G 14% /dev/shm此內存一般為服務器物理內存的50%到80%, 若讀寫均占差不多的比重,則為50%【16G】左右,若寫的比重更大,則適當增加虛擬內存的大小


2. 使用DBA登錄數據庫,查看Oracle內設置的內存大小情況 
SQL >show parameter mem;

查看memory_max_target 與 memory_target 的值, 該值必須小於等於服務器設置的虛擬內存【16G】的大小,並且大於SGA+PGA的內存大小。若memory_max_target 與 memory_targety 設置過小,則需要調整。


3. 修改Oracle的內存大小【memory_max_target與memory_targety 】以DBA登錄Oracle數據庫 
執行語句 :SQL> shutdown immediate 關閉數據庫 
執行語句 :SQL> create pfile from spfile; 
編輯pfile文件: Linux 下執行 , vim $ORACLE_HOME/dbs/initorcl.ora調整memory_max_target memory_target, 兩個值都相同調整 .sga_target 的值調整 .pga_aggregate_target 的值調整原則:/dev/shm虛擬內存 >=【memory_max_target/memory_target】>= sga_target + pga_aggregate_target

若沒有按照該原則調整,則會報以下錯誤 :


ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 4016M ORA-00845: MEMORY_TARGET not supported on this system 
執行語句:SQL> startup ,啟動數據庫 2. 關閉歸檔模式查看歸檔模式是否開啟,執行語句 : SQL> select name, log_mode from v$database; 若返回為NOARCHIVELOG, 則歸檔模式已關閉。 
若歸檔模式開啟,則執行語句:alter database noarchivelog; 若不生效,可重啟數據庫查看效果 3. 更改最大連接數 

將最大連接數調整為2000

查看processes和sessions參數SQL> show parameter processesSQL> show parameter sessions 
修改processesSQL> alter system set processes=2000 scope=spfile; 
修改sessionsSQL> alter system set sessions=2000 scope=spfile; 4. 關閉監聽日志 

修改文件 $ORACLE_HOME/network/admin/listener.ora在文件頂部添加: LOGGING_LISTENER = OFF保存退出

 

重啟lsnrctl: 執行命令


lsnrctl stop 
lsnrctl start


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM