mycat从0到成功进行分表操作
1.安裝mysql,先檢查集群中是否存在
mysql --version 或使用rpm -qa | grep mysql查看
如不存在,則參考mysql安裝
啟動(dòng)mysql服務(wù)(systemctl start mysqld)時(shí)如果需要密碼且始終提示不對(duì)如下圖所示:
則可以使用 sudo systemctl restart mysqld.service啟動(dòng)mysql服務(wù)。
然后查看mysql服務(wù)是否真的啟動(dòng)了(systemctl status mysqld)
這樣就啟動(dòng)了。
補(bǔ)充:修改mysql密碼
如果是剛安裝的,使用mysqladmin -u root password “這是密碼”;創(chuàng)建密碼
如果不是則連接到mysql后,set password for 用戶名 @主機(jī)名(localhost)=password(…);
或使用mysqladmin -u root -p"舊密碼“ password “這是新密碼”;
或直接更新update的user表 (mysql庫(kù)下的user表),
設(shè)置完之后需要將其刷新flush privileges
補(bǔ)充mysql:如果修改了mysql配置文件/etc/my.cnf,一定要重啟mysql服務(wù)
2.使用mycat操作mysql時(shí)出現(xiàn)mysql的權(quán)限不足 ERROR 1105 (HY000): backend connect: java.lang.IllegalArgumentException: Invalid DataSource:0
在mysql中的mysql庫(kù)(use mysql)下使用grant all privileges on *.* to root@"%" identified by "password";再將其刷新到表中flush privileges;從而得到所有權(quán)限
查看權(quán)限:select Host from user where user='root'看是否存在%
補(bǔ)充:mycat密碼是在server.xml中設(shè)置的
3.mycat服務(wù)啟動(dòng)不了,或者啟動(dòng)后關(guān)閉
補(bǔ)充:無(wú)論有幾個(gè)節(jié)點(diǎn)的mysql,實(shí)際需要的mycat只是一個(gè)。除非需要部署mycat的HA模式。
這個(gè)需要查看mycat的log文件wrapper.log,看他內(nèi)部是什么錯(cuò)誤,一般是schema.xml配置錯(cuò)誤,比如表不存在,拼寫錯(cuò)誤等問(wèn)題。修改配置文件后重啟mycat即可。
4.mycat主從節(jié)點(diǎn)復(fù)制(一般用于集群統(tǒng)一mysql表數(shù)據(jù)):
需要設(shè)置/etc/my.cnf ,主節(jié)點(diǎn)設(shè)置
副節(jié)點(diǎn)設(shè)置:
server-id=2 relay-log=mysql-relay重啟mysql服務(wù),主節(jié)點(diǎn)進(jìn)入mysql界面后使用show master status;查看master狀態(tài)記下其中的file編號(hào)和position端口號(hào)。副節(jié)點(diǎn)進(jìn)入SQL界面
2.啟動(dòng)副節(jié)點(diǎn)服務(wù)器 start slave;
3.查看副節(jié)點(diǎn)狀態(tài) show slave status\G;如果顯示slave_io和sql_running為yes則成功了
停止slave節(jié)點(diǎn):stop slave
5.mycat分表
schema.xml中對(duì)應(yīng)的table表設(shè)置分片規(guī)則rule:
rule在rule.xml表中設(shè)置。(mycat配置文件的注解查看mycat)
設(shè)置連接表中的rule,是我們進(jìn)行數(shù)據(jù)分區(qū)等操作的屬性,其設(shè)置的值相當(dāng)于一個(gè)函數(shù),需要在mycat/conf/rule.xml文件中實(shí)現(xiàn)eg:
這里是指使用表中的Dno屬性進(jìn)行分片,分片函數(shù)為mod-long即取余操作實(shí)現(xiàn)分片
取余的值在mod-long函數(shù)中設(shè)置
遇到的問(wèn)題
1).插入的數(shù)據(jù)仍然是只有單個(gè)表有數(shù)據(jù)
1.考慮分片屬性的值是否不同
2.如果表非空并修改了表的分片屬性,再插入數(shù)據(jù)也是不行的,必須要表數(shù)據(jù)清除之后,修改表分片屬性,再插入數(shù)據(jù)
2).表查詢或者插入數(shù)據(jù)時(shí)出現(xiàn)ERROR 1003 (HY000): Unsupported statement
端口號(hào)使用錯(cuò)誤,應(yīng)該使用8066端口
3)."Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0
權(quán)限不夠,可以將 /etc/my.cnf 中的bind-address參數(shù)修改成0.0.0.0,表示允許任何ip主機(jī)訪問(wèn)此數(shù)據(jù)庫(kù)
添加防火墻,只允許我們的網(wǎng)絡(luò)訪問(wèn)
6.mycat join表
parentKey是我們連接父表時(shí)參考父表的鍵屬性,joinKey是子表用于連接父表使用的鍵屬性,primaryKey是當(dāng)前表的主鍵。默認(rèn)要求joinKey是parentKey的外鍵,即子表中插入數(shù)據(jù)的joinKey字段的數(shù)據(jù)范圍取決于parentKey的數(shù)據(jù)范圍。
單獨(dú)的dataNode標(biāo)簽是設(shè)置的邏輯節(jié)點(diǎn),用于連接mycat和mysql(相當(dāng)于一個(gè)映射關(guān)系)而dataHost和writeHost,readHost是設(shè)置連接的物理存儲(chǔ)節(jié)點(diǎn),和實(shí)際的讀寫操作節(jié)點(diǎn)。每一個(gè)映射關(guān)系都需要設(shè)置了這個(gè)之后才能真正的使用。否則就只是映射而無(wú)實(shí)際作用。
一個(gè)dataHost代表一個(gè)機(jī)器,而一個(gè)機(jī)器可以有多個(gè)writeHost和readHost.我們要實(shí)現(xiàn)分片可以使用一個(gè)機(jī)器多個(gè)writeHost,也可以使用多個(gè)機(jī)器多個(gè)writeHost(一個(gè)機(jī)器一個(gè)writeHost)
遇到的問(wèn)題:
1).can’t find (root) parent sharding node for sql(最坑人的地方!!!!!)
網(wǎng)上很多方法,有說(shuō)是事務(wù)的問(wèn)題(大致意思是子父表的數(shù)據(jù)不能在一個(gè)事務(wù)中插入,因?yàn)楦副頂?shù)據(jù)還沒(méi)提交,子表找不到),也有說(shuō)是mycat版本問(wèn)題需要在schema.xml中插入fetchStoreNodeByJdbc(應(yīng)該是錯(cuò)誤的,查看了table表的各個(gè)屬性是不存在該屬性的,如果要硬添加,就會(huì)報(bào)當(dāng)前屬性沒(méi)有申明的錯(cuò)誤),至于事務(wù)保持中立,不能確定。因?yàn)榈讓釉磉€不確定。但是我根據(jù)這個(gè)解決先將父表的數(shù)據(jù)commit后再執(zhí)行插入子表數(shù)據(jù),仍然會(huì)報(bào)這個(gè)錯(cuò)誤。有的說(shuō)可以關(guān)閉mysql的事務(wù),但是沒(méi)嘗試,所以也不能確定。網(wǎng)上的東西也不能全信,容易被帶偏(T_T)。
最后前前后后找了4,5個(gè)小時(shí),終于發(fā)現(xiàn)了,應(yīng)該是mycat的大小寫敏感造成的,其實(shí)我們?cè)趍ycat查看表時(shí)就可以發(fā)現(xiàn),當(dāng)表名是大寫時(shí)show tables;查看表名所有都是小寫。解決方法:法1.重新建表(都使用小寫。先delete from數(shù)據(jù),drop table ,再crate table)法2.將mysql設(shè)置為大小寫不敏感。即將所有的大寫都轉(zhuǎn)換為小寫格式。在/etc/my.cnf中添加lower_case_table_names = 1并重啟mysql服務(wù)。
另外注意在插入數(shù)據(jù)之前要保證表中數(shù)據(jù)為空,這樣的插入才會(huì)使用新的規(guī)則。
(實(shí)際表名為Student)
1)一般來(lái)說(shuō)只有當(dāng)parentKey是非父表的分片屬性時(shí)才會(huì)出現(xiàn)這種情況,因?yàn)槠鋬?nèi)部會(huì)執(zhí)行一個(gè)查詢語(yǔ)句如
要插入的數(shù)據(jù)連接屬性為id , parentKey為l-id ,primaryKey為sno
insert into child (id,sname,sno)values(1,2,3) =>底層執(zhí)行select parent.l-id from parent where parent.l-id=1,
之后將數(shù)據(jù)插入到parent表l-id屬性=1的節(jié)點(diǎn)上的child表中。
2)但是如果你使用的parentKey是父表的分片屬性時(shí),因?yàn)槠涫侵苯油ㄟ^(guò)分片規(guī)則(如mod-long取余)反向計(jì)算得到插入語(yǔ)句要連接表在哪個(gè)節(jié)點(diǎn)上,然后將數(shù)據(jù)插入到這個(gè)節(jié)點(diǎn)的child表上。因?yàn)闆](méi)有使用查詢語(yǔ)句,也就不會(huì)出現(xiàn)表大小寫導(dǎo)致子表數(shù)據(jù)插入不上的問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的mycat从0到成功进行分表操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 优先级队列应用-称检测点查询
- 下一篇: 使用matplotlib做动态排名图