轉自: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
