ITPub博客

首页 > 数据库 > > HotDB的全局唯一约束

HotDB的全局唯一约束

作者:u_9ff4c058a0e0 时间:2022-03-15 14:40:40 0 删除 编辑

若开启全局唯一约束功能,HotDBServer可以保证拥有唯一约束(UNIQUE、PRIMARYKEY)的列在所有节点都是唯一的,包括但不限于以下场景:

  1. 唯一约束键不是分片字段或不包含分片字段
  2. 父子表下,子表与父表的关联字段与子表的唯一约束键不是同一列

HotDB Server 2.5.3将全局唯一约束优化精确到表级别,默认为所有未来添加的表关闭全局唯一约束,也可以手动在添加表时为某些表单独关闭/开启全局唯一约束。
可以通过修改server.xml中的如下参数或在管理平台计算节点参数配置中修改此参数。修改参数只为未来添加的表设置全局唯一的默认值,但并不影响历史数据表的全局唯一性。
<property name=“globalUniqueConstraint”>false</property>
注意:开启该功能后,可能对SQL语句INSERT、UPDATE、DELETE执行效率有较大影响,可能导致SQL操作延迟增大;还可能导致锁等待和死锁的情况增加。请酌情考虑后注意取舍。

创建表时的表级别控制
添加表信息时可以为某张表单独开启/关闭全局唯一约束

  1. 在管理平台上添加表信息时,根据计算节点参数默认显示全局唯一约束开关状态,可手动修改:
    垂直分片表与全局表没有此入口,因为不需要对唯一约束做额外处理。添加完表配置后即可使用建表语句添加表结构后使用。
    2.使用自动建表功能,可通过table option GLOBAL_UNIQUE [=] {0 | 1}设置全局唯一约束的开关。例如:
    mysql> create table test02(id not nullauto_increment primary key,a char(8),b decimal(4,2),c int) GLOBAL_UNIQUE=0;
    mysql> create table test03(id intprimary key,id1 int) GLOBAL_UNIQUE =1;

若不使用GLOBAL_UNIQUE[=] {0 | 1},则默认根据计算节点参数配置的默认值或在管理平台上添加的表配置设置开启或关闭;若GLOBAL_UNIQUE=1则判断为开启;若GLOBAL_UNIQUE=0则判断为关闭。
3. 若GLOBAL_UNIQUE设置与默认值不同,则以GLOBAL_UNIQUE为准;
4. 若GLOBAL_UNIQUE设置与管理平台中此表的全局唯一约束配置不同,则会建表失败,并给出error提醒,例如管理平台添加test01时关闭了全局唯一约束:
mysql> create table test01(idint)global_unique=1;
ERROR 10172 (HY000): CREATE TABLE FAILEDdue to generated table config already in HotDB config datasource. You may needto check config datasource or reload HotDB config.

  1. 若在垂直分片表或全局表的建表语句中使用GLOBAL_UNIQUE,则会建表成功,但会给出warning信息,因为不需要对其唯一约束做额外处理,例如test03是一张垂直分片表:
    mysql> create table test03(id int)global_unique=1;
    Query OK, 0 rows affected, 2 warnings (0.09 sec)
    Warning (Code 10032): Create table without primary key and uniquekey
    Note (Code 10210): Global_unique is notapplicable to vertical-sharding tables or global tables.

为了满足MySQL的兼容性,例如使用mysqldump时不用担心GLOBAL_UNIQUE对备份结果造成干扰,将GLOBAL_UNIQUE语法解析为注释格式,例如:
mysql> create table test02(id int) GLOBAL_UNIQUE=1;
mysql> show create table test02
±------±---------------------------------------+
| Table | Create Table |
±------±---------------------------------------+
| test3 | CREATE TABLE test3 (
id int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4/hotdb:020503global_unique=1/ |
±------±---------------------------------------+
1 row in set (0.00 sec)

将含有GLOBAL_UNIQUE语法的建表语句导入MySQL不会对结果有影响。在计算节点也可以直接用注释语法操作GLOBAL_UNIQUE,使用-c作为MySQL登陆参数允许执行注释。
root> mysql -c -uroot -proot -h127.0.0.1 -P3323

例如执行如下语句,表示在HotDBServer版本高于2.5.3时会执行GLOBAL_UNIQUE=0:

mysql> create table test02(id not null auto_increment primarykey,a char(8),b decimal(4,2),c int) /hotdb:020503 GLOBAL_UNIQUE=0/;

修改表时的表级别控制

  1. 可以在管理平台的表信息管理页面修改表配置:
    若表结构为已创建的表,全局唯一约束修改为开启状态后,点击动态加载并刷新页面,若出现如下图提示,说明需要到管理端口执行unique @@create检查此表唯一约束键的历史数据是唯一后创建辅助索引,全局唯一约束方能生效,此命令详情请参考《分布式事务数据库HotDB Server -V2.5.3【管理端命令】功能使用手册》:
  2. 在计算节点通过ALTERTABLE使用GLOBAL_UNIQUE语法,开启全局唯一,同理,出现warning信息说明需要执行unique @@create后方能生效:

mysql> alter table keevey01 global_unique=1;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show warnings;
±------±------±--------------------------------------------------------+
| Level | Code | Message |
±------±------±--------------------------------------------------------+
| Note | 10210 | please go toHotDB Server manager port and execute this command: unique @@create, otherwisethis global_unique setting doesn’t work. |
±------±------±--------------------------------------------------------+
1 row in set (0.00 sec)
分片方案在线变更
分片方案在线变更时也可以为变更后的表手动开启或关闭全局唯一约束。
开启后,在变更方案预检会检测此表唯一约束键的历史数据是否唯一,若唯一,方能通过测试。

来源 https://zhuanlan.zhihu.com/p/389874382

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69999831/viewspace-3127730/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2022-02-11

  • 博文量
    1828
  • 访问量
    20593