imp/exp資料遷移

leon830216發表於2014-02-23
- 注意點
--------------------------------------------------------------------
- nls_lang的設定
imp之前,最好show y一下dmp檔案中字符集和目標庫是否一致

-- 匯出資料庫和匯出端客戶端保持一致
資料庫:select * from nls_database_parameters;
客戶端:env|grep NLS_LANG

-- 匯入時
目標庫與源庫有相同字符集,則NLS_LANG與其設定相同即可
目標庫與源庫有不同字符集,則NLS_LANG與匯出端NLS_LANG設定相同即可
此時,要求匯入端是匯出端的嚴格超集,否則會有亂碼

- 版本問題
-- 總是使用IMP的版本匹配資料庫的版本,如:要匯入到817中,使用817的IMP工具。
-- 總是使用EXP的版本匹配兩個資料庫中最低的版本,如:從9201往817中匯入,則使用817版本的EXP工具

- 檢視幫助
exp/imp help=y

- 全庫遷移的例子
--------------------------------------------------------------------
-- 首先要把目標的庫建好,同名、同樣大的表空間建好

-- 用dbartisan等軟體把源庫的使用者的建立語句抓出來,存成一個指令碼,去掉object級的grant語句,在目標庫把這個指令碼執行一下,即把這些使用者建上。
需要說明的是,你只需關注的是你的應用用的使用者,像sys,system,dbsnmp,traceserver等等這些系統使用者都不在你的關心範圍內

-- 執行exp操作
--- 把結構匯出來
exp system/oracle@source_db file=... log=... buffer=... owner=go,... rows=N COMPRESS=N

--- 把資料匯出來
exp system/oracle@source_db file=... log=... buffer=... owner=go,... rows=Y  COMPRESS=N GRANTS=N INDEXES=N TRIGGERS=N CONSTRAINTS=N

-- 匯入
--- 先匯入結構
imp system/oracle@target_db file=... log=... buffer=... fromuser=go,... touser=go,... rows=N 

--- 把trigger,外來鍵constraint disable掉

--- imp資料
exp system/oracle@target_db file=... log=... buffer=... fromuser=go,... touser=go,... rows=Y GRANTS=N INDEXES=N TRIGGERS=N CONSTRAINTS=N ignore=Y

--- 恢復trigger,約束為enable

---------------------------------------------------------------------------------------------------
- 判斷dmp檔案是以什麼模式匯出的
head expdat.dmp | strings
RENTIRE     full
RUSERS      owner
RTABLES     tables

- 從dmp檔案中抽取建立語句
strings expdat.dmp | grep "CREATE USER"
strings expdat.dmp | grep "CREATE TABLESPACE"
strings expdat.dmp | grep "CREATE PROFILE"

---------------------------------------------------------------------------------------------------
- sys使用者操作
Linux:    "\"/ as sysdba\""
Windows:  """/ as sysdba"""

---------------------------------------------------------------------------------------------------
- 大量exp匯出效率最佳化
exp go/go owner=go file=expdat.dmp buffer=204800000 compress=n direct=y recordlenth=65535 feedback=10000 log=exp.sql

direct引數的限制:
無法用直接路徑匯出可移動的tablespace,或者用query引數匯出資料庫子集
當匯入匯出的資料庫執行在不同的os下時,必須保證recordlength引數的值一致

- 大量imp匯入提高效率的方法

-- 增大sort_area_size為100M,避免磁碟排序
-- 增加redo日誌組,增大日誌檔案大小
-- 增大log_buffer,不要超過5M
-- 使用陣列插入與提交
-- 重建Index是使用指令碼Nologging方式建立
-- 若系統允許,可同時開多個imp程式來匯入不同的表資料

- 從dmp檔案匯出索引建立語句,以備最後建立索引用 -> idx.sql
imp go/go@orcl fromuser=go touser=go file=expdat.dmp buffer=20480000 indexfile=idx.sql log=imp.sql

- 僅匯入定義(索引除外)
imp go/go@orcl fromuser=go touser=go file=expdat.dmp buffer=20480000 indexes=n rows=n log=imp.sql

-- 目標表nologging並且去掉約束觸發器
alter table t nologging
alter trigger tr disable

-- 只匯入資料(索引除外)
imp go/go@orcl fromuser=go touser=go file=expdat.dmp buffer=20480000 indexes=n rows=y ignore=y feedback=1000 log=imp.sql

-- 建立索引並恢復約束和logging
@/home/oracle/idx.sql
alter table t logging
alter trigger tr enable

-- 最後確認匯入是否成功
select owner, index_name, tablespace_name from dba_indexes where owner = 'GO';
select owner, table_name, tablespace_name from dba_tables where owner = 'GO';

-- imp匯入時排除部分表
先在目標庫建立與待排除表名相同的View,在imp匯入時設定ignore=n即可

---------------------------------------------------------------------------------------------------
- 不匯入資料庫,檢視dmp檔案內容 --- 個數不是很準確
imp go/go full=y show=y log=imp_full_show.sql indexfile=idx_full.sql buffer=204800000 file=/data/exp.dmp

-- idx_full.sql
檢視錶,索引,約束建立語句以及行數等資訊
grep "CREATE*" idx_full.sql |wc -l
grep "CREATE* TABLE\|CREATE GLOBAL* TEMPORARY TABLE" idx_full.sql |wc -l
grep "CREATE* UNIQUE INDEX\|CREATE* INDEX" idx_full.sql |wc -l
grep "CREATE* TABLE\|CREATE* GLOBAL TEMPORARY TABLE\|REM  ...* rows" idx_full.sql > count_msmmail.sql
......

-- imp_full_show.sql
檢視函式,包等建立資訊
grep "CREATE* PACKAGE" imp_full_show |wc -l

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22558114/viewspace-1086548/,如需轉載,請註明出處,否則將追究法律責任。

相關文章