先找出錯誤匯入的邊界
把錯誤CSV匯入正式資料庫後,最容易做錯的下一步是直接刪掉「今天的資料」。今天可能同時有正常生產、補送與其他人的匯入。先用匯入工作識別與實際事件清單圈出影響範圍,再決定隔離、修訂或刪除,不能只用時間大致相近當證據。
先保存原始匯入檔、檔案摘要、工作識別、來源、執行時間、匯入規則版本與錯誤原因。保留當時日誌與接受結果,尤其要分清新增、更新、重複跳過與失敗幾類。收到一千列不代表資料庫真的新增一千列,也可能修改了既有資料。
本文是資料處置教學,適用於有匯入追溯欄位的一般資料庫。以PostgreSQL 18的DELETE與交易語意作參考,不提供可直接套用正式庫的刪除指令;實際關聯、觸發器與權限必須先按自己的資料模型確認。
如果已確定錯誤來源仍在持續匯入,先按既定維運流程暫停該入口或將其隔離,避免一邊清理一邊新增。這不等於停止整個資料系統;要記錄受影響的入口與期間,並保留尚未處理的來源資料,方便修正後重送。
把待處置資料做成可覆核清單
教學案例匯入工作J17讀到一百列,六十列新增、二十列更新既有事件、十五列重複跳過、五列失敗。若直接按工作J17刪掉八十列,會把原來就存在的二十列也刪掉。新增列可評估移除,更新列則需要變更前值才能復原。
待處置清單逐列保存事件鍵、操作類型、變更前後值、關聯明細與目前版本。沒有前值時先列為無法直接還原,尋找備份或來源證據,不能用預設零值填回去。重複跳過與失敗列通常沒有新增正式資料,但仍要確認是否產生其他副作用。
以同一篩選條件先執行唯讀預覽,核對筆數、來源、期間與抽查事件。範圍不是只有一個總數:要能列出完整鍵集合,讓覆核者看得出哪些資料會受影響。即使預期六十筆而查出六十筆,也可能選錯另一組六十筆。
將候選資料匯出到獨立保存位置,包含必要欄位與關聯。記錄匯出格式、字元編碼、時間精度及空值表示,再做讀回核對。只截一張列表畫面不夠還原全部欄位;畫面可以輔助說明,完整資料仍須有可處理的形式。
完成後應有一份處置包:原檔、匯入日誌、影響清單、變更前後資料、原因與預定動作。每份檔案都可對應到這次處置識別,不能散落在多個叫「備份新版」的檔案中,讓人無法知道哪份才是刪除前狀態。
先盤點關聯與已發生的下游影響
主檔刪除可能連帶刪除明細,或因外鍵限制而失敗;觸發器也可能更新彙總或寫入其他表。先查資料模型與實際定義,列出預期影響,不能只看到主表六十筆就認為全系統只有六十列會改變。
錯誤資料可能已進入日報、快取、訊息佇列或外部系統。資料庫內移除不會自動撤回已下載的報表或已寄出的通知。另列需重算、撤回或發布修訂的下游項目,使用穩定事件與版本關係處理,避免修正後又重複計入。
對正在被其他工作更新的資料,固定候選鍵並檢查目前版本是否仍符合處置基準。預覽與執行之間若內容已變,應重新評估,不讓舊的清理計畫覆蓋後來的合法修正。單純隔幾分鐘再執行相同時間條件,不能保證範圍沒變。
在隔離副本先演練預定處置與回復,核對關聯筆數及報表結果。回復不一定只是重新插入主表,可能還要恢復明細、索引依賴與修訂狀態。若保存證據沒有經過讀回或復原驗證,就不能宣稱已具備可用的回退方案。
保留期間與存取權限依資料制度設定,處置包不應變成誰都能下載的第二份正式資料庫。這裡的目的在保留可查證的影響與復原資訊,並非要求無限期複製所有資料;到期處理仍要遵守既有保存政策。
執行後比對真正改動的集合
在適用的資料庫交易中完成彼此相關的變更,執行後先核對實際影響鍵與預期鍵集合,再按流程提交。PostgreSQL DELETE可用RETURNING取得被刪除目標列的欄位,但這不是完整稽核系統,也不能直接當成所有級聯或外部副作用清單。
交易回復只涵蓋其可回復的資料庫變更,外部通知或已被其他系統使用的內容仍須另處理。長交易也可能造成鎖定與維運影響,應事前估計範圍與執行窗口;不能為了保留人工確認時間就讓正式庫無限等待。
失敗時先核對是不是條件選錯、關聯限制、資料版本已變或權限不足。不要遇到外鍵錯誤就關閉所有限制重試;限制可能正是在保護還有用途的資料。保留錯誤與已完成步驟,辨別整體回復或部分流程尚待補救。
完成後保存實際處置數、鍵集合、時間、操作者與結果,並核對正常資料仍在、錯誤資料已按約定隔離或移除、下游修訂完成。匯入規則修正後先用小樣本驗證,再重新匯入;相同錯檔重跑不應再次製造同一批問題。
練習與常見問題
練習:預定移除工作J20新增的三十個事件,唯讀預覽查到三十二個,其中兩個來自另一工作。正確動作是先修正識別條件並重新覆核,不能刪三十二個再把兩個補回。若其中五個已有合法後續修訂,也要先評估修訂關係再處置。
問:有備份就可以先刪再查嗎?答:備份範圍與復原能力仍須確認,先固定影響集合較容易避免誤刪。
問:匯入時更新的列可以直接刪掉嗎?答:通常需要恢復原值或修訂,刪除會損失原本合法資料。
問:RETURNING可以取代所有處置證據嗎?答:不能,還需要原檔、原因、範圍與關聯影響。
問:資料庫清乾淨就全部完成嗎?答:還要處理已產生的報表、快取與外部資料,並修正造成錯誤的入口。
參考:PostgreSQL 18 DELETE:刪除條件與RETURNING的範圍。
參考:PostgreSQL 18 Transactions:資料庫交易整體提交與回復。