3 設定全域性序列號

2021-08-01 15:14:59 字數 3712 閱讀 3367

1、原理

在資料庫中建立一張表,存放「名稱」,「當前值」,「步長」(mycat 每次讀取多少個 sequence)

sequence 獲取步驟:

1)當初次使用該sequence時,根據傳入的squence名稱,從這個表中獲取current_value 和 increment 到mycat中,並將current_value 設定為current_value+increment

2)mycat 將本次讀取到的current_value+increment 作為本次的squence,下次使用時自動加1,使用increment後,執行第一步操作。

3)mycat 維護這張張表,用到那些squence ,往表中插入一條資料即可。若某次讀取的squence 沒有用完伺服器就停止,則讀過的squence就不會再用,再從第一 步開始執行。

2 mycat配置:

1) server.xml

1配置為1 ,表示使用資料庫方式生成squence

2) 建立資料庫表(資料庫表的位置 要和schema.xml 中指定的位置相同)

也就是說 以下資料庫表和function 的建立,需要在dn1 所在的節點上。

create table mycat_sequence (

name varchar (50) not null 

comment  "名稱",

current_value int not null

comment  "當前值",

increment int not null default 100

comment  "步長",

primary key (name)

) engine = innodb ;

建立函式:

#取當前squence的值

drop function if exists mycat_seq_currval;

delimiter $$

create

function mycat_seq_currval(seq_name varchar(50))

returns varchar(64) charset `utf8`

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 ;

#設定 sequence 值

drop function if exists mycat_seq_setval;

delimiter $$

create

function mycat_seq_setval(seq_name varchar(50),value integer) returns varchar(64) charset `utf8`

begin

update mycat_sequence set current_value = value    where name = seq_name;

return mycat_seq_currval(seq_name);

end$$

delimiter ;

#取下乙個sequence的值

drop function if exists mycat_seq_nextval;

delimiter $$

create

function mycat_seq_nextval(seq_name varchar(50)) returns varchar(64) charset `utf8`

begin

update mycat_sequence set current_value = current_value + increment 

where name = seq_name;

return mycat_seq_currval(seq_name);

end$$

delimiter ;

插入一條初始化資料:

insert into mycat_sequence(name,current_value,increment) values('file_data_lct_1',1000,10);

name 列 就是我們配置的全域性序列號的名稱。

如果需要多個全域性序列號,可以初始化多條語句。

注意:1、mycat_sequence 表和以上的 function,需要放在同乙個節點上。這個結點就是

sequence_db_conf.properties 指定的資料庫結點

2、遠端建立function失敗,

需要對資料庫做如下設定:

/etc/my.cnf 下 my.ini

[mysqld]

加上 log_bin_trust_function_creators=1

3)配置 sequence_db_conf.properties

指定自定義的全域性序列號所在結點:

file_data_lct_1=dn1

注意:必須大寫(表名大寫)

4)重新啟動mycat

測試:

----登入到mycat 伺服器

#mysql -h

192.168.192.133 -utest -ptest -p8066 -dtestdb

----查詢出乙個序列

mysql>select next value for mycatseq_file_data_lct_1

其他使用方式:

insert intofile_data_lct_1(id,name) values(next value for

mycatseq_

file_data_lct_1,'test');

以上方式 配置了乙個全域性序列號,插入資料的時候,可以通過 引用全域性序列號獲得乙個 值,從而保證 多個分片id唯一。

如果主鍵id 是自增的,插入語句的時候,想要省略id ,

insert into file_data_lct_1(name) values(

'test');

類似這樣,該怎麼配置?

1)首先table1 表 主鍵id設定自增。

2)schema.xml 中配置 分片表 :

file_data_lct_1" primarykey="id" autoincrement="true" datanode="dn1,dn2">

3)sequence_db_conf.properties 中增加相應表配置:

file_data_lct_1=dn1

file_data_lct_1是全域性序列號的名字,正好也是表

file_data_lct_1的大寫方式。這不是巧合,mycat 故意這樣設定的。

這樣執行這條語句的時候 

insert into file_data_lct_1(name) values(

'test'

);發現primarykey ="id " 並且是自增的,就回去自動尋找  表名 大寫對應 全域性序列號是否存在,

如果不存在,直接報錯。

如果存在,則  默默的獲取到 file_data_lct_1 的next value 作為 id 插入到 file_data_lct_1 中。

Mycat全域性序列號

全域性序列號是mycat提供的乙個新功能,為了實現分庫分表情況下,表的主鍵是全域性唯一,而預設的mysql的自增長主鍵無法滿足這個要求。全域性序列號的語法符合標準sql規範。其格式為 next value for mycatseq global 其中mycatseq global是序列號的名字,my...

Mycat快速入門 三 全域性序列號

在實現分庫分表的情況下,資料庫自增主鍵已無法保證自增主鍵的全域性唯一。為此,mycat 提供了全域性 sequence,並且提供了包含本地配置和資料庫配置等多種實現方式。序列號處理器型別,感覺 sequnce 序列號是不是少了個e字母,應該是 sequence 關於全域性序列號的測試是在mycat分...

Mycat1 6系列全域性序列號相關測試

mycat github上 master分支進行全域性序列號測試,經過測試,在多次版本更新後功能沒有被損壞 1.6.6 druid 分支進行本地檔案方式的全域性序列號測試 新版1.66 druid分支問題,因為更新druid版本1.10,因為mysql的語法是沒有next value for myc...