
# 在WiseDBA中执行SQL变更
SQL变更功能可以帮助业务（主要是开发和运维）简化现网的SQL变更流程。帮助运维在做现网数据库变更时更好地发现SQL语句的相关风险，将高中低风险项识别出来，避免人工执行过程中产生的相关误操作；帮助开发简化现网上线SQL变更的流程，促进开发人员在版本开发的过程中提前将相关风险的语句进行筛选和甄别。
#### 前提条件
- 需要具备AppStage服务运维岗位权限或运维管理员权限，权限申请操作请参见[申请权限](https://support.huaweicloud.com/usermanual-appstage/appstage_04_0009.html)。
- 仅支持对WiseDBA管理台中纳管的数据库执行SQL变更，对WiseDBA管理台中没有记录的数据库，需要先在管理台中纳管以后再使用该功能进行变更操作。
- 需要提前创建好变更电子流，具体请参见[变更电子流管理](https://support.huaweicloud.com/usermanual-wiseeye/appstage_04_0112.html)。
 
#### 步骤一：打包SQL脚本
开发按照打包规范打包SQL脚本，打包规范请参考[SQL包打包规范](https://support.huaweicloud.com/devg-appstage/appstage_06_0043.html)。
#### 步骤二：上传SQL包
- 通过开发中心流水线打包，具体请参见[流水线管理](https://support.huaweicloud.com/usermanual-wisestudio/appstage_04_0047.html)。
- 通过部署服务手动上传，具体请参见[手动上传各类包到AppStage软件仓库](https://support.huaweicloud.com/usermanual-wiseeye/appstage_04_0105.html)。
 
#### 步骤三：创建并执行变更任务
1. [进入AppStage运维中心](https://support.huaweicloud.com/usermanual-wiseeye/appstage_04_0089.html#appstage_04_0089__zh-cn_topic_0000001896253866_zh-cn_topic_0000001785965698_section11734269409)。
2. 在顶部导航栏选择服务。
3. 单击![](https://support.huaweicloud.com/usermanual-wiseeye/zh-cn_image_0000002159072726.png)，选择"微服务开发 \> 数据库治理"。
4. 选择左侧导航栏的"SQL变更"，单击"创建人工变更"。
5. 选择变更电子流，选择需要执行的任务变更包，单击"保存"。 SQL变更列表中生成一条变更任务，系统自动进行风险评估。
   单击变更任务前的![](https://support.huaweicloud.com/usermanual-wiseeye/zh-cn_image_0000002158912990.png)，单击数据库列表操作列的"详情"，单击文件列表操作列的"查看"，可以查看SQL语句的风险状态。如果存在高危语句，请自行评估风险再确定是否要执行。
   处理风险后，勾选一条或多条数据库实例，单击"批量风险评估"，对选中的数据库再次进行风险评估。
   
6. 单击任务列表操作列的"执行"。
   - 执行实例级变更：单击变更任务前的![](https://support.huaweicloud.com/usermanual-wiseeye/zh-cn_image_0000002194313837.png)，单击数据库列表操作列的"执行"，仅对当前数据库执行SQL变更；勾选一条或多条数据库实例，单击"批量执行"，对选中的数据库执行SQL变更。
   
   - 执行SQL文件级变更：单击变更任务前的![](https://support.huaweicloud.com/usermanual-wiseeye/zh-cn_image_0000002194399493.png)，单击数据库列表操作列的"详情"，单击文件列表操作列的"查看"，可以执行单个SQL文件。
    
7. 在弹出窗中配置执行选项。执行选项说明如[表1]所示。配置完成后单击"确定"。
    表1执行SQL设置参数说明 
   | 参数        | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   |:---|:---|
   | 并行执行      | 默认关闭，默认SQL变更任务下所有子任务都会串行执行，即执行完一个子任务后再执行下一个子任务，避免对数据库性能消耗过大。 业务使用时经过评估后可选择并行执行，即将所有子任务一起执行，节约时间。 并行执行一般是task维度并行，也就是Schema并行；job的并行任务是以Schema维度去并行的，一个实例下Schema之间互不影响并行执行。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 跳过预检查     | 默认关闭，主要是检查是否存在长事务和锁，此时任务状态为"预检查中"。 - 开启后，SQL变更工具在用户单击执行按钮后会花费1分钟左右的时间对数据库进行预检查，此过程时间较长，请自行评估是否要选择。  - 预检查成功后会自动执行，预检查失败会报出提示信息，并且任务状态重新退回"准备就绪"。  - 此时用户需要对数据库进行检查，是否此时负载较高，或者存在长事务，或者是否有大数据量的查询语句一直在执行未结束等等。  - 检查完毕后可重新单击"执行"，如果确定该问题不影响SQL语句的执行，则可单击"执行（忽略预检查）"。   |
   | 忽略重复执行的错误 | 默认关闭，默认在执行中遇到任何错误都会停止执行（事务会自动回滚），需要业务对错误信息进行甄别和评估后才可继续执行。 业务经过评估后可打开开关（单条SQL事务执行），打开后遇到重复执行类似导致的报错（比如已存在表、列等），会跳过该错误继续执行后续其他未执行的语句；但是要注意，该错误仍然会记录在审计日志中。 如果选择关闭，mysql会以整个sql文件进行回滚，仅涉及DML，如果打开，则不会回滚。 开关打开后只会跳过重复执行或者重复主键、重复创建等报错，部分报错允许忽略继续执行，其他报错不允许跳过执行。允许忽略的错误类型如下： xxx already exists、Duplicate column name、Duplicate key name、Unknown table、Can't Drop xxx, check that column、key exists、existing column、unconfigured table、Table XX doesn't exist、does not exist、conflicts with an existing column                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
      
   
 
