有一個疑問:
一張表a有4000萬數據,通過datax從mysql同步到sqlserver , 比如時間點從12點開始執行這個datax腳本,但是原表a的數據還一直新增,比如1分鐘新增10條。
有一個疑問:
一張表a有4000萬數據,通過datax從mysql同步到sqlserver , 比如時間點從12點開始執行這個datax腳本,但是原表a的數據還一直新增,比如1分鐘新增10條。
datax腳本如下,
{
"job": {
"setting": {
"speed": {
"channel": 5,
"byte": 1048576
},
"errorLimit": {
"records": 1,
"percentage": 0
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "tablenameapsoe_tao",
"password": "r!",
"dateFormat": "YYYY-MM-dd hh:mm:ss",
"column": [
"id",
"user_id",
"flag",
"remark",
"create_time",
"modify_time"
],
"connection": [
{
"table": ["tablenameapsoe_user.as_personalized_status_info"],
"jdbcUrl": [
"jdbc:mysql:///tablenameapsoe_user?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai"
]
}
],
"maxRetries": 3,
"splitPk": "id"
}
},
"writer": {
"name": "sqlserverwriter",
"parameter": {
"username": "ETL_fgUser",
"password": "dfg",
"dateFormat": "YYYY-MM-dd hh:mm:ss",
"column": [
"id",
"user_id",
"flag",
"remark",
"create_time",
"modify_time"
],
"preSql": [
"truncate table PosData.dbo.as_personalized_status_info"
],
"connection": [
{
"jdbcUrl": "jdbc:sqlserver://;DatabaseName=PosData",
"table": [
"PosData.dbo.as_personalized_status_info"
]
}
]
}
}
}
]
}
}
Violation of PRIMARY KEY constraint 'PK__as_perso__3213E83F37E25705'. Cannot insert duplicate key in object 'dbo.as_personalized_status_info'. The duplicate key value is (870406845747979454).
這個時候報錯了說主鍵重複,我查詢原表數據是不會有重複的,我在想,可能是在同步過程中出現的,datax同步過程中,由於原表的數據在新增或者修改,這樣會出現重複的問題嗎?
在您描述的情況下,可能會出現數據同步過程中出現重複數據的問題。
DataX 是一個數據同步工具,它以並行方式將數據從源表讀取並寫入目標表。在您的情況下,源表有 4000 萬條數據,並且在同步過程中一直在新增數據。這可能導致以下情況之一發生:
數據冗餘複製:如果源表中的數據在同步開始之後又被複制到了新的位置,那麼 DataX 將會讀取到已經複製的數據,並嘗試將其寫入目標表。這可能導致主鍵衝突錯誤。
併發寫入問題:如果多個同時進行的同步任務都在向目標表寫入數據,並且這些任務讀取到了相同的新增數據,那麼它們會嘗試同時寫入目標表。由於 DataX 的併發性,這樣的併發寫入可能導致主鍵衝突錯誤。
爲了解決這個問題,您可以考慮以下幾個方案:
增加同步頻率:如果您的數據源表在短時間內有大量新增數據,可以考慮增加同步的頻率,以便更及時地將數據同步到目標表中。
增加主鍵衝突處理機制:您可以在 DataX 的配置中增加主鍵衝突處理機制,例如設置在遇到主鍵衝突時跳過該條數據或者更新目標表中已存在的記錄。這樣可以避免主鍵衝突錯誤的出現。
使用增量同步方式:如果您的數據源支持增量同步方式,可以考慮使用增量同步來處理新增數據。這樣只會同步源表中發生變化的數據,減少了重複數據的可能性。
檢查源表的唯一性約束:確保源表上的唯一性約束設置正確,並且應用程序或其他方式未繞過該約束直接向源表寫入數據。
在同步過程中加鎖源表:如果可能的話,可以在同步過程中對源表進行加鎖,以防止併發寫入導致的衝突。
解決方案:
1.時間改道無業務數據進來時間段,比如半夜。
2.主鍵衝突處理機制(sqlserver不支持)忽略該步驟
3.使用程序讀寫控制好條數,保證此處任務中只有一個id,不會出現不同id,可以用spark 任務同步