SQL语法支持
计算节点语法特殊功能
默认分片规则建表
在使用关系集群数据库时,需要先将表的分片规则信息配置好之后才能创建表。实际使用过程中,用户可能对关系集群数据库及分片规则不了解,这就需要一种能直接过渡到HHDB Server的方案,该方案能根据逻辑库关联的分片节点数量自动对表生成分片规则,称为默认分片规则。
使用前提: 逻辑库已设置分片节点。为逻辑库设置分片节点的方法如下:登录关系集群数据库平台,选择"配置"->"逻辑库",给逻辑库设置默认分片节点,然后点动态加载。
功能说明: 为逻辑库设置默认分片节点后,登录计算节点可以直接建表,计算节点将根据分片节点的数量为创建的表自动设置分片规则信息。具体的分片规则如下:
如果逻辑库只设置了一个分片节点,则计算节点对创建的表不做分片处理,在计算节点中将此类表称为创建垂直分片表。
如果逻辑库设置了多个分片节点,则计算节点对创建的表进行水平分片,分片算法是对每行数据分片字段的值进行AUTO_CRC32从而确定该行数据应被存储在哪个分片节点中,分片字段选取顺序:主键字段 -> 唯一键字段 ->第一个整型字段(BIGINT、INT、MEDIUMINT、SMALLINT、TINYINT) ->没有整型字段时取字符串类型字段(CHAR、VARCHAR),以上类型全部没有时默认随机选择一个字段作为分片字段。
注意:
此功能仅推荐在初次接触HHDB Server的时候使用,正式交付以及上线不推荐,需要根据实际业务场景做分片。
若后期对逻辑库默认节点进行更改,对更改之前创建的表无影响,只对后续新增的表生效。
计算节点中对表分为三类:全局表、水平分片表、垂直分片表。
- 全局表:在计算节点中如果一个表被定义为全局表,则该表存储在逻辑库下的所有分片节点中,且每个分片节点中该表的数据都是完全一致的全量数据。
- 水平分片表:在计算节点中如果一个表被定义为水平分片表,则该表存储在逻辑库下的所有分片节点中,且每个分片节点中该表的数据都只是部分行数据,所有分片节点中该表的数据合在一起才是该表的全量数据。
- 垂直分片表:在计算节点中如果一个表被定义为垂直分片表,则该表仅存储在逻辑库下的一个分片节点中(其余分片节点无该表信息),且该分片节点中存储该表的全量数据。计算节点中垂直分片表与一般垂直分片表概念不同,不是按列进行分片存储的。
例子:
假设"test001"逻辑库配置了一个默认分片节点,则"test01"表为垂直分片表;假设"test002"逻辑库配置了两个默认分片节点,则"test02"表为水平分片表。
mysql> use TEST001;
Database changedmysql> create table test01(id not null auto_increment primary key,a char(8),b decimal(4,2),c int);
mysql> use TEST002;Database changed
mysql> create table test02(id not null auto_increment primary key,a char(8),b decimal(4,2),c int);
已有分片规则建表
使用前提: 在管理平台上已创建了分片规则,并进行了动态加载。添加分片规则请参考管理平台文档。
功能说明: 根据管理平台已添加好的分片规则,在计算节点服务端利用特殊语句直接建表,无需再配置表分片信息。利用已有分片规则所建的表,删除表后,管理平台相关表配置信息会同步被删除。
利用服务端口命令查看分片规则的functionid | functionname| functiontype| ruleid | rulename等信息,根据相关字段信息创建表。
mysql> show hotdb functions;
+-------------+---------------------+---------------+----------------+
| function_id | function_name | function_type | auto_generated |
+-------------+---------------------+---------------+----------------+
| 1 | AUTO_GENERATE_CRC32 | AUTO_CRC2 | 1 |
| 2 | AUTO_CRC32_4 | AUTO_CRC32 | 0 |
| 3 | AUTO_CRC32_1 | AUTO_CRC32 | 0 |
| 26 | AUTO_GENERATE_MOD | AUTO_MOD | 1 |
| 31 | 29__MATCH1 | MATCH | 0 |
| 33 | 32_SIMPLE_MOD | SIMPLE_MOD | 0 |
| 36 | 36_SIMPLE_MOD | SIMPLE_MOD | 0 |
| 37 | 37_CRC32_MOD | CRC32_MOD | 0 |
+-------------+---------------------+---------------+----------------+
8 rows in set (0.01 sec)mysql> show hotdb rules;
+---------+--------------------------------------------------+-------------+-------------+----------------+
| rule_id | rule_name | rule_column | function_id | auto_generated |
+---------+--------------------------------------------------+-------------+-------------+----------------+
| 4 | hotdb-cloud_555f9d00-27c3-4eaa-860c-309312672908 | id | 3 | 0 |
| 12 | hotdb-cloud_8b7d9b8d-f711-476c-aa33-a4e2af184ab5 | adnid | 2 | 0 |
| 13 | hotdb-cloud_7f8fff18-6016-47f1-ab0a-1912f5b75523 | adnid | 2 | 0 |
| 21 | AUTO_GENERATE_3_JOIN_A_JWY | ID | 1 | 1 |
| 50 | AUTO_GENERATE_9_FT_ADDR | ID | 26 | 1 |
| 64 | AUTO_GENERATE_23_S03 | A | 1 | 1 |
+---------+--------------------------------------------------+-------------+-------------+----------------+
6 rows in set (0.01 sec)
水平分片表
水平分片表是指将表的数据按行以分片列的分片规则进行拆分,拆分后的分片数据存储不同的数据节点。数据量大的表适合定义为水平分片表。
水平分片表创建语法如下:
CREATE TABLE [IF NOT EXISTS] tbl_name SHARD BY {functionid | functionname} 'functionid | functionname' USING COLUMN 'shardcolumnname' (table define...)
CREATE TABLE [IF NOT EXISTS] tbl_name SHARD BY {functiontype} 'functiontype' USING COLUMN 'shardcolumnname' on datanode 'datanodeid' (table define...)
同时也可以将SHARD BY 之后的关键字放置表定义之后(垂直分片表、全局表亦同),示例:
CREATE TABLE [IF NOT EXISTS] tbl_name (table define...) SHARD BY {functiontype} 'functiontype' USING COLUMN 'shardcolumnname' on datanode 'datanodeid'(.....);
水平分片表创建语法说明:
- SHARD BY {FUNCTIONID | FUNCTIONNAME | FUNCTIONTYPE} - 指分片函数ID、分片函数名称、分片函数类型的关键字。
- functionid_value | functionname_value | functiontype_value - 指具体的分片函数ID、分片函数名称、分片函数类型的值。
- USING COLUMN - 指分片列的关键字。
- shardcolumnname - 指具体的分片列的列名。
- ON DATANODE - 指数据节点的关键字。
- datanodeid - 指具体的数据节点的值,多个不连续的值可以用逗号间隔,多个连续的值可以使用区间形式指定,如:'1,3,4,5-10,12-40'。
登录服务端,切换逻辑库,输入建表语句并执行。
mysql> use fun_zy
Database changedmysql> CREATE TABLE match1_tb shard by functionname 'test_match1' using column 'aname' (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, adnid INT DEFAULT NULL, aname VARCHAR(32) DEFAULT '', adept VARCHAR(40), adate datetime DEFAULT NULL)ENGINE =INNODB;
Query OK, 0 rows affected (0.09 sec)
执行成功,管理平台会显示该表为已定义状态:
对于此语法规则建表,需要注意以下几点:
- functionid | functionname | functiontype - 为具体指定的分片函数ID、分片函数名称、分片函数类型
- shardcolumnname - 为指定的分片字段
- datanodeid - 节点ID,可以逗号间隔,且支持区间形式指定,如:'1,3,4,5-10,12-40',节点ID可登录关系集群数据库可视化管理平台页面,选择"配置"->"节点管理"查看,也可以登录计算节点服务端口使用命令执行show hotdb datanodes;查看:
mysql> show hotdb datanodes;
+-------------+---------------+---------------+
| datanode_id | datanode_name | datanode_type |
+-------------+---------------+---------------+
| 9 | dn_01 | 0 |
| 11 | dn_02 | 0 |
| 13 | dn_03 | 0 |
| 15 | dn_04 | 0 |
| 19 | dn_failover | 0 |
| 20 | dn_rmb_01 | 0 |
+-------------+---------------+---------------+
6 rows in set (0.00 sec)
- functiontype 只支持 auto_crc32/auto_mod, 若使用了其他类型会提示:ERROR:The fucntiontype can only be auto_crc32/auto_mod.
mysql> create table ft_match shard by functiontype 'match' using column 'id' on datanode '11,13'(id int(10) primary key, a char(20) not null);
ERROR 10070 (HY000): The functiontype can only by auto_crc32/auto_mode.
- 使用functionid | functionname建表时,当指定的function信息关联的function_type 是auto_crc32/auto_mod 时,需要指定on datanode 'datanodes' ,否则会提示:The function must be specified datanodes。 如果是其他类型,则无需指定。
mysql> create table mod_ft shard by functionid '15' using column 'id'(id int(10) primary key, a char(20) not null);
ERROR 10090 (HY000): The function must be specified datanodes.mysql> create table testsa shard by functionid '3' using column 'id'(id int,a int);
Query OK, 0 rows affected, 1 warning (0.10 sec)mysql> CREATE TABLE match_tb shard by functionname 'test_match1' using column 'ananme' on datanode '1,2'(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, adnid INT DEFAULT NULL, aname VARCHAR(32) DEFAULT '', adept VARCHAR(40), adate datetime DEFAULT NULL)ENGINE =INNODB;
ERROR 10090 (HY000): This rule doesn't need to specify a datanodes;
表结构类似的表可以使用相同的分片规则,使用如下语法可直接引用分片规则创建水平分片表:
CREATE TABLE [IF NOT EXISTS] tbl_name SHARD BY {ruleid | rulename} 'ruleidrulename' [on datanode 'datanodes'] (......
登录计算节点服务端口使用命令,show hotdb rules;和show hotdb functions;可以看到与之分片函数关联的分片规则:
mysql> show hotdb rules;
+---------+---------------------------+-------------+-------------+----------------+
| rule_id | rule_name | rule_column | function_id | auto_generated |
+---------+---------------------------+-------------+-------------+----------------+
| 17 | AUTO_GENERATE_3_ROUTE1_TB | A | 1 | 1 |
+---------+---------------------------+-------------+-------------+----------------+
21 rows in set (0.01 sec)mysql> show hotdb functions;
+-------------+---------------+--------------+----------------+
| function_id | function_name | function_typ | auto_generated |
+-------------+---------------+--------------+----------------+
| 1 | test_route1 | ROUTE | 1 |
+-------------+---------------+--------------+----------------+
13 rows in set (0.01 sec)
用户可用ruleid/rulename来直接创建表:
mysql> CREATE TABLE rt_table shard by ruleid '17'(id int not null auto_increment primary key,a int(10),b decimanl(5,2),c decimal(5,2),d date,e time(6),f timestamp(6) DEFAULT CURRENT_TIMESTAMP(6),g datetime(6) DEFAULT CURRENT_TIMESTAMP(6),h year,I char(20) charcter set utf8,j varchar(30) character set utf8mb4,k char(20) character set gbk,l text character set latin1, m enum('','null','1','2','3'),n set('','null','1','2','3'));Query OK, 0 rows affected (0.07 sec)
对于此语法规则建表,需要注意以下几点:
- 当指定的rule关联的function_type是auto_crc32/auto_mod 时,需要指定on datanode 'datanodes';如果是其他类型,则无需指定datanode。
mysql> show hotdb rules
+---------+---------------------------+-------------+-------------+----------------+
| rule_id | rule_name | rule_column | function_id | auto_generated |
+---------+---------------------------+-------------+-------------+----------------+
| 17 | AUTO_GENERATE_3_ROUTE1_TB | A | 1 | 1 |
+---------+---------------------------+-------------+-------------+----------------+
21 rows in set (0.01 sec)mysql> show hotdb functions;
+-------------+---------------+---------------+----------------+
| function_id | function_name | function_type | auto_generated |
+-------------+---------------+---------------+----------------+
| 1 | test_route1 | ROUTE | 1 |
+-------------+---------------+---------------+----------------+
13 rows in set (0.01 sec)mysql> CREATE TABLE route2_rptb1 shard by rulename 'AUTO_GENERATE_3_ROUTE1_TB' on datanode '9,11,13'(id int not null auto_increment primary key,a int(10),b decimanl(5,2),c decimal(5,2),d date,e time(6),f timestamp(6) DEFAULT CURRENT_TIMESTAMP(6),g datetime(6) DEFAULT CURRENT_TIMESTAMP(6),h year,i char(20) charcter set utf8,j varchar(30) character set utf8mb4,k char(20) character set gbk,l text character set latin1, m enum('','null','1','2','3'),n set('','null','1','2','3'));ERROR 10090 (HY000): This rule doesn't need to specify a datanodes;
当指定的rule关联的function_type是auto_crc32/auto_mod 时, 指定的datanode 个数与参数不符时,则会提示:ERROR:The total number of datanodes must be XXX(XXX为实际ruleid 关联的 function info的 column_value值):
mysql> CREATE TABLE auto_c shard by ruleid '63' on datanode '9'(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, adnid INT DEFAULT NULL, aname VARCHAR(32) DEFAULT '',adept VARCHAR(40), adate datetime DEFAULT NULL)ENGINE=INNODB;
ERROR 10090 (HY000): The total number of datanodes must be 2mysql> CREATE TABLE auto_c shard by ruleid '63' on datanode '9,15'(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, adnid INT DEFAULT NULL, aname VARCHAR(32) DEFAULT '',adept VARCHAR(40), adate datetime DEFAULT NULL)ENGINE=INNODB;
Query OK, 0 rows affected (0.13 sec)
垂直分片表
垂直分片表是一个全局唯一且不分片的全量表,垂直分片表的全量数据仅存储在一个数据节点。
创建垂直分片表语法:
CREATE TABLE [IF NOT EXISTS] tbl_name SHARD BY vertical on datanode 'datanodeid'(...)
语法说明:
- SHARD BY VERTICAL是垂直分片关键字
- ON DATANODE 'datanodeid'只能指定一个数据节点,不指定数据节点或指定多个数据节点都会报错。
mysql> CREATE TABLE tb_vertical shard by vertical on datanode'9'( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, adnid INT DEFAULT NULL, aname VARCAHR(32) DEFAULT '', adept VARCHAR(40), adate DATETIME DEFAULT NULL)ENGINE=INNODB;
Query OK, 0 rows affected(0.07 sec)
未指定datanode:
mysql> CREATE TABLE tb1_vertical shard by vertical( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, adnid INT DEFAULT NULL, aname VARCAHR(32) DEFAULT '', adept VARCHAR(40), adate DATETIME DEFAULT NULL)ENGINE=INNODB;
ERROR 10090 (HY000): This table has to specify a datanodes.
指定多个节点:
mysql> CREATE TABLE tb1_vertical shard by vertical on datanode'9,11,13'( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, adnid INT DEFAULT NULL, aname VARCAHR(32) DEFAULT '', adept VARCHAR(40), adate DATETIME DEFAULT NULL)ENGINE=INNODB;
ERROR 10090 (HY000): Can only specify one datanodes.
全局表
全局表是指在该逻辑库下的所有数据节点中都存储的表,所有数据节点中该表的表结构和数据都完全一致。数据量小、不会频繁DML、经常与其他表发生JOIN 操作的表适合作为全局表。
创建全局表语法如下:
CREATE TABLE [IF NOT EXISTS] tbl_name SHARD BY global [on datanode 'datanodeid'](...)
语法说明:
- SHARD BY GLOBAL是全局表关键字。
- [ON DATANODE 'datanodeid']是指定数据节点的语法。不指定datanodeid则默认按逻辑库默认分片节点+逻辑库下所有表关联节点的并集建表;指定则必须包括全部数据节点,指定部分数据节点会报错。
mysql> CREATE TABLE tb_quan shard by global(id int not null auto_increment primary key,a int(10),b decimanl(5,2),c decimal(5,2),d date,e time(6),f timestamp(6) DEFAULT CURRENT_TIMESTAMP(6),g datetime(6) DEFAULT CURRENT_TIMESTAMP(6),h year,I char(20) null,j varchar(30),k blob,l text, m enum('','null','1','2','3'),n set('','null','1','2','3'));
Query OK, 0 rows affected (0.07 sec)
语法规则里的global是创建全局表的标志,'datanodeid'为节点ID,可以逗号间隔,且支持区间形式指定,如:'1,3,4,5-10,12-40',使用该语法创建分片规则的全局表,该表的节点应该包括逻辑库下所有节点。
如果逻辑库下没有默认分片节点也没有已经定义的表,则使用特殊语法进行全局表的创建时,需要指定全局表分布的节点:
mysql> CREATE TABLE tb2_quan shard by global(id int not null auto_increment primary key,a int(10),b decimanl(5,2),c decimal(5,2),d date,e time(6),f timestamp(6) DEFAULT CURRENT_TIMESTAMP(6),g datetime(6) DEFAULT CURRENT_TIMESTAMP(6),h year,i char(20) null,j varchar(30),k blob,l text, m enum('','null','1','2','3'),n set('','null','1','2','3'));
ERROR 10090 (HY000): This table has to specify a datanodes.
如果逻辑库下存在已经定义的表,则可以不指定节点或指定节点的时候,需要为该逻辑库下包含节点的最大非重复个数(即所有表所选节点的并集),否则指定部分数据节点会提示建表错误:
mysql> CREATE TABLE tb1_quan shard by global on datanodes'9,11'(id int not null auto_increment primary key,a int(10),b decimanl(5,2),c decimal(5,2),d date,e time(6),f timestamp(6) DEFAULT CURRENT_TIMESTAMP(6),g datetime(6) DEFAULT CURRENT_TIMESTAMP(6),h year,i char(20) null,j varchar(30),k blob,l text, m enum('','null','1','2','3'),n set('','null','1','2','3'));
ERROR 10090 (HY000): The specified datanodes must cover all datanodes of the logical database.
使用已有分片规则建表相关命令
此小节介绍的命令登录到计算节点服务端口、管理端口均可执行。
- show hotdb datanodes -- 显示当前可用的节点:
此命令用于查看配置库中hotdb_datanodes表,语法:
mysql> show hotdb datanodes [LIKE 'pattern' | WHERE expr];
命令包含参数及其说明:
参数 | 说明 | 类型 |
---|---|---|
pattern | 可选,模糊查询表达式,匹配datanode_name字段 | STRING |
expr | 可选,where条件表达式 | STRING |
结果包含字段及其说明:
列名 | 说明 | 值类型/范围 |
---|---|---|
datanode_id | 节点ID | INTEGER |
datanode_name | 节点名称 | STRING |
datanode_type | 0:主备;1:MGR | INTEGER |
例子:
mysql> show hotdb datanodes;
+-------------+---------------+---------------+
| datanode_id | datanode_name | datanode_type |
+-------------|---------------|---------------+
| 1 | dn_01 | 0 |
| 2 | dn_02 | 0 |
| 4 | dn_04 | 0 |
| 101 | dn_101 | 0 |
| 127 | dn_03 | 0 |
| 186 | dn_199 | 0 |
| 203 | dn_19 | 0 |
+-------------+---------------+---------------+
例子:
mysql> show hotdb datanodes like 'dn_0%';
+-------------+---------------+---------------+
| datanode_id | datanode_name | datanode_type |
+-------------+---------------+---------------+
| 1 | dn_01 | 0 |
| 2 | dn_02 | 0 |
| 4 | dn_04 | 0 |
| 127 | dn_03 | 0 |
+-------------+---------------+---------------+
- show hotdb functions -- 显示当前可用的分片函数:
此命令用于查看配置库中hotdb_function表,语法:
mysql> show hotdb functions;
命令包含参数及其说明:
参数 | 说明 | 类型 |
---|---|---|
pattern | 可选,模糊查询表达式,匹配function_name字段 | STRING |
expr | 可选,where条件表达式 | STRING |
结果包含字段及其说明:
列名 | 说明 | 值类型/范围 |
---|---|---|
function_id | 分片函数ID | INTEGER |
function_name | 分片函数名称 | STRING |
function_type | 分片类型 | STRING |
auto_generated | 是否为计算节点自动生成的配置(1:自动生成,其他:非自动生成) | INTEGER |
例子:
mysql> show hotdb functions;
+-------------+---------------+---------------+----------------+
| function_id | function_name | function_type | auto_generated |
+-------------+---------------+---------------+----------------+
...省略更多...
| 40 | AUTO_CRC32_8 | AUTO_CRC32 | 0 |
| 41 | th_fun_range | RANGE | 0 |
| 42 | AUTO_MOD_5 | AUTO_MOD | 0 |
| 43 | 43_RANGE | RANGE | 0 |
| 44 | AUTO_CRC32_15 | AUTO_CRC32 | 0 |
| 45 | AUTO_CRC32_5 | AUTO_CRC32 | 0 |
| 46 | yds_RANGE | RANGE | 0 |
| 47 | AUTO_CRC32_11 | AUTO_CRC32 | 0 |
+-------------+---------------+---------------+----------------+
例子:
mysql> show hotdb functions like '%range%';
+-------------+---------------+---------------+----------------+
| function_id | function_name | function_type | auto_generated |
+-------------+---------------+---------------+----------------+
| 41 | th_fun_range | RANGE | 0 |
| 43 | 43_RANGE | RANGE | 0 |
| 46 | yds_RANGE | RANGE | 0 |
+-------------+---------------+---------------+----------------+
3 rows in set (0.00 sec)mysql> show hotdb functions where function_name like '%range%';
+-------------+---------------+---------------+----------------+
| function_id | function_name | function_type | auto_generated |
+-------------+---------------+---------------+----------------+
| 41 | th_fun_range | RANGE | 0 |
| 43 | 43_RANGE | RANGE | 0 |
| 46 | yds_RANGE | RANGE | 0 |
+-------------+---------------+---------------+----------------+
3 rows in set (0.00 sec)
- show hotdb function infos - 显示当前可用的分片函数信息:
此命令用于查看配置库中hotdb_function_info 表,语法:
mysql> show hotdb function infos [WHERE expr];
命令包含参数及其说明:
参数 | 说明 | 类型 |
---|---|---|
expr | 可选,where条件表达式 | STRING |
结果包含字段及其说明:
列名 | 说明 | 值类型/范围 |
---|---|---|
function_id | 分片函数ID | INTEGER |
column_value | 分片字段的值 | STRING |
datanode_id | 数据节点id | INTEGER |
例子:
mysql> show hotdb function infos;
+-------------+--------------+-------------+
| function_id | column_value | datanode_id |
+-------------+--------------+-------------+
| 2 | 4 | 0 |
| 3 | 1 | 0 |
| 4 | 2 | 0 |
| 31 | '' | 4 |
| 31 | 1 | 1 |
| 31 | 2 | 2 |
| 31 | null | 127 |
| 33 | 0:1 | 1 |
| 33 | 10:10 | 191 |
| 33 | 11:11 | 186 |
| 33 | 12 | 0 |
| 33 | 2:3 | 2 |
...省略更多...
例子:
mysql> show hotdb function infos where function_id=38;
+-------------+--------------+-------------+
| function_id | column_value | datanode_id |
+-------------+--------------+-------------+
| 38 | 10:12 | 1 |
| 38 | 1:2 | 1 |
| 38 | 20 | 0 |
| 38 | 4:8 | 1 |
+-------------+--------------+-------------+
4 rows in set (0.00 sec)
- show hotdb rules -- 显示当前可用的分片规则:
此命令用于查看配置库中hotdb_rule 表,语法:
mysql> show hotdb rules [LIKE 'pattern' | WHERE expr];
命令包含参数及其说明:
参数 | 说明 | 类型 |
---|---|---|
pattern | 可选,模糊查询表达式,匹配rule_name字段 | STRING |
expr | 可选,where条件表达式 | STRING |
结果包含字段及其说明:
列名 | 说明 | 值类型/范围 |
---|---|---|
rule_id | 分片规则ID | INTEGER |
rule_name | 分片规则名称 | STRING |
rule_column | 分片字段名称 | STRING |
function_id | 分片类型ID | INTEGER |
auto_generated | 是否为计算节点自动生成的配置(1:自动生成,其他:非自动生成) | INTEGER |
例子:
mysql> show hotdb rules;
+---------+--------------------------------------------------+-------------+-------------+----------------+
| rule_id | rule_name | rule_column | function_id | auto_generated |
+---------+--------------------------------------------------+-------------+-------------+----------------+
| 21 | AUTO_GENERATE_3_JOIN_A_JWY | ID | 1 | 1 |
| 22 | hotdb-cloud_0374c02e-58a7-4263-9b80-9c5b46fb42af | id | 5 | 0 |
| 25 | hotdb-cloud_f3979d19-93cb-4925-8dee-e4fbf8803c7c | id | 5 | 0 |
| 32 | hotdb-cloud_6ccd2f69-cf53-4e81-ab3d-61345134fb7a | id | 5 | 0 |
| 33 | hotdb-cloud_b5bc16e6-3481-40ed-83ff-e81d488e47a5 | ID | 4 | 0 |
...省略更多...
例子:
mysql> show hotdb rules like '%auto%';
+---------+----------------------------+-------------+-------------+----------------+
| rule_id | rule_name | rule_column | function_id | auto_generated |
+---------+----------------------------+-------------+-------------+----------------+
| 21 | AUTO_GENERATE_3_JOIN_A_JWY | ID | 1 | 1 |
| 50 | AUTO_GENERATE_9_FT_ADDR | ID | 26 | 1 |
| 64 | AUTO_GENERATE_23_S03 | A | 1 | 1 |
| 65 | AUTO_GENERATE_23_S04 | B | 1 | 1 |
...省略更多...mysql> show hotdb rules where rule_name like '%auto%';
+---------+----------------------------+-------------+-------------+----------------+
| rule_id | rule_name | rule_column | function_id | auto_generated |
+---------+----------------------------+-------------+-------------+----------------+
| 21 | AUTO_GENERATE_3_JOIN_A_JWY | ID | 1 | 1 |
| 50 | AUTO_GENERATE_9_FT_ADDR | ID | 26 | 1 |
| 64 | AUTO_GENERATE_23_S03 | A | 1 | 1 |
| 65 | AUTO_GENERATE_23_S04 | B | 1 | 1 |
...省略更多...
暂时保留被删除的表数据
考虑到DROP TABLE、TRUNCATE TABLE 、DELETE TABLE 不带WHERE条件的语句在实际生产或线上环境执行时的较高风险,计算节点支持保留被DROP的表一段时间后再删除。其中,DELETE TABLE 不带WHERE条件的场景仅支持语句在自动提交的情况下可保留数据,事务内的操作暂无法保留数据。
可通过修改server.xml中的dropTableRetentionTime参数或在管理平台配置菜单下的计算节点参数配置中添加参数"被删除表保留时长(小时)"。
<property name="dropTableRetentionTime">0</property><!--被删除表保留时长,默认为0,不保留-->
dropTableRetentionTime参数默认为0,表示不保留被删除的表数据,例如DROP TABLE立即会删除表无法瞬间恢复;dropTableRetentionTime大于0时,单位以小时计算,保留被删除的表数据到设置时长,超过设置时长后自动删除被保留的表。
计算节点暂不提供还原被删除的表的直接命令,但是用户可以在存储节点通过RENAME的方式还原被删除的表。因直接在存储节点上进行操作,故此操作存在风险,请谨慎使用。风险包括还原后数据路由可能与实际路由不同、原有的外健和触发器被删除、父子表关系不存在等,详细风险参考还原注意事项。
当该功能开启时,以dropTableRetentionTime=24为例,将保留被DROP的表,24小时后删除被保留的表。若想要还原被DROP的表,首先查询计算节点配置库中的hotdb_dropped_table_log,查看被DROP的表的映射关系。例如:
mysql> select * from hotdb_dropped_table_log;
+------------+-----------+---------------------+------------------------------+
| table_name | datanodes | drop_time | renamed_table_name |
+------------+-----------+---------------------+------------------------------+
| TABLE25 | 11 | 2019-03-26 17:18:07 | HOTDB_TEMP_33_20190326171807 |
| TABLE30 | 11 | 2019-03-26 17:18:13 | HOTDB_TEMP_34_20190326171812 |
+------------+-----------+---------------------+------------------------------+
2 rows in set (0.00 sec)
其中,renamed_table_name即为保留被DROP的表的临时表,可以通过RENAME该临时表来还原数据。
RENAME TABLE tbl_name TO new_tbl_name
还原操作可以在对应的存储节点下分别RENAME临时表,也可以直接在计算节点下通过HINT语句RENAME临时表。
还原注意事项
还原时需要注意以下要点:
- 通过管理平台配置后创建的表,可以直接RENAME成原表名。通过自动建表功能创建的表,DROP TABLE时不保留表配置,因此不能直接RENAME成原表名。
- 还原自动建表创建的表可以通过在管理平台上添加配置后RENAME成该表表名。也就是说,还原操作允许通过RENAME表名,将被删除的表还原成任何在管理平台上已配置但未定义的表。
- 若被删除的表引用的分片规则发生修改,或配置了不同的分片规则,还原后,数据不会按照新的分片规则自动迁移,即实际数据路由将与配置的路由不匹配。建议按照原来的分片规则配置还原,以防出现数据丢失或不一致的问题。
- 若被删除的表上存在外键或触发器,DROP TABLE时将会在临时表中删除外键与触发器。有外键约束的表因外键被删除,还原后没有相关约束,以及有可能表内数据已经不再满足相关约束。
- RENAME临时表的还原操作需要动态加载(reload)后才会生效。当前计算节点的动态加载功能在配置库有变更的情况下才生效,所以若除RENAME操作,配置库无其他变更,需要进行一些变更后,执行动态加载才会生效,生效后可查看到还原的表。
删除的表不进入表回收站
为方便用户在底层也能实现对表回收站的操作,以及可以不通过表回收站直接删除表数据,计算节点支持使用PURGE关键字的相关语句,使删除的表不进入表回收站。
- 删除表的PURGE语句
语法格式如下:
DROP TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE] [PURGE];
语法示例:
mysql> drop table test_table1 purge;
-- 删除表test_table1且不进入表回收站
语法说明:
删除表语句后缀增加PURGE后,此表在执行DROP语句后,已删除的数据不会进入到表回收站,优先级高于:开启表回收站(dropTableRetentionTime)
注意事项:
- 允许写多个表名但不允许使用表别名,多个表之间用英文的逗号隔开。但不允许使用PURGE做表别名,报错如下:
- 删除不存在的表,以及重复删除,报错如下:
- 使用以上语句,必须具有DROP权限,否则报权限不足的提醒:
- 清空表数据的PURGE语句
语法格式如下:
TRUNCATE [TABLE] tbl_name [PURGE];
语法示例:
mysql>truncate table test_table1 purge;
-- 清空表test_table1且不进入表回收站
语法说明:
清空表语句后缀增加PURGE后,此表在执行TRUNCATE语句后,已删除的数据不会进入到表回收站,优先级高于:开启表回收站(dropTableRetentionTime)。
注意事项:
- 不允许写多个表名,不允许使用表别名,报错如下:
- 清空不存在的表,报错如下:
- 重复清空无报错:
- 要使用以上语句,必须具有CREATE权限,否则报权限不足的提醒:
- 彻底删除表数据的PURGE语句
语法格式如下:
DELETE PURGE FROM tbl_name [[AS] tbl_alias][PARTITION (partition_name [, partition_name] ...)][WHERE where_condition][ORDER BY ...][LIMIT row_count]
语法示例:
mysql>delete purge from test_database where gender='male'
-- 删除test_database表中gender等于male的记录,且不进入表回收站
语法说明:
在DELETE后直接加PURGE,此表在执行DELETE语句后,已删除的数据不会进入到表回收站,优先级高于:开启表回收站(dropTableRetentionTime)
注意事项:
- 允许使用表别名,但不允许使用PURGE做表别名,报错如下:
- 不允许写多个表名,报错如下:
- 重复删除无报错:
- 要使用以上语句,必须具有DELETE权限,否则报权限不足的提醒:
- 删除表回收站的数据的PURGE语句
语法格式如下:
[PURGE] [TABLE] tbl_name;
语法示例:
mysql> purge table test_1;
-- 删除表回收站中有关表test_1的全部记录
语法说明:
将表回收站中的表删除,只要是和删除的表相关的记录(如TRUNCATE、DROP、DELETE等)均会被删除;。 此tbl_name名,对应的是通过SHOW RECYCLED TABLES;查出来的原表名,非表临时名;
注意事项:
- 不允许写多个表名,不允许使用表别名,报错如下:
- 要使用以上语句,必须具有DELETE权限,否则报权限不足的提醒:
- 删除表回收站不存在的表,以及重复删除,报错如下: