海量資料遷移之衝突資料篩查
對於資料遷移來說,無論準備工作準備的多麼充分,在測試和正式生產環境中,心裡還是會對沖突的資料有一些疑慮,心裡感覺沒底,因為生產的資料也是在不斷變化的,要遷移的資料也在做相應的改動,在這樣的環境中,其實資料抽取的工作還是顧慮比較少的,只要側重考慮效能的提升,而在於資料載入的過程中,如果出現主鍵衝突的欄位,不僅會嚴重拖慢載入的速度,關鍵對於這些資料的處理,讓開發和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
對於主鍵相關的資料排查,如果在資料遷移前能夠發現,是最好的了,這樣可以極大的減少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 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用impdp,expdp資料泵進入海量資料遷移
- Kafka資料遷移Kafka
- Harbor資料遷移
- gitlab資料遷移Gitlab
- 資料庫遷移資料庫
- Laravel 學習之資料庫遷移Laravel資料庫
- ORM實操之資料庫遷移ORM資料庫
- 資料遷移(1)——通過資料泵表結構批量遷移
- 雲資料庫管理與資料遷移資料庫
- Mysql資料遷移方法MySql
- 【Hive】hive資料遷移Hive
- 【Redis】 redis資料遷移Redis
- redis資料庫遷移Redis資料庫
- congregate遷移gitlab資料Gitlab
- 系統資料遷移
- 資料庫遷移 :理解資料庫
- laravel資料庫遷移Laravel資料庫
- Fastdfs資料遷移方案AST
- 伺服器資料遷移的方法-硬體不同如何遷移資料伺服器
- 遷移資料庫資料考慮問題資料庫
- Oracle資料庫(資料泵)遷移方案(上)Oracle資料庫
- Oracle資料庫(資料泵)遷移方案(下)Oracle資料庫
- 運維效率之資料遷移自動化運維
- 達夢遷移工具之MySQL資料庫遷移到達夢MySql資料庫
- linux mysql資料庫遷移LinuxMySql資料庫
- django資料庫遷移-15Django資料庫
- geoserver資料儲存遷移Server
- 用rman遷移資料庫資料庫
- 資料庫遷移手記資料庫
- 遷移MySQL 5.7資料庫MySql資料庫
- 資料庫遷移神器——Flyway資料庫
- Redis migrate 資料遷移工具Redis
- dm資料庫遷移命令資料庫
- SQL Server資料庫遷移SQLServer資料庫
- SAP資料遷移需要多久?
- 資料遷移方案選擇
- AWS RDS Oracle資料遷移Oracle
- 使用資料泵(expdp、impdp)遷移資料庫流程資料庫
- 海量資料“一鍵篩選”,比Excel還好用的篩選功能,更便捷了!Excel