暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

hhdb数据库介绍(9-18)

原创 恒辉信达 2024-12-02
89

SQL语法支持

计算节点语法特殊功能

默认分片规则建表

在使用关系集群数据库时,需要先将表的分片规则信息配置好之后才能创建表。实际使用过程中,用户可能对关系集群数据库及分片规则不了解,这就需要一种能直接过渡到HHDB Server的方案,该方案能根据逻辑库关联的分片节点数量自动对表生成分片规则,称为默认分片规则。

使用前提: 逻辑库已设置分片节点。为逻辑库设置分片节点的方法如下:登录关系集群数据库平台,选择"配置"->“逻辑库”,给逻辑库设置默认分片节点,然后点动态加载。
在这里插入图片描述
功能说明: 为逻辑库设置默认分片节点后,登录计算节点可以直接建表,计算节点将根据分片节点的数量为创建的表自动设置分片规则信息。具体的分片规则如下:

如果逻辑库只设置了一个分片节点,则计算节点对创建的表不做分片处理,在计算节点中将此类表称为创建垂直分片表。

如果逻辑库设置了多个分片节点,则计算节点对创建的表进行水平分片,分片算法是对每行数据分片字段的值进行AUTO_CRC32从而确定该行数据应被存储在哪个分片节点中,分片字段选取顺序:主键字段 -> 唯一键字段 ->第一个整型字段(BIGINT、INT、MEDIUMINT、SMALLINT、TINYINT) ->没有整型字段时取字符串类型字段(CHAR、VARCHAR),以上类型全部没有时默认随机选择一个字段作为分片字段。
在这里插入图片描述
注意:

此功能仅推荐在初次接触HHDB Server的时候使用,正式交付以及上线不推荐,需要根据实际业务场景做分片。

若后期对逻辑库默认节点进行更改,对更改之前创建的表无影响,只对后续新增的表生效。

计算节点中对表分为三类:全局表、水平分片表、垂直分片表。

  • 全局表:在计算节点中如果一个表被定义为全局表,则该表存储在逻辑库下的所有分片节点中,且每个分片节点中该表的数据都是完全一致的全量数据。
  • 水平分片表:在计算节点中如果一个表被定义为水平分片表,则该表存储在逻辑库下的所有分片节点中,且每个分片节点中该表的数据都只是部分行数据,所有分片节点中该表的数据合在一起才是该表的全量数据。
  • 垂直分片表:在计算节点中如果一个表被定义为垂直分片表,则该表仅存储在逻辑库下的一个分片节点中(其余分片节点无该表信息),且该分片节点中存储该表的全量数据。计算节点中垂直分片表与一般垂直分片表概念不同,不是按列进行分片存储的。

例子:

假设"test001"逻辑库配置了一个默认分片节点,则"test01"表为垂直分片表;假设"test002"逻辑库配置了两个默认分片节点,则"test02"表为水平分片表。

mysql> use TEST001; Database changed mysql> 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 changed mysql> 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 functiontype 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_mod.
  • 使用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 decimal(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) character 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 decimal(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) character 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 2 mysql> 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 VARCHAR(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 VARCHAR(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 VARCHAR(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 decimal(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 decimal(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 decimal(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.

使用已有分片规则建表相关命令

此小节介绍的命令登录到计算节点服务端口、管理端口均可执行。

  1. 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 | +-------------+---------------+---------------+
  1. 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)
  1. 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)
  1. 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关键字的相关语句,使删除的表不进入表回收站。

  1. 删除表的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权限,否则报权限不足的提醒:

在这里插入图片描述

  1. 清空表数据的PURGE语句

语法格式如下:

TRUNCATE [TABLE] tbl_name [PURGE];

语法示例:

mysql>truncate table test_table1 purge; -- 清空表test_table1且不进入表回收站

语法说明:
清空表语句后缀增加PURGE后,此表在执行TRUNCATE语句后,已删除的数据不会进入到表回收站,优先级高于:开启表回收站(dropTableRetentionTime)。

注意事项:

  • 不允许写多个表名,不允许使用表别名,报错如下:

在这里插入图片描述

  • 清空不存在的表,报错如下:

在这里插入图片描述

  • 重复清空无报错:

在这里插入图片描述

  • 要使用以上语句,必须具有CREATE权限,否则报权限不足的提醒:

在这里插入图片描述

  1. 彻底删除表数据的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权限,否则报权限不足的提醒:

在这里插入图片描述

  1. 删除表回收站的数据的PURGE语句

语法格式如下:

[PURGE] [TABLE] tbl_name;

语法示例:

mysql> purge table test_1; -- 删除表回收站中有关表test_1的全部记录

语法说明:
将表回收站中的表删除,只要是和删除的表相关的记录(如TRUNCATE、DROP、DELETE等)均会被删除;。 此tbl_name名,对应的是通过SHOW RECYCLED TABLES;查出来的原表名,非表临时名;
在这里插入图片描述
注意事项:

  • 不允许写多个表名,不允许使用表别名,报错如下:

在这里插入图片描述

  • 要使用以上语句,必须具有DELETE权限,否则报权限不足的提醒:

在这里插入图片描述

  • 删除表回收站不存在的表,以及重复删除,报错如下:

在这里插入图片描述

最后修改时间:2025-03-10 09:49:34
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论