【mycat】mycat中配合mysql自增主鍵的使用
本文實現一個簡單的demo,展示mycat配合mysql實現分庫時自增主鍵的使用。
前提說明:mycat目前提供了自增主鍵的使用,但是如果對應的mysql節點上的資料表沒有定義auto_increment的話,mycat的自增主鍵也是無效的。
溫馨提示:關於mycat的安裝、配置和簡單測試可以查閱如下文件http://blog.csdn.net/smilefyx/article/details/72810531
1、在schema.xml中增加測試表
修改schema.xml配置檔案,我們在mycat提供的TESTDB邏輯表中增加一個名為tb_sq_test的邏輯表,該邏輯表的配置如下:
<table name="tb_sq_test" primaryKey="id" dataNode="dn1,dn2,dn3" autoIncrement="true" rule="mod-long"/>
可以看到該邏輯表的資料會被分配到dn1,dn2,dn3的資料節點上。2、建立測試表
使用navicat連結到mycat。我們選中TESTDB邏輯庫並建立一個名為tb_sq_test的資料表用於完成本文的測試。該表中有一個自增的主鍵id和一個name屬性。建立表的sql語句如下:
CREATE TABLE `tb_sq_test` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
之後執行如下命令:
explain CREATE TABLE `tb_sq_test` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
會得到如下結果
----------+
| DATA_NODE | SQL |
+-----------+----------------------------------------------------------------------------------------------------------------------------------+
| dn1 | CREATE TABLE `tb_sq_test` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) |
| dn2 | CREATE TABLE `tb_sq_test` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) |
| dn3 | CREATE TABLE `tb_sq_test` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) |
+-----------+----------------------------------------------------------------------------------------------------------------------------------+
3 rows in set</span>
可以看到在三個資料庫上都建立了名為tb_sq_test的資料表;
3、修改sequence生成方式
mycat提供了多種sequence生成方式,本文需要展示的是資料庫生成sequence方式。修改server.xml配置檔案,修改sequnceHandlerType引數的值為1,表示使用資料庫方式生成sequence:
<property name="sequnceHandlerType">1</property>
4、建立MYCAT_SEQUENCE的表和相關函式
選擇一個資料節點(物理的資料庫節點)建立MYCAT_SEQUENCE的表和相關函式,注意這裡的MYCAT_SEQUENCE的表和相關函式需要存放在同一個節點上。本文選擇db1來建立相關的資料表和函式。使用navicat直接連線到mysql資料庫。選中db1資料庫並執行如下命令建立相關的資料表和函式:
USE db1;
DROP TABLE IF EXISTS MYCAT_SEQUENCE;
CREATE TABLE MYCAT_SEQUENCE ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 100, PRIMARY KEY (name) ) ENGINE=InnoDB;
-- ----------------------------
-- Function structure for `mycat_seq_currval`
-- ----------------------------
DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(64);
SET retval="-999999999,null";
SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name;
RETURN retval ;
END
;;
DELIMITER ;
-- ----------------------------
-- Function structure for `mycat_seq_nextval`
-- ----------------------------
DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;
-- ----------------------------
-- Function structure for `mycat_seq_setval`
-- ----------------------------
DROP FUNCTION IF EXISTS `mycat_seq_setval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;
5、插入測試表的sequence資料
插入測試表sequence生成資料到上述建立的表格中,相關命令如下:
INSERT INTO mycat_sequence (name, current_value, increment) VALUES ('tb_sq_test', 0, 100);
6、指定sequence相關配置所在的節點
修改sequence_db_conf.properties配置檔案中的相關配置,增加sequence的節點配置資訊,否則mycat是不知道sequence的表和函式在哪個節點上的。編輯該屬性檔案,增加如下值:
TB_SQ_TEST=dn1
注意:這裡的key必須為表名的大寫,小寫是不行的。
7、重啟mycat
完成上述的配置後需要重啟mycat,否則服務也不會生效。在mycat的安裝目錄下的bin目錄下執行如下命令重啟mycat服務:
mycat.bat restart
8、測試
使用navicat連結到mycat資料庫,執行如下命令插入一條記錄到資料庫中:
insert tb_sq_test(name)values('helloworld2');
之後執行查詢命令可以檢視插入的內容:
select * from tb_sq_test;
相關文章
- MySQL 中的自增主鍵MySql
- 高可用Mysql架構_Mycat叢集部署(HAProxy + 兩臺Mycat+Mysql雙主雙從)MySql架構
- 深入瞭解MySQL中的自增主鍵MySql
- Mycat關鍵特性介紹
- Mysql關於自增主鍵,自增主鍵優化總結MySql優化
- MySQL新增自增主鍵的坑MySql
- MySQL 主鍵自增也有坑?MySql
- Mycat監控工具Mycat-webWeb
- mycat結合MySQL的雙主實現讀寫分離MySql
- 【Mycat】Mycat核心開發者帶你輕鬆掌握Mycat路由轉發!!路由
- docker中安裝mycatDocker
- MyCat入門篇-什麼是MyCat
- Mycat中的特性----資料分片
- MySQL 主鍵自增 Auto Increment用法MySqlREM
- 【Mycat】Mycat核心開發者帶你看盡Mycat三大核心配置檔案
- MySQL運維5-Mycat配置MySql運維
- 【Mycat】Mycat故障轉移之writetype與switchtype
- Mycat中介軟體實現Mysql主從讀寫分離MySql
- 高可用Mysql架構_Mysql主從複製、Mysql雙主熱備、Mysql雙主雙從、Mysql讀寫分離(Mycat中介軟體)、Mysql分庫分表架構(Mycat中介軟體)的演變MySql架構
- MyCat的快速搭建
- java面試一日一題:mysql中的自增主鍵Java面試MySql
- 【Mycat】作為Mycat核心開發者,怎能不來一波Mycat系列文章?
- MySQL8自增主鍵變化MySql
- MySQL自增主鍵跳號問題MySql
- 在Docker下進行MyCAT管理雙主雙從MySQL叢集DockerMySql
- MyCAT詳解
- MySQL的InnoDB引擎強烈建議使用自增主鍵的原因MySql
- MySQL運維4-Mycat入門MySql運維
- 【mycat】mycat在windows環境下的安裝和啟動Windows
- 【Mycat】Mycat讀寫分離與負載均衡2負載
- postgresql自增主鍵SQL
- Mycat 雙主雙從-負載均衡-高可用負載
- 白話MyCat——MyCat部署執行(Linux環境)與使用步驟詳解Linux
- MySQL 8 新特性之自增主鍵的持久化MySql持久化
- Linux MySQL分庫分表之MycatLinuxMySql
- MySQL運維6-Mycat垂直分庫MySql運維
- MySQL運維7-Mycat水平分表MySql運維
- Mysql雙主雙從高可用叢集的搭建且與MyCat進行整合MySql