
# DRS实时同步支持使用Online DDL工具吗
#### 使用场景
MySQL为源的迁移或同步任务，在增量阶段使用第三方拷表方式实现的Online DDL工具（如PT-OSC、GH-OST）在源库执行DDL，会先创建临时表，通过临时表做DDL，针对这个情况，使用DRS进行迁移或同步时，可分为以下三种场景：
- 对于库级和实例级迁移、同步任务，由于Online DDL使用的临时表在同步列表中，DRS会自动同步DDL操作，因此不需要特殊处理。
- 对于表级迁移或同步任务，如果创建DRS任务时，迁移或同步对象列表中已经提前添加了第三方Online DDL涉及的临时表的场景，DRS也会自动同步DDL操作，不需要特殊处理。
- 对于表级迁移或同步任务，如果创建DRS任务时，只选中表的数据，由于Online DDL使用的临时表不在选中的列表中，因此不会被DRS同步。可以参考以下[使用限制]和[操作步骤]，通过手动在目标库执行DDL的方式，避免源库Online DDL操作导致的源库和目标库表结构不一致，引起的DRS任务失败。
 
 #### 使用限制
- 本方案为不能使用DRS库级或实例级迁移、同步的场景下的替代方案，建议优先选择库级和实例级，尽量避免使用本方案。
- 不同DDL语句，在源库和目标库的操作顺序不同，请严格参照[操作步骤]中的顺序执行，避免因为执行顺序错误导致DRS任务失败。
- 在源库和目标库执行的DDL语句要语义一致，包括但不限于对象名、列类型、长度等要相同或兼容。
 
 #### 操作步骤
1. 查看DRS任务状态，确认任务状态为增量中且增量时延在10秒以内。
2. 确认需要执行的DDL操作，不同操作在源库和目标库执行的顺序不同。
   
   - 加列：先在目标库执行，执行成功后在源库执行。
   
   - 删列：先在源库执行，执行成功后在目标库执行。
   
   - 增加、修改、删除列默认值：跟操作顺序无关。
   
   - 修改列类型：先在目标库执行，执行成功后在源库执行。
   
   - 修改字符集：先在目标库执行，执行成功后在源库执行。
   
   - 修改列名：先在源库执行，执行成功后等待DRS任务因列不存在失败，然后在目标库执行，续传DRS任务。
   
   - 加分区：先在目标库执行，执行成功后在源库执行。
   
   - 删分区：先在源库执行，执行成功后在目标库执行。
   
   - 加索引：跟操作顺序无关。
   
   - 删索引：跟操作顺序无关。
   
   - 加约束（主键、唯一键、check等）：先在源库执行，执行成功后在目标库执行。
   
   - 删约束（主键、唯一键、check等）：先在目标库执行，执行成功后在源库执行。
   
   - 增加字段长度：先在目标库执行，执行成功后在源库执行。
   
   - 减少字段长度：先在源库执行，执行成功后在目标库执行。
   
   
   ![](https://support.huaweicloud.com/drs_faq/public_sys-resources/note_3.0-zh-cn.png)
   如果一条DDL中包含多个操作的，所有操作除去跟操作顺序无关的操作外（比如修改默认值），剩余操作的要求顺序一样，则按要求顺序操作；否则需要拆成多条DDL操作。如加列的同时修改默认值，先在目标库执行，执行成功后在源库执行。
   表1总结 
   | **DDL操作**                     | **操作顺序**                                     |
   |:---|:---|
   | 加列，修改列类型，修改字符集，加分区，删约束，增加字段长度 | 先在目标库执行，执行成功后在源库执行。                          |
   | 删列，删分区，加约束，减少字段长度             | 先在源库执行，执行成功后在目标库执行。                          |
   | 增加、修改、删除列默认值，加索引，删索引          | 跟操作顺序无关。                                     |
   | 修改列名                          | 先在源库执行，执行成功后等待DRS任务因列不存在失败，然后在目标库执行，续传DRS任务。 |
      
   
   
3. 根据[2]顺序中完成DDL操作后，查看DRS任务状态是否正常。
 
