BUILD
BUILD任务用于将实时写入的数据转换为历史数据格式。在该过程中会构建索引、清理冗余数据、执行异步DDL任务等,将数据从写优化转变为读优化。
功能说明
BUILD命令可以对实时写入的数据及其涉及到的历史分区执行合并、构建索引、执行异步DDL等操作。如果用户通过INSERT、UPDATE、DELETE等修改分区的数据,那么该分区需要执行BUILD,与实时数据结合后,生成新的分区。如果用户没有修改分区的数据,则该分区不会被BUILD任务修改。
当前BUILD任务调度是以表为粒度的,不同表的BUILD任务可以并行执行。当BUILD任务开始执行后,表级的BUILD任务会切分为以Shard为粒度的BUILD子任务,每个Shard的3个副本都有一个BUILD子任务,当所有的子任务都执行完成后,BUILD任务完成。
注意事项
- BUILD期间,该表不能执行 - INSERT OVERWRITE SELECT导入任务,需等待BUILD任务结束才能执行。如果有写入需求,可以使用- INSERT INTO导入。
- BUILD任务提交后,不支持取消。 
- BUILD任务的并发数默认为 - 核数(Core)/3,向上取整。不支持修改BUILD任务的并发数。- 例如,集群规格为32核128 GB,则BUILD任务的并发数为 - 32/3向上取整,即并发数为11。
- BUILD期间可能会消耗CPU、内存和IO资源,CPU使用率和磁盘IO使用率等磁盘相关指标均会增加,在BUILD任务结束后,这些指标会回归业务正常值。建议您在业务低峰期执行BUILD任务。 
自动触发BUILD任务
若集群满足以下条件中的任意一条,会立即触发BUILD任务:
- 达到最小BUILD时间间隔,且单表的某个一级分区满足新增数据达到5万条。 - 企业版、基础版或湖仓版BUILD时间间隔:1.5小时。 
- 数仓版弹性模式BUILD时间间隔:1.5小时。 
- 数仓版预留模式BUILD时间间隔:0.5小时。 
 
- 距离上次BUILD,时间已过去24小时且至少修改1行数据。 
手动触发BUILD任务
变动分区BUILD
- XUANWU表 - BUILD TABLE <table_name>;- 只对变动的分区执行BUILD。 
- XUANWU_V2表 - BUILD TABLE <table_name> [BUILD_OPTION];- BUILD_OPTION:可选参数,仅支持- ttl。在未指定该参数的情况下,默认只对变动的分区执行BUILD。如果指定了该参数,那么会在BUILD完成后,立即删除过期分区。
判断和指定表引擎的方法,请参见指定表引擎。
指定分区BUILD
BUILD TABLE test force partitions='partition1,partition2';仅3.1.6.0及以上版本的集群支持指定分区BUILD。如何查看集群内核版本,请参见如何查看实例版本信息。如需升级内核版本,请联系技术支持。
当表较大时,BUILD TABLE <table_name> force = true;的执行时间会很长。AnalyticDB for MySQL支持通过partitions指定需要BUILD的分区,减少长时间的BUILD资源占用,尽快完成BUILD任务。
强制全表BUILD
BUILD TABLE <table_name> force = true;强制全表BUILD将对全表所有分区的数据重新构建索引。该功能默认关闭。
强制全表BUILD将对全表所有存量数据重新构建索引,耗时久,建议您使用指定分区BUILD功能。若需使用强制全表BUILD功能,请谨慎评估系统风险后提交工单开启该功能。
配置BUILD自动调度时间
- 配置方法 - SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`<start>,<end>`;- start和- end取值为0~24之间的整数,需使用反引号(``)引起来,表示在start~end时间段内调度BUILD任务。可以配置多个时间段,多个时间段以英文分号(;)隔开。- 例如, - start和- end分别配置为0和6,则表明在0:00~6:59时间段内调度BUILD任务。重要- 该配置只限制任务调度时间段,不限任务执行时间段。即某任务在该时间内调度,会出现因执行时间较长,超出该时间段的情况。 
- 示例 - 配置0~6点和18~22点调度BUILD任务。 - SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`0,6;18,22`;- 执行上述SQL后,集群会在0:00~6:59和18:00~22:59时间段调度BUILD任务。 
配置BUILD调度优先级
BUILD调度是按照单表某个一级分区新增数据量排序下发任务,新增数据量大的分区先下发任务,根据下发时间的先后排序执行任务。当需要按业务紧急程度调度BUILD任务时,可以通过Hint或者SET ADB_CONFIG调整单表或多表BUILD调度的优先级。
- 仅3.1.5.0及以上版本的集群支持配置BUILD调度的优先级。 - 请在云原生数据仓库AnalyticDB MySQL控制台集群信息页面的配置信息区域,查看和升级内核版本。 
- Hint仅支持对单张表配置优先级,且调度优先级仅针对当前提交的任务生效。 
- SET ADB_CONFIG既支持对单张表配置优先级,也支持对多张表配置优先级,且优先级一直生效,直至再次配置该表优先级时,才会改变。
- 如果同时使用Hint和 - SET ADB_CONFIG为同一个表配置了不同的优先级,在当前提交的任务中,该表的BUILD调度优先级采纳Hint方式配置的优先级。
BUILD调度的优先级由参数task_priority控制,取值为整数,默认值为0。数值越大,下发调度的优先级越高。配置优先级后,前端节点在调度BUILD任务时会自动加上优先级。若task_priority取值小于0,则表示关闭该表自动调度BUILD任务,前端节点不再对该表发起BUILD任务。
配置方法如下:
- 通过Hint配置BUILD调度的优先级 - /*build_task_priority = <task_priority> */ BUILD TABLE <db_name>.<table_name>;- 例如,配置数据库 - adb_demo中表- test的BUILD调度优先级为30。- /*build_task_priority = 30 */ Build TABLE adb_demo.test;
- 通过Config配置BUILD调度的优先级 - 配置不同数据库中多张表的BUILD调度优先级: - SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `<db1_name>.<table1_name>.<task_priority>;<db2_name>.<table2_name>.<task_priority>`;说明- 不同的表使用英文分号(;)隔开。 - 例如,配置数据库 - adb_demo1中表- test1的BUILD调度优先级为30,数据库- adb_demo2中表- test2的BUILD调度优先级为10。- SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `adb_demo1.test1.30;adb_demo2.test2.10`;
- 配置同一数据库的所有表具有相同的BUILD调度优先级: - SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `<db1_name>.*.<task_priority>`;- 例如,配置数据库 - adb_demo1中所有表的BUILD调度优先级均为30。- SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `adb_demo1.*.30`;
- 配置同一数据库中某张表与其他表具有不同的BUILD调度优先级: - SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `<db1_name>.*.<task_priority>;<db1_name>.<table_name>.<task_priority>`;- 例如,配置数据库 - adb_demo1中- test1表的BUILD调度优先级为30,其他所有表的调度优先级为10。- SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `adb_demo1.*.10;adb_demo1.test1.30`;
 
您可以通过SHOW ADB_CONFIG查看表当前BUILD调度的优先级。
查看BUILD任务的状态
自动或手动触发BUILD任务后,执行如下SQL,查看最近3天BUILD任务的状态。
SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10;根据status的值,判断BUILD任务状态。状态说明如下。
| 
 | 说明 | 
| INIT | 任务初始化。 | 
| RUNNING | 任务运行中。 | 
| FINISH | 任务已完成。 | 
常见问题
为什么BUILD自动调度时间的配置没有生效?
原因:可能在配置参数时将反引号写成了正引号,导致参数解析错误。
解决方案:使用SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD命令配置调度参数时,需要将start和end参数用反引号(``)引起来。例如SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`0,6`;,表示在0:00~6:59时间段内调度BUILD任务。