海量資料遷移之衝突資料篩查

kingsql發表於2014-09-11
對於資料遷移來說,無論準備工作準備的多麼充分,在測試和正式生產環境中,心裡還是會對沖突的資料有一些疑慮,心裡感覺沒底,因為生產的資料也是在不斷變化的,要遷移的資料也在做相應的改動,在這樣的環境中,其實資料抽取的工作還是顧慮比較少的,只要側重考慮效能的提升,而在於資料載入的過程中,如果出現主鍵衝突的欄位,不僅會嚴重拖慢載入的速度,關鍵對於這些資料的處理,讓開發和dba都很頭疼,開發需要dba來提供詳盡的資訊,dba則需要多個team之間進行協調。可能會有一些緊急的資料更改任務,資料的稽核等等。。
對於主鍵相關的資料排查,如果在資料遷移前能夠發現,是最好的了,這樣可以極大的減少dba的工作量。
個人就是在這種窘境中這樣設想了一個方法,首先透過查詢主鍵資訊,得到主鍵索引相關的列,然後透過Intersect來查詢那些主鍵欄位的資料在生產和遷移庫上有衝突,這個過程可以建立一個臨時的使用者來載入外部表,所以省去了建立額外的資料空間,而且可以考慮在備庫上執行。排查的過程中因為走了索引掃描,所以查詢比較的時候速度還是比較可觀的。
基本思路就是透過如下的sql語句來找到冗餘的資料。
select xxxxx,xxxxx,xxxx from source_schema.table_01 --載入外部表資料的schema
intersect
select xxxx,xxxx,xxxx from target_schema.table_01   --目標資料的schema

實現的指令碼如下所示:
echo check duplicate data between  $1.$2 $3.$2_EXT2 >> intersect_result.log
sqlplus -s  n1/n1 < set pages 0
set feedback off
set linesize 300
col intersect_sql format a1000
spool intersect_result.sql
SELECT 
'select '|| SUBSTR (MAX (SYS_CONNECT_BY_PATH (column_name, ',')), 2)||' from '||table_name||chr(10)||
' intersect '||chr(10)||
'select '|| SUBSTR (MAX (SYS_CONNECT_BY_PATH (column_name, ',')), 2)||' from $3.'||table_name||'_ext2;' intersect_sql
FROM (SELECT index_name, table_name,column_name, rn, LEAD (rn) OVER (PARTITION BY index_name ORDER BY rn) rn1
         FROM (SELECT index_name, table_name,column_name, ROW_NUMBER () OVER (ORDER BY column_position desc) rn
                   FROM all_ind_columns where table_name=upper('$2') and table_owner=upper('$1')))
START WITH rn1 IS NULL
CONNECT BY rn1 = PRIOR rn
GROUP BY index_name,table_name;
spool off;
spool intersect_result.log append
@intersect_result.sql
spool off;
EOF
exit

在此基礎上更近一步,可以透過如下的指令碼來生成動態的執行指令碼,直接執行tmp_compare.sh就可以了。其中tab_parall.lst是一個配置檔案。裡面包含了需要比較的表 
cat ../parfile/tab_parall.lst|awk -v  source_schema=$1 -v ext_schema=$2 '{print "ksh compare.sh " source_schema " " $1 " "  ext_schema}'  > tmp_compare.sh

tab_parall.lst的內容類似如下的格式:
table01
table02
table03

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

相關文章