
# HTAP标准版约束限制
#### 使用约束
- 由于数据从OLTP同步到OLAP是基于Binlog进行同步的，当OLTP侧有大事务，更新的数据量较大时，会导致OLAP数据时延较大。
- 使用HTAP查询数据时，需要注意数据库名、表名、视图名、用户名、角色名及字符串比较均大小写敏感，列名和分区名大小写不敏感。
- TaurusDB数据库中的无主键表同步到HTAP时使用的明细表**(Duplicate Key table)**。
- 主键值最大支持长度为128字节。
- 同步的数据库名称和表名称不支持中文字符。
- 为达到较好性能，可以使用如下方法对查询进行优化。
  - 减少无效的计算，去除SQL中不用的字段，避免用SELECT \*，简化SQL。
  
  - 去除无用的列，若结果使用到全部列，则相对行存无法达到优化效果。
   
- 同步的表，默认使用OLAP引擎，主键模型。
- 连接到HTAP标准版实例后，执行如下命令，可以查看从TaurusDB同步到HTAP标准版实例的数据库列表及同步状态。
  此命令会查询TaurusDB中Binlog的信息，会占用TaurusDB的每小时查询配额，不宜调用过于频繁，建议每分钟小于1次。
  ```
  show sync job;
  ```
  
 
- 在生产环境中不能使用sleep函数，因为sleep函数会阻塞后台执行线程。如果sleep函数执行的会话数量超过了BE节点的CPU核数，可能会导致整个系统不可用。
#### DDL同步约束
TaurusDB上执行的DDL，部分不支持同步到HTAP，可能会导致同步失败或数据不一致，使用时需注意。
具体支持同步的DDL和不支持同步的DDL如下：
#### 支持同步的DDL
表1支持同步的DDL相关操作 
| **DDL名称**       | **SQL样例**                                                                                                                                                                                                                                                                                                                                                                                                         |
|:---|:---|
| 创建表             | ``` CREATE TABLE tbl_name (c_id int not null, c_d_id integer not null,    primary key (c_id)); ``` 注意： 使用CREATE TABLE t1 LIKE t2的方式建表时，需保证语句中的表都在同一个同步任务中。                                                                                                                                                                          |
| 删除表             | ``` DROP TABLE tbl_name; ```                                                                                                                                                                                                                                                                                                                                                                                      |
| 重命名表            | ``` RENAME TABLE tbl_name to new_tbl_name; ALTER TABLE tbl_name RENAME TO new_tbl_name; ```                                                                                                                                                                                                                                                                                                                       |
| 清空表数据           | ``` TRUNCATE TABLE tbl_name; ```                                                                                                                                                                                                                                                                                                                                                                                  |
| 修改表注释           | ``` ALTER TABLE tbl_name COMMENT='test'; ```                                                                                                                                                                                                                                                                                                                                                                      |
| 添加列（非主键列）       | ``` ALTER TABLE tbl_name ADD c_varchar varchar(2000) AFTER c_tinytext; ```                                                                                                                                                                                                                                                                                                                                        |
| 删除列（非主键列）       | ``` ALTER TABLE tbl_name DROP c_vchar; ```                                                                                                                                                                                                                                                                                                                                                                        |
| 修改列类型、列顺序（非主键列） | ``` ALTER TABLE tbl_name CHANGE c_vchar c_vchar varchar(2000) default 'test' AFTER c_tinytext; ``` 注意： 不支持修改列名及默认值， DDL语句列名和默认值必须为旧值。 ``` ALTER TABLE tbl_name MODIFY c_vchar varchar(2100) default 'test' AFTER c_tinytext; ``` 注意： 不支持修改默认值，DDL语句默认值必须为旧值。 |
| 创建视图            | ``` CREATE VIEW view_name as select * from tbl_name; ```                                                                                                                                                                                                                                                                                                                                                          |
| 删除视图            | ``` DROP VIEW view_name; ```                                                                                                                                                                                                                                                                                                                                                                                      |
| 修改视图            | ``` ALTER VIEW view_name AS select * from tbl_name; ```                                                                                                                                                                                                                                                                                                                                                           |
   
#### 不支持同步的DDL
在创建的同步库中，支持同步表及数据，不支持同步数据库，函数，存储过程，触发器，分区（删除），主键（增加/删除/修改），事务，用户，角色，权限，事件等对象的操作。
不支持同步的分区表相关操作请参见[表2]。
 表2不支持同步的分区表相关操作 
| **DDL名称**     | **SQL样例**                                                                                                                 |
|:---|:---|
| 分析表分区         | ``` ALTER TABLE {db}.tp ANALYZE PARTITION p0; ```                                                                         |
| 检查表分区         | ``` ALTER TABLE {db}.tp CHECK PARTITION p0; ```                                                                           |
| 优化表分区         | ``` ALTER TABLE {db}.tp OPTIMIZE PARTITION p0; ```                                                                        |
| 重建表分区         | ``` ALTER TABLE {db}.tp REBUILD PARTITION p0; ```                                                                         |
| 修复表分区         | ``` ALTER TABLE {db}.tp REPAIR PARTITION p0; ```                                                                          |
| 创建数据库         | ``` CREATE DATABASE ddl_test_2; ```                                                                                       |
| 修改行格式         | ``` ALTER TABLE tbl_name ROW_FORMAT = row_format; ```                                                                     |
| 设置持久表统计信息     | ``` ALTER TABLE tbl_name STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20,STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE; ``` |
| 设置表的字符集       | ``` ALTER TABLE tbl_name CHARACTER SET = charset_name; ```                                                                |
| 转换表的字符集       | ``` ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name; ```                                                       |
| 执行空重建         | ``` ALTER TABLE tbl_name ENGINE=InnoDB; ```                                                                               |
| 增加表分区         | ``` ALTER TABLE {db}.tp ADD PARTITION (PARTITION p3 VALUES LESS THAN (2006) ); ```                                        |
| 设置表默认字符集和校对规则 | ``` ALTER TABLE tbl_name DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; ```                                      |
   
建表语句不能包含CHECK，表选项等。
在数据同步过程中，[表3]中的操作会导致HTAP中数据和TaurusDB 中数据不一致，应避免使用。
这些不支持同步的操作不会影响在HTAP实例上查询和分析数据。
 表3导致数据不一致的DDL操作说明 
| **DDL名称**                                                                                                                                                                                                                                                                                       | **SQL样例**                                                                                                       |
|:---|:---|
| 删除主键                                                                                                                                                                                                                                                                                            | ``` ALTER TABLE tbl_name DROP PRIMARY KEY; ```                                                                  |
| 增加主键                                                                                                                                                                                                                                                                                            | ``` ALTER TABLE {db}.t1 ADD PRIMARY KEY (id); ```                                                               |
| 增加删除主键                                                                                                                                                                                                                                                                                          | ``` ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column); ```                                        |
| 主键允许为NULL                                                                                                                                                                                                                                                                                       | ``` ALTER TABLE tbl_name MODIFY COLUMN key_column_name data_type; ```                                           |
| 修改主键类型                                                                                                                                                                                                                                                                                          | ``` ALTER TABLE tbl_name MODIFY COLUMN key_column_name data_type not null; ```                                  |
| 增加列 说明： 支持一般的列增加，但不支持缺省值为如下取值的场景： 包含HTAP中不存在的函数，字符串，标识符        | ``` ALTER TABLE tbl_name ADD COLUMN column_name column_definition c VARCHAR(10) DEFAULT (CONCAT('1', '2')); ``` |
| 设置列的缺省值 说明： 支持缺省值的设置，但不支持缺省值为如下取值的场景： 包含HTAP中不存在的函数，字符串，标识符 | ``` ALTER TABLE tbl_name ALTER COLUMN col SET DEFAULT literal; ```                                              |
| 修改列不允许为NULL                                                                                                                                                                                                                                                                                     | ``` ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL; ```                                      |
| 同时修改列名和类型                                                                                                                                                                                                                                                                                       | ``` ALTER TABLE t1 CHANGE b b1 VARCHAR(100); ```                                                                |
| 修改列名                                                                                                                                                                                                                                                                                            | ``` ALTER TABLE t1 RENAME COLUMN a TO b; ```                                                                    |
| 增加存储型衍生列                                                                                                                                                                                                                                                                                        | ``` ALTER TABLE {db}.t1 ADD COLUMN (st2 INT GENERATED ALWAYS AS (c2 + 2)STORED), ALGORITHM=COPY; ```            |
| 增加虚拟型衍生列                                                                                                                                                                                                                                                                                        | ``` ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1)VIRTUAL); ```                                 |
| 删除表分区                                                                                                                                                                                                                                                                                           | ``` ALTER TABLE {db}.tp DROP PARTITION p4; ```                                                                  |
| 丢弃表分区                                                                                                                                                                                                                                                                                           | ``` ALTER TABLE {db}.tp DISCARD PARTITION p2 TABLESPACE; ```                                                    |
| 导入表分区                                                                                                                                                                                                                                                                                           | ``` ALTER TABLE {db}.tp IMPORT PARTITION p2 TABLESPACE; ```                                                     |
| 截断表分区                                                                                                                                                                                                                                                                                           | ``` ALTER TABLE {db}.tp TRUNCATE PARTITION p2; ```                                                              |
| 截断分区表                                                                                                                                                                                                                                                                                           | ``` TRUNCATE {db}.tp; ```                                                                                       |
| 联合表分区                                                                                                                                                                                                                                                                                           | ``` ALTER TABLE {db}.tp_hash COALESCE PARTITION 2; ```                                                          |
| 重新组织表分区                                                                                                                                                                                                                                                                                         | ``` ALTER TABLE {db}.tp REORGANIZE PARTITION p0,p1,p2,p3 INTO ( ... ); ```                                      |
| 交换表分区                                                                                                                                                                                                                                                                                           | ``` ALTER TABLE {db}.tp EXCHANGE PARTITION p0 WITH TABLE {db}.tp2; ```                                          |
| 删除表分区                                                                                                                                                                                                                                                                                           | ``` ALTER TABLE {db}.tp REMOVE PARTITIONING; ```                                                                |
| 使用REPLACE子句                                                                                                                                                                                                                                                                                     | ``` CREATE OR REPLACE TABLE; ```                                                                                |
| 修改视图名称                                                                                                                                                                                                                                                                                          | ``` RENAME TABLE old_view_name TO new_view_name; ```                                                            |
   
表4同步过程中已忽略的DDL（评估无影响） 
| DDL名称       | SQL样例                                                                                                                                   |
|:---|:---|
| 添加索引        | ``` ALTER TABLE tbl_name ADD INDEX name; ```                                                                                            |
| 重命名索引       | ``` ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name; ```                                                             |
| 删除索引        | ``` DROP INDEX name ON table; ```                                                                                                       |
| 增加全文索引      | ``` CREATE FULLTEXT INDEX name ON table(column); ```                                                                                    |
| 增加空间索引      | ``` ALTER TABLE geom ADD SPATIAL INDEX(g); ```                                                                                          |
| 修改索引类型      | ``` ALTER TABLE tbl_name DROP INDEX i1, ADD INDEX i1(key_part,...) USING BTREE; ```                                                     |
| 添加索引约束      | ``` ALTER TABLE tbl_name ADD CONSTRAINT UNIQUE USING BTREE (column); ALTER TABLE tbl_name ADD CONSTRAINT UNIQUE USING HASH(column); ``` |
| 优化表         | ``` OPTIMIZE TABLE tbl_name; ```                                                                                                        |
| 使用"强制"选项重建表 | ``` ALTER TABLE tbl_name FORCE; ```                                                                                                     |
| 重命名表空间      | ``` ALTER TABLESPACE tablespace_name RENAME TO new_tablespace_name; ```                                                                 |
| 增加外键        | ``` ALTER TABLE tbl1 ADD CONSTRAINT fk_name FOREIGN KEY index (col1)REFERENCES tbl2(col2) referential_actions; ```                      |
| 删除外键        | ``` ALTER TABLE tbl DROP FOREIGN KEY fk_name; ```                                                                                       |
   
#### 视图同步约束
- 默认不同步视图，sync_view参数设置为true时会同步数据和视图，设置为only_sync_view仅同步视图，only_sync_view只有非实例级同步才支持。
- 数据同步的任务必须在只同步视图任务前创建。
- 同一个数据库仅支持一个同步任务开启视图同步。
- 选择同步视图时，源库名称需和目标库名称保持一致。
- 不支持部分视图相关的DDL同步，例如通过**rename table**语句修改视图名。
- 跨库视图可能由于依赖的库未同步而失败。
- 若视图中使用了HTAP不支持的函数或语法，则同步失败。
- 同步失败的视图可以在问题解决后，直接在HTAP上手工创建。
- 当视图同步失败时会有告警和错误信息上报，错误信息可以通过连接HTAP执行show sync job命令查看SyncErrViews(同步失败的视图)和SyncErrMsg(具体错误信息)，错误信息和告警可以通过执行命令清除：alter sync 同步任务名称 setting "SyncErrViewMsg" = "", "SyncErrViews"="";
- 视图同步失败不影响表数据同步。
- TaurusDB内核版本2.0.57.240900之后的版本才支持。内核版本的查询方法请参见[如何查看云数据库 TaurusDB实例的版本号](https://support.huaweicloud.com/taurusdb_faq/taurusdb_faq_0141.html)。
 
