需求:Oracle生產環境12.2.0.1,測試環境11.2.0.4,操作系統均為centos6.x
由于開發需要在測試環境搭測試庫,庫名和生產相同,但由于條件限制,只能在11.2.0.4上建庫。
考慮到數據量太大問題,需要庫表結構一致,對于數據:大部分表需有1000條記錄即可,個別表需要全量數據。
處理思路:
1.建測試庫,調整表空間等
2.expdp導數據,scp/sftp到測試機
3.測試機impdp導入對象和數據(先導全庫對象,然后再導全量表replace方式),編譯失效對象
操作步驟:
1.測試環境建庫,一條命令搞定
測試庫存放路徑空間檢查足夠,例如:/oracle/oradata
注意字符集–源端提前檢查,任選一種SQL查詢即可
select userenv('language') from dual;
select * from props$;
select * from database_properties;
例如
characterSet ZHS16GBK
nationalCharacterSet AL16UTF16
memory_target根據物理內存實際大小分配:比如32G,分配3G,可設置memoryPercentage 10即可,后期可調整
su - oracle
cd $ORACLE_HOME/assistants/dbca/templates
dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbname oradb -sid oradb -sysPassword xxxxxx -systemPassword xxxxxx -responseFile NO_VALUE -datafileDestination /oracle/oradata -redoLogFileSize 200 -recoveryAreaDestination NO_VALUE -storageType FS -characterSet ZHS16GBK -nationalCharacterSet AL16UTF16 -sampleSchema false -memoryPercentage 10 -databaseType OLTP -emConfiguration NONE
防止密碼過期鎖定:
alter profile default limit failed_login_attempts unlimited;
alter profile default limit password_life_time unlimited;
源端檢查表空間,根據表空間名稱和大小,在測試庫提前建好
set line 132
set wrap off
select t.*
from (SELECT D.TABLESPACE_NAME,
SPACE "SUM_SPACE(M)",
BLOCKS SUM_BLOCKS,
SPACE - NVL(FREE_SPACE, 0) "USED_SPACE(M)",
ROUND((1 - NVL(FREE_SPACE, 0) / SPACE) * 100, 2) "USED_RATE(%)",
FREE_SPACE "FREE_SPACE(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE,
SUM(BLOCKS) BLOCKS
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
UNION ALL --if have tempfile
SELECT D.TABLESPACE_NAME,
SPACE "SUM_SPACE(M)",
BLOCKS SUM_BLOCKS,
USED_SPACE "USED_SPACE(M)",
ROUND(NVL(USED_SPACE, 0) / SPACE * 100, 2) "USED_RATE(%)",
SPACE - USED_SPACE "FREE_SPACE(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE,
SUM(BLOCKS) BLOCKS
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE,
ROUND(SUM(BLOCKS * 8192) / (1024 * 1024), 2) USED_SPACE
FROM V$SORT_USAGE
GROUP BY TABLESPACE) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE(+)) t
order by "USED_RATE(%)" desc;
2.生產庫導出
測試和生產都可提前準備dmp目錄,例如
create directory dmp as '/oracle/dmp';
grant read,write on directory dmp to public;
生成需要導出的用戶腳本,方便expdp調用。
select LISTAGG(username,',') within group (order by username) from dba_users where account_status='OPEN' and username not in('SYSTEM','SYS','OGGADM','WKSYS','OLAPSYS','DBSNMP','MGMT_VIEW','SYSMAN');
例如:AAA,BBB,CCC
編輯t.par文件(無需轉義字符):注意并行度parallel的選擇,建議1/4的cpu數,確保cpu idle大于70%(sar 1 10可參考),對系統影響較小,排除多個內容,并列寫exclude即可,對于高版本到低版本需要注意加version=11.2,否則無法導入。
version=11.2
schemas=AAA,BBB,CCC
directory=dmp
dumpfile=oradb_%U.dmp
logfile=oradb_20220119.log
parallel=4
cluster=n
exclude=statistics
query="where rownum<=1000"
exclude=TABLE:"LIKE'%201%'"
exclude=TABLE:"in ('XXX_LOG','XXX_LOG_20090901','TMP0901_1','XXX_LOG161206','DE_WHOLE_ROUTE_LOG161010')"
導出直接調用(用sysdba好處是無需密碼,同時可導出public的同義詞,dblink等對象
第1次導出不超過1000條的符合要求的庫表對象:
expdp \'/ as sysdba\' parfile=t.par
如果不使用parfile,那么需要添加轉義字符\,例如:
exclude=TABLE:\"LIKE\'%201%\'\" exclude=TABLE:\"in \(\'XXX_LOG\',\'XXX_LOG_20090901\',\'TMP0901_1\',\'XXX_LOG161206\',\'DE_WHOLE_ROUTE_LOG161010\'\)\"
注意字母要大寫,同時不要加用戶名.形式,只需要大寫表名。對于windows不要用powershell窗口操作(命令會報錯),而應用cmd的dos窗口。
第2次導出指定全量數據的表:(換一種形式寫)
expdp \'/ as sysdba\' tables=AAA.T1,BBB.T2,CCC.T3 dumpfile=oradb_tab.dmp logfile=oradb_tab_20220119.log directory=dmp version=11.2 exclude=statistics
生成的dmp賦權,并壓縮,目的是減少網絡傳輸時間
chmod 777 /oracle/dmp/oradb*.dmp
tar zcvf oradb_20220119.tar.gz oradb*.dmp
傳輸到測試機:
scp oracle@生產庫IP:/oracle/dmp/oradb_20220119.tar.gz /oradata/dmp/
3.測試庫導入
解壓tar zxvf oradb_20220119.tar.gz
對于涉及dblink的庫,建議導入之前先排除掉(加快速度的關鍵),避免導入過程中如果有視圖,存儲過程,包體調用到的話,可能卡半天(每個編譯涉及link連接需要等待超時以后才會繼續導入)
導入的幾種方式參考:
第1次導入所有對象:
最簡單的:
impdp \'/ as sysdba\' directory=dmp full=y dumpfile=oradb_%U.dmp parallel=4 cluster=n logfile=zydb_20220118-ok.log exclude=db_link
其次是參考expdp導出時的參數:
impdp \'/ as sysdba\' directory=dmp schemas=AAA,BBB,CCC dumpfile=oradb_%U.dmp parallel=4 cluster=n logfile=oradb_20220118-1.log exclude=db_link
第2次導入指定全量表:注意 TABLE_EXISTS_ACTION=REPLACE或TRUNCATE使用,對于有外鍵情況可能需要考慮先禁用外鍵,根據實際情況處理。
impdp \'/ as sysdba\' directory=dmp full=y cluster=n dumpfile=oradb_tab.dmp parallel=1 logfile=oradb_tab_20220119-imp.log TABLE_EXISTS_ACTION=REPLACE
同樣也可以指定表寫法:
impdp \'/ as sysdba\' tables=AAA.T1,BBB.T2,CCC.T3 dumpfile=oradb_tab.dmp logfile=oradb_tab_20220119-imp.log directory=dmp TABLE_EXISTS_ACTION=REPLACE
最后可考慮是否導入dblink,注意parallel=1 content=metadata_only include=db_link參數
impdp \'/ as sysdba\' directory=dmp full=y cluster=n dumpfile=oradb_tab.dmp cluster=n logfile=oradb_20220118-1.log parallel=1 content=metadata_only include=db_link
排除系統默認用戶的命令參考:
expdp \'/ as sysdba\' directory=DPUMP_DIR1 dumpfile=full_meta.dmp LOGFILE=full_meta.log full=y content=metadata_only PARALLEL=1 CLUSTER=N EXCLUDE=TABLE,INDEX,SEQUENCE,STATISTICS EXCLUDE=SCHEMA:\"in \(\'SYS\',\'SYSTEM\',\'OWBSYS_AUDIT\',\'OWBSYS\',\'APEX_PUBLIC_USER\',\'APEX_030200\',\'FLOWS_FILES\',\'SPATIAL_CSW_ADMIN_USR\',\'SPATIAL_WFS_ADMIN_USR\',\'MDDATA\',\'OLAPSYS\',\'ORDDATA\',\'ORDPLUGINS\',\'SI_INFORMTN_SCHEMA\',\'MDSYS\',\'ORDSYS\',\'XDB\',\'ANONYMOUS\',\'CTXSYS\',\'EXFSYS\',\'WMSYS\',\'APPQOSSYS\',\'DBSNMP\',\'ORACLE_OCM\',\'DIP\',\'OUTLN\',\'SYSMAN\'\)\"
編譯失效對象
conn /as sysdba
@?/rdbms/admin/utlrp.sql
小結:
上述參數方法在日常遷移中比較常用,不限于此,如果熟悉了expdp/impdp的靈活用法,對于遷移庫來說便可事半功倍!
最后修改時間:2023-12-14 11:03:28
「喜歡這篇文章,您的關注和贊賞是給作者最好的鼓勵」
關注作者
【版權聲明】本文為墨天輪用戶原創內容,轉載時必須標注文章的來源(墨天輪),文章鏈接,文章作者等基本信息,否則作者和墨天輪有權追究責任。如果您發現墨天輪中有涉嫌抄襲或者侵權的內容,歡迎發送郵件至:contact@modb.pro進行舉報,并提供相關證據,一經查實,墨天輪將立刻刪除相關內容。




