
# 无锁数据变更简介
#### 操作场景
在高并发的数据库操作场景中，当需要对数据库表执行DDL操作时，通常会遇到因加锁导致的性能瓶颈，影响业务的正常运行。TaurusDB集成[gh-ost工具](https://github.com/github/gh-ost)提供无锁变更功能，可以在执行DDL操作时避免对原表数据加锁，从而减少对业务的影响，同时通过事务管理机制确保数据的一致性和完整性。
#### 使用建议
- 建议业务尽量在低峰期执行无锁热变更操作。
- 避免变更过程中使用session变量修改环境参数，例如修改time_zone等会话级参数。
- 避免变更期间业务侧运行长事务。
- 避免变更后目标表的字段约束、长度、类型范围、精度相比变更前变小，如 VARCHAR 长度缩短、整型范围降级、DECIMAL 精度缩减、NULL 改为 NOT NULL（表存在空数据场景）会出现数据截断、数值溢出、数据丢失。
 
#### 约束限制
- 变更SQL语句需要使用ALTER TABLE Statement的语法形式，具体语法形式请参照官方文档[ALTER TABLE Statement](https://dev.mysql.com/doc/refman/8.0/en/alter-table.html)。
- 仅适用于企业版，部署形态为集群版的TaurusDB实例，变更前实例状态正常，主节点和只读节点状态正常。
- 单次任务最多支持10 条不同表的变更 SQL，末尾以英文;结尾，多条ALTER 语句不可操作同一张表。
- 当前集成gh-ost版本为v1.1.4, 不支持识别MySQL原生INSTANT算法。如有需要，请连接数据库直接执行。
- 待变更的目标库表限制如下：
  表1目标库表约束限制 
  | **分类**                                                                           | **限制内容**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
  |:---|:---|
  | 表类型限制                                                                            | 不能为临时表、系统表、视图。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
  | 存储引擎与字符集限制                  | - 存储引擎必须是 InnoDB。  - 不支持 latin1字符集的表结构。                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
  | 表结构限制          | - 不支持分区表。  - 不支持无主键的表进行变更。  - 主键字段类型不能为 json、float、binary 类型。  - 不支持 SET 类型列、虚拟列。                                                                                                                                                                                                |
  | 外键与触发器限制                   | - 不支持待变更的目标表自身拥有外键，且当前表不可被其他表作为外键依赖引用。  - 不支持待变更的目标表拥有触发器。                                                                                                                                                                                                                                                                                                                                                                                                                               |
  | 字段与索引限制              | - 不支持修改整表字符集、排序规则（COLLATION）。  - 不支持修改表存储引擎。  - 不支持对全文索引、空间索引进行新增、删除、修改变更。                                                                                                                                                                                                                                                                                                                   |
  | 操作限制     | - 不支持重命名、删除、修改主键，不支持新增主键。  - 不支持表重命名操作。  - 不允许待变更库中存在与 \~{tablename}_ghc、\~{tablename}_gho 同名的表。  - 不支持 TRUNCATE TABLE、DROP TABLE、清空表类操作。  - 字段重命名及所有字段变更不允许附带 FIRST / AFTER 调整字段物理列顺序。   |
     
  
 
