全部產品
Search
文件中心

:DML無鎖變更概覽

更新時間:Jun 30, 2024

DML無鎖資料變更可以將單個SQL拆分成多個批次執行,能更好地滿足業務方對大量資料變更的需求,例如歷史資料清理、全表更新欄位等,保證執行效率,減小對資料庫效能、資料庫空間等的影響。

背景資訊

當業務累積了大量資料時,需要定期清除表中的資料,或對線上資料和歷史資料進行分隔管理。您可能會遇到以下問題:

  • 單條SQL影響行數過多,日誌超過閾值導致任務執行失敗。

  • SQL沒有使用索引導致鎖表,資料庫負載增加,甚至造成業務故障。

此類問題通常可通過分批執行的方法解決,但是仍存在風險,例如:

  • 研發寫程式分批處理:

    • 分批方式不當,例如直接用LIMIT進行分批,可能仍會鎖表。

    • 分批執行的頻率沒有控制好,會造成主備延遲過大。

  • DBA提取目標資料手動拆分:

    人工拆分非常繁瑣,工作量大,且易出錯,並且很難進行動態調整。

為解決上述問題,DMS提供了DML無鎖變更。具體操作,請參見DML無鎖變更

適用情境

  • 歷史資料清理

  • 全表更新欄位

支援的資料庫類型

  • MySQL:RDS MySQLPolarDB MySQL版MyBase MySQLPolarDB分布式版、其他來源MySQL

  • PostgreSQL:RDS PostgreSQLPolarDB PostgreSQL版MyBase PostgreSQL、其他來源PostgreSQL

  • MariaDB:RDS MariaDB、其他來源MariaDB

  • OceanBase MySQL模式

  • PolarDB PostgreSQL版(相容Oracle)

功能特點

  • 不會影響業務。

  • 減少資料變更對資料庫效能、資料庫空間等的影響。

  • 能更好地滿足業務方對大量資料變更的需求,保證資料變更的執行效率。

主要原理

  • 分批執行單個SQL:強大的DMS引擎將單個SQL拆分成多個批次執行。

  • 每個批次執行後有Sleep(暫停)進行緩衝。

使用限制

當前僅支援UPDATE、DELETE、INSERT_SELECT類型的SQL。若需要使用其他類型的SQL,您可提交普通資料變更工單。具體操作,請參見普通資料變更

SQL類型

限制項

UPDATE、DELETE

  • 僅支援UPDATE或DELETE單表操作。

  • 更新、刪除(UPDATE、DELETE)資料時必須添加WHERE子句。若需要更新或刪除全表,則需要添加WHERE 1=1子句。

  • 不支援UPDATE、DELETE包含子查詢篩選條件。

  • 不支援LIMIT子句。

INSERT_SELECT

  • SELECT子句僅支援單表操作。

  • SELECT部分需要帶上WHERE子句,若需要SELECT全表資料,則需要帶上WHERE 1=1

  • SELECT部分不支援LIMIT、ORDER BY、GROUP BY等子句。