日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

無鎖結構變更

更新時間: 2024-12-16 17:22:39

DDL無鎖變更能夠有效解決結構變更時鎖表的問題,較好地規避了因鎖表導致業務阻塞的問題、避免了數據庫原生Online DDL帶來的主備延遲現象。您可在業務低峰期提交無鎖變更。

背景信息

在數據量大的情況下進行結構變更,需要考慮鎖表的風險,鎖表將導致業務無法正常寫入。MySQL原生能力:

  • MySQL 5.5及之前的版本,DDL提供了Table-Copy和In-Place兩種執行算法:

    • Table-Copy:通過拷貝臨時表完成變更,變更期間表被鎖定不可寫入。

    • In-Place(從MySQL5.5開始提供):該算法執行期間數據庫可以進行讀寫,但僅支持索引數據。

  • MySQL 5.6及后續的版本,DDL還提供了Innodb-OnlineDDL。關于Innodb-OnlineDDL,請參見Innodb-OnlineDDL

    可以覆蓋大范圍的DDL類型(如,添加列、刪除列、列名修改、添加索引、修改索引等),但仍然有些常見的DDL類型(如,修改列的類型、修改列的長度、修改字符集等)無法覆蓋。

適用場景

  • 變更數據庫表結構。

  • 變更表的字符集和校驗集、調整時區等。

  • 規避Optimize Table操作回收表空間、降低碎片率引起的鎖表。具體操作,請參見無鎖結構變更回收碎片空間

支持的數據庫類型

RDS MySQLPolarDB MySQL版MyBase MySQL、其他來源MySQL。

功能特點

  • 相比較數據庫原生,DMS無鎖結構變更支持控制變更的執行速率,可避免數據庫主備鏈路延遲,對數據庫性能影響更小,并支持多種原生OnlineDDL執行時會鎖表的場景。

  • 相比較PT-Online、OSC等其他工具,DMS無鎖結構變更不依賴于觸發器,且異步執行時對數據庫的影響非常小,可隨時安全中斷。

  • DMS無鎖結構變更與DTS同步工具兼容性好,變更的表中如有DTS表級別的復制鏈路,使用DMS無鎖結構變更不會導致DTS復制中斷。

    說明

    必須在2020年2月14日后重啟過DTS復制鏈路。

  • MySQL原生OnlineDDL與DMS無鎖結構變更能力對比:

    支持項

    MySQL5.5及以前版本

    MySQL5.6及后續版本

    DMS無鎖結構變更

    添加列

    N

    Y

    Y

    刪除列

    N

    Y

    Y

    列名修改

    N

    Y

    Y

    添加索引

    N

    Y

    Y

    修改索引

    N

    Y

    Y

    碎片整理操作

    N

    Y

    Y

    修改列的類型

    N

    N

    Y

    修改列的長度

    N

    N

    Y

    修改字符集

    N

    N

    Y

    轉換字符

    N

    N

    Y

    時區修正操作

    N

    N

    Y

    緩解或消除備庫延遲

    N

    N

    Y

    • N:不支持。

    • Y:支持

DMS無鎖結構變更與其他變更方案對比信息,請參見無鎖結構變更方案對比

注意事項

  • DMS支持對已有分區表的表進行結構變更。

  • 無鎖結構變更支持在同一變更工單中,對同一數據庫下的多張表進行變更。

    在配置工單的變更SQL時,不同表SQL可使用英文分號(;)隔開。

  • 當表(只有主鍵或唯一鍵)進行無鎖表結構變更時,不允許更新主鍵和唯一鍵,否則會導致變更任務失敗。

主要原理

當您提交了無鎖結構變更工單,DMS會自動進行如下操作,以實現無鎖結構變更。

  1. 創建臨時表:DMS在目標數據庫中創建與原表結構相同的臨時表用于數據拷貝。

    SQL語法為CREATE TABLE tmp_table_name LIKE table_name

  2. 變更臨時表結構: 根據業務需求變更臨時表結構。

    SQL語法為ALTER TABLE tmp_table_name XXXX

  3. 拷貝全量數據:將目標表中的全量數據同步至臨時表。

    SQL語法為INSERT IGNORE INTO tmp_table_name (SELECT %s FROM table_name FORCE INDEX (%s) WHERE xxx

  4. 解析Binlog并同步增量數據: 將目標表中的增量數據同步至臨時表。

    SQL語法為UPDATE/INSERT/DELETE tmp_table_name

  5. 切換新舊表:重命名原表作為備份,再用臨時表替換原表。

    SQL語法為RENAME TABLE table_name to old_tmp_table_name, tmp_table_name to table_name

說明

tmp_table_name為示例的臨時表名。您可以在無鎖變更任務進展區域查詢具體的臨時表名,具體操作,請參見查看無鎖變更進度

如下為具體的臨時表名格式:

  • 數據表:tp_{變更ID}_ogt_{原表名}、tp_{變更ID}_g_{原表名}

  • 心跳表:tp_{變更ID}_ogl_{原表名}、tp_{變更ID}_l_{原表名}

  • 切換前的輔助表、切換后的原表:tp_{變更ID}_del_{原表名}、tp_{變更ID}_d_{原表名}

  • 探測是否鎖表: tpa_xxx_xxx

說明

變更ID是DMS內部引擎的執行ID,不是工單號和任務號。

相關文檔

常見問題

  • Q:無鎖結構變更對業務有影響嗎?

    A:正常情況下不影響您的業務。由于變更過程涉及數據拷貝,會對實例性能產生一定影響。

  • Q:通過無鎖變更工單執行CREATE_INDEX添加索引報錯了,是DMS不支持添加索引嗎?

    A:DMS支持添加索引。您可嘗試換一種添加索引的方式,例如?ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) ;

上一篇: 表一致性修復 下一篇: 無鎖結構變更方案對比
阿里云首頁 數據管理 相關技術圈