Oracle--資料遷移
需求:將一個數據庫下的幾張表遷到一個新庫
在最初的設計中,一些輕量級的業務(群聊)資料和使用者的基本資訊是在同一個庫中的,在今年年初,隨著使用者量突破8千萬,這些業務操作對資料庫的壓力越來越大,需要將其從使用者資訊庫(USERDB)中分離出來單獨建立一個數據庫(GROUPDB)處理,以減輕使用者資訊庫的壓力。
分析:
- 該業務資料包含群資料、群成員資料、群聊資料,共計150張表,2億7839萬條記錄,資料檔案大小31.5G
- 兩個庫不在同一臺數據庫伺服器上,在GROUPDB所在伺服器上實測從USERDB所在伺服器上ftp get速度在100MB/s以上
- 可以接受停機操作,但視窗時間不能超過40分鐘,也就是說實際生產上需要在40分鐘內執行完畢
操作:
1.新建資料庫
根據資料庫安裝手冊安裝oracle資料庫,將例項配置為GROUPDB,然後規劃表空間和索引空間,如下:
set echo on spool CreateDB.log --建立索引空間 ... create tablespace index datafile '/GROUP/index01' size 10240M reuse, '/GROUP/index02' size 10240M reuse ... ... extent management local segment space management auto / --建立表空間 ... create tablespace tablelog datafile '/GROUP/tablelog01' size 20480M reuse , '/GROUPDB/tablelog02' size 20480M reuse ... ... extent management local segment space management auto / spool off;
建立表空間和索引空間時,需要根據歷史資料增長速度和當前資料檔案大小來規劃需要開闢的空間大小。
建立完表空間後,需要新增資料庫使用者並授予相應許可權,這個許可權要與USERDB裡的使用者許可權保持一致。
資料匯出
先在要匯出的資料庫上建立一個資料夾(如:/home/userData),用於儲存匯出的資料檔案,然後在資料庫上執行建立目錄的指令碼,將資料庫操作目錄指向建立的資料夾
create or replace directory TRANS_USER as '/home/userData';
2.使用資料泵匯出資料:
#!/bin/ksh ORACLE_SID=USERDB;export ORACLE_SID #STEP1 後臺執行指令碼 nohup expdp USER/USER directory=TRANS_USER content=data_only tables=GROUP query=GROUP:\"where MODgroupid,50\<25\" dumpfile='GROUP1.dmp' cluster=no logfile='exp_trans1.log' & Sleep 5 ... ... #STEP2 統計指令碼執行情況 while [ 1 -eq 1 ] do lineNum=`find ./ -name "*.log" | xargs grep "exported" | wc -l` echo $lineNum if [ $lineNum -eq 150 ] then echo 'Data exported success!!!' break else echo 'Data exported continue ...' sleep 5 fi done
STRP1:由於資料量比較大,建議用nohup ... &的方式在後臺執行指令碼
在執行expdp時,可以使用query引數進行資料篩選,如:
query=GROUP:\"where MODgroupid,50\<25\"
是順道將GROUP表按照groupId欄位取餘進行一次拆表。
STEP2:因為都是在後臺執行的資料泵匯出指令碼,多個指令碼並行執行,加快了匯出速度,但是不好統計。在這裡統計匯出日誌裡的關鍵字(exported)來判斷有多少指令碼執行完畢:
lineNum=`find ./ -name "*.log" | xargs grep "exported" | wc -l`
3.資料匯入
先在要匯入的資料庫上建立一個資料夾(如:/home/userData),用於儲存匯出的資料檔案,然後在資料庫上執行建立目錄的指令碼,將資料庫操作目錄指向建立的資料夾:
create or replace directory TRANS_GROUP as '/home/userData';
再使用ftp get命令將要匯入的.dmp檔案傳到新建的資料夾,記得切換本地目錄:
get /home/userData/*.dmp
然後進行資料匯入:
#!/bin/ksh
ORACLE_SID=GRPDB;export ORACLE_SID
#STEP1 匯入時注意切換schema
nohup impdp group/group directory=TRANS_GROUP remap_table='GROUP:GROUP_1' dumpfile='GROUP1.dmp'
table_exists_action=append cluster=no logfile='GROUP1.log' content=data_only remap_schema=user:group &
... ...
sleep 2
done
while [ 1 -eq 1 ]
do
lineNum=`find ./ -name "*.log" | xargs grep "imported" | wc -l`
echo $lineNum
if [ $lineNum -eq 150 ]
then
echo 'Data imported success!!!'
break
else
echo 'Data imported continue ...'
sleep 5
fi
done
STEP1:用於匯入匯出的庫不同,在匯入資料時,需要切換schema(remap_schema=user:group)
4.資料驗證
當資料全部遷移完畢後,建議做一下資料驗證,以確保匯入匯出後的資料完全一致,可以採用總量驗證和抽樣驗證相結合的方法。
資料驗證完畢後要檢查下原資料表相對應的一些sequence、job等是否需要同步