翼度科技»论坛 编程开发 mysql 查看内容

自打有了GIPKs,DBA和开发再也不用battle了

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12


    • GIPKs特性简介


    • GIPKs特性的作用


    • 玩转GIPKs

GIPKs解决了历史难题
1. GIPKs特性简介

从MySQL 8.0.30开始,新引入一个叫做GPIKs的特性,其全称是 Generated Invisible Primary Keys,简言之就是 自动生成隐含的主键列,更完整的说法是:启用GIPKs后,当新建的InnoDB表没有显式主键时,会自动创建一个不可见的主键列 my_row_id,这个列会被定义为 bigint unsigned NOT NULL AUTO_INCREMENT,并且是不可见的(INVISIBLE)。
2. GIPKs特性的作用

实际上这个特性在有些分支版本上早就已经实现了,这个需求也是非常迫切,MySQL官方对这个特性的支持虽迟但到,积极意义还是很大滴,解决了几个历史难题:

  • DBA无需再和开发battle,强调一定要有显式自增主键列。当然了,个别情况下非要显式指定非自增列(例如选择UUID/VARCHAR类型列)做主键的,DBA也无可奈何啊。
  • 在MGR架构中,也不用要求每个InnoDB表都必须要有显式定义的主键列。
上述这两种情况下,都可以从GIPKs特性中获益,会自动创建隐含的 my_row_id 主键列。
GIPKs特性带来的一点点不便是,当我们想要显式创建一个名为 my_row_id 的列名时,会报错,不让创建,因为被GIPKs特性给当做保留关键字了,例如:
  1. greatsql> create table t2(
  2. id bigint unsigned not null auto_increment,
  3. my_row_id int NOT NULL);
  4. ERROR 4109 (HY000): Failed to generate invisible primary key. Auto-increment column already exists.
复制代码
需要注意的是,在传统主从复制或MGR架构中,GIPKs特性的设置值不会被复制到从节点,仅影响当前节点。不过,这完全不影响主从复制或MGR的正常工作,也就是说:在主节点上创建无显式定义主键列的表数据,可以正常复制到从节点。前提条件是设置 binlog_format = row,在MGR中,要求binlog必须采用row格式。
另外,mysqldump 中也相应增加了新选项 --skip-generated-invisible-primary-key,用于指定备份时是否要忽略隐含主键列。
3. 玩转GIPKs

下面我们在MGR环境中举栗说明怎么玩转GIPKs特性:
  1. # 当前使用 GreatSQL 8.0.32-24 版本
  2. greatsql> \s
  3. ..
  4. Server version:  8.0.32-24 GreatSQL, Release 24, Revision 3714067bc8c
  5. ...
  6. # 在MGR环境中测试
  7. greatsql> select * from performance_schema.replication_group_members;
  8. +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
  9. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
  10. +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
  11. | group_replication_applier | 2adec6d2-febb-11ed-baca-d08e7908bcb1 | 192.168.5.160 |        3307 | ONLINE       | SECONDARY   | 8.0.32         | XCom                       |
  12. | group_replication_applier | 2f68fee2-febb-11ed-b51e-d08e7908bcb1 | 192.168.5.160 |        3308 | ONLINE       | ARBITRATOR  | 8.0.32         | XCom                       |
  13. | group_replication_applier | 5e34a5e2-feb6-11ed-b288-d08e7908bcb1 | 192.168.5.160 |        3306 | ONLINE       | PRIMARY     | 8.0.32         | XCom                       |
  14. +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
  15. # 确认启用GIPKs特性
  16. greatsql> show variables like 'sql_generate_invisible_primary_key';
  17. +------------------------------------+-------+
  18. | Variable_name                      | Value |
  19. +------------------------------------+-------+
  20. | sql_generate_invisible_primary_key | ON    |
  21. +------------------------------------+-------+
  22. # 新建表,未显式指定主键列
  23. greatsql> create table t1 ( id int not null, c1 varchar(10) not null, unique key(id));
  24. greatsql> show create table t1\G
  25. *************************** 1. row ***************************
  26.        Table: t1
  27. Create Table: CREATE TABLE `t1` (
  28.   `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
  29.   `id` int NOT NULL,
  30.   `c1` varchar(10) NOT NULL,
  31.   PRIMARY KEY (`my_row_id`),
  32.   UNIQUE KEY `id` (`id`)
  33. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
复制代码
可以看到,在建表时已经创建了唯一索引列(该索引列可以被选用作聚集索引),但由于没显式指定主键索引,所以还是会创建一个隐含的主键列 my_row_id,这个隐含的主键列默认是不可见的,除非我们手动修改其可见性。
  1. # 即便是 SELECT *,也无法读取隐含的主键列
  2. greatsql> select * from t1;
  3. +----+----+
  4. | id | c1 |
  5. +----+----+
  6. |  1 | c1 |
  7. |  2 | c2 |
  8. +----+----+
  9. # 除非修改隐含主键列为可见
  10. greatsql> alter table t1 alter column my_row_id set visible;
  11. # 这时就能看到这个隐含主键列
  12. greatsql> select * from t1;
  13. +-----------+----+----+
  14. | my_row_id | id | c1 |
  15. +-----------+----+----+
  16. |         1 |  1 | c1 |
  17. |         2 |  2 | c2 |
  18. +-----------+----+----+
  19. # 再次查看表结构
  20. greatsql> show create table t1\G
  21. *************************** 1. row ***************************
  22.        Table: t1
  23. Create Table: CREATE TABLE `t1` (
  24.   `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT,
  25.   `id` int NOT NULL,
  26.   `c1` varchar(10) NOT NULL,
  27.   PRIMARY KEY (`my_row_id`),
  28.   UNIQUE KEY `id` (`id`)
  29. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
  30. # 还可以再次将其设置为不可见
  31. greatsql> alter table t1 alter column my_row_id set invisible;
  32. greatsql> show create table t1\G
  33. *************************** 1. row ***************************
  34.        Table: t1
  35. Create Table: CREATE TABLE `t1` (
  36.   `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
  37.   `id` int NOT NULL,
  38.   `c1` varchar(10) NOT NULL,
  39.   PRIMARY KEY (`my_row_id`),
  40.   UNIQUE KEY `id` (`id`)
  41. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
复制代码
如果不想继续使用该隐含列作为主键,可以执行类似下面的SQL命令进行修改:
  1. # 删除隐含主键列、主键,并新建自定义的主键列
  2. greatsql> alter table t1 drop column my_row_id, drop primary key, add aid bigint unsigned not null auto_increment primary key first;
  3. # 再次查看表结构和查询表数据
  4. greatsql> show create table t1\G
  5. *************************** 1. row ***************************
  6.        Table: t1
  7. Create Table: CREATE TABLE `t1` (
  8.   `aid` bigint unsigned NOT NULL AUTO_INCREMENT,
  9.   `id` int NOT NULL,
  10.   `c1` varchar(10) NOT NULL,
  11.   PRIMARY KEY (`aid`),
  12.   UNIQUE KEY `id` (`id`)
  13. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
  14. greatsql> select * from t1;
  15. +-----+----+----+
  16. | aid | id | c1 |
  17. +-----+----+----+
  18. |   1 |  1 | c1 |
  19. |   2 |  2 | c2 |
  20. +-----+----+----+
复制代码
可以看到,GIPKs特性还是很灵活实用的。
P.S,最新发布的GreatSQL 8.0.32-24版本中,已经包含了该特性,可以放心使用。
全文完。

Enjoy GreatSQL
来源:https://www.cnblogs.com/greatsql/p/17559201.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具