在《Mycat之——实现MySQL的水平分表》一文中,我们将商城数据库的订单数据库中的order_master数据表,根据customer_id字段进行了水平切分,当我们通过Mycat向order_master数据表中插入数据后,再通过Mycat查询order_master数据表中的数据时,发现通过Mycat查询出来的数据中,order_id字段有很多重复的值。这是由于在orderdb01orderdb04数据库中的order_master数据表的主键order_id都是设置为整型的自增类型,也就是说在orderdb01orderdb04数据库中的order_master数据表的主键都是从1开始自增,这就导致了通过Mycat查询order_master数据表的数据时,出现大量重复的主键值。
那么,如何解决上述问题呢?
Mycat中提供了全局自增id的功能,可以解决这个问题!
如何进行操作呢
此时,我们在Mycat所在的binghe151服务器上,安装MySQL数据库。
安装之后,登录MySQL命令行,如下所示。
[root@binghe151 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 33926
Server version: 8.0.18 binghe edition
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
注意:这里登录的是MySQL命令行,而不是Mycat命令行。接下来,在MySQL命令行新建一个mycat数据库,如下所示。
mysql> create database mycat;
Query OK, 1 row affected (2.52 sec)
注意:其实这个mycat数据库建立在binghe152~binghe158服务器上的任意一个MySQL实例上都可以,这里,我为了将mycat数据库与商城的业务数据库分开,就单独在binghe151服务器上再次安装一个MySQL来创建mycat数据库。
接下来,我们需要在mycat数据库中初始化数据表和一些数据值,需要的数据表和数据值可以通过运行Mycat安装目录下的conf目录下的dbseq.sql脚本来进行初始化。接下来,我们将dbseq.sql脚本导入到mycat数据库中,如下所示。
[root@binghe151 ~]# mysql -uroot -p mycat < /usr/local/mycat/conf/dbseq.sql
Enter password:
导入完成后,我们在MySQL命令行查看下mycat下的数据表,如下所示。
mysql> use mycat;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_mycat |
+-----------------+
| mycat_sequence |
+-----------------+
1 row in set (0.98 sec)
mysql> select * from mycat_sequence;
+--------+---------------+-----------+
| name | current_value | increment |
+--------+---------------+-----------+
| GLOBAL | 1 | 1 |
+--------+---------------+-----------+
1 row in set (0.03 sec)
查看mycat数据库中存在的函数,如下所示。
mysql> show function status like 'mycat%' \G
*************************** 1. row ***************************
Db: mycat
Name: mycat_seq_currval
Type: FUNCTION
Definer: root@localhost
Modified: 2020-03-01 22:06:11
Created: 2020-03-01 22:06:11
Security_type: DEFINER
Comment:
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
Database Collation: utf8mb4_0900_ai_ci
*************************** 2. row ***************************
Db: mycat
Name: mycat_seq_nextval
Type: FUNCTION
Definer: root@localhost
Modified: 2020-03-01 22:06:11
Created: 2020-03-01 22:06:11
Security_type: DEFINER
Comment:
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
Database Collation: utf8mb4_0900_ai_ci
*************************** 3. row ***************************
Db: mycat
Name: mycat_seq_nextvals
Type: FUNCTION
Definer: root@localhost
Modified: 2020-03-01 22:06:12
Created: 2020-03-01 22:06:12
Security_type: DEFINER
Comment:
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
Database Collation: utf8mb4_0900_ai_ci
*************************** 4. row ***************************
Db: mycat
Name: mycat_seq_setval
Type: FUNCTION
Definer: root@localhost
Modified: 2020-03-01 22:06:12
Created: 2020-03-01 22:06:12
Security_type: DEFINER
Comment:
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
Database Collation: utf8mb4_0900_ai_ci
4 rows in set (0.00 sec)
接下来,我们还需要对server.xml文件进行相应的修改。这里,将server.xml文件中的system标签下的sequenceHandlerType的值修改为1,没有配置这个选项的话,就增加这个配置项,如下所示。
1
接下来,在schema.xml文件中新增一个dataHost节点,这个节点就是mycat数据库所在的服务器节点,如下所示。
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
select user()
此时,需要在binghe151服务器的MySQL中创建mycat用户。
如果大家安装的是MySQL 8.x版本,则在MySQL命令行执行如下命令。
CREATE USER 'mycat'@'192.168.175.%' IDENTIFIED BY 'mycat';
ALTER USER 'mycat'@'192.168.175.%' IDENTIFIED WITH mysql_native_password BY 'mycat';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON *.* TO 'mycat'@'192.168.175.%';
FLUSH PRIVILEGES;
如果大家安装的是MySQL 5.x版本,则在MySQL命令行执行如下命令。
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON *.* TO 'mycat'@'192.168.175.%' IDENTIFIED BY 'mycat';
FLUSH PRIVILEGES;
注意:在binghe151服务器上的MySQL数据库中增加的mycat用户除了需要具有对数据库的增删改查权限外,还需要具有执行函数的权限。
接下来,需要在schema.xml文件中新增一个数据节点,如下所示。
另外,我们还需要在Mycat安装目录下的conf目录中修改sequence_db_conf.properties文件,如下所示。
vim /usr/local/mycat/conf/sequence_db_conf.properties
修改后的equence_db_conf.properties文件中的内容如下所示。
GLOBAL=mycat
order_master=mycat
接下来,我们在binghe151服务器上登录MySQL命令行,向mycat数据库中的mycat_sequence数据表插入数据,如下所示。
mysql> use mycat;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_mycat |
+-----------------+
| mycat_sequence |
+-----------------+
1 row in set (0.21 sec)
mysql> insert into mycat_sequence values ('order_master',1,1);
Query OK, 1 row affected (0.65 sec)
mysql> select * from mycat_sequence;
+--------------+---------------+-----------+
| name | current_value | increment |
+--------------+---------------+-----------+
| GLOBAL | 1 | 1 |
| order_master | 1 | 1 |
+--------------+---------------+-----------+
2 rows in set (0.00 sec)
此时,可以看到mycat_sequence数据表中多了一条名称为order_master的数据。
接下来就需要告诉Mycat如何使用全局自增id了。
如何使用全局自增id?
需要在schema.xml文件中进行配置,对order_master数据表开启全局自增id,需要在order_master表的配置中新增一个autoIncrement="true"的属性配置,如下所示。
接下来,重启Mycat,使配置生效。此时,使用Mycat向order_master数据表中插入数据后,再通过Mycat查询order_master数据表中的数据,发现order_id主键的值不再有重复了。说明全局id配置生效。
冰 河