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