日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

mycat从0到成功进行分表操作

發(fā)布時(shí)間:2024/2/28 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mycat从0到成功进行分表操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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表),

update mysql.user set authentication_string=password('新密碼') where user='用戶名' and Host ='localhost';

設(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è)置的

<user name="root" defaultAccount="true"><property name="password">這里設(shè)置密碼</property><property name="schemas">TESTDB</property><!-- 表級(jí) DML 權(quán)限設(shè)置 --><!-- <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges> --></user>

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è)置

server-id=1 symbolic-links=0 log-bin=mysql-bin binlog-do-db=StudyTest//如果要同步復(fù)制多個(gè)數(shù)據(jù)庫(kù)可以再加入 binlog_format=STATEMENT

副節(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界面

  • CHANGE MASTER TO MASTER_HOST='主機(jī)的IP地址', MASTER_USER='slave', MASTER_PASSWORD='主節(jié)點(diǎn)mysql密碼', MASTER_LOG_FILE='主節(jié)點(diǎn)file編號(hào)',MASTER_LOG_POS=主節(jié)點(diǎn)position端口號(hào);

    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è)置

    <function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- how many data nodes --><property name="count">3</property><!--分片mod值取3--></function>

    遇到的問(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)

    iptables -A INPUT -p tcp -s 192.168.0.104(可以使用的網(wǎng)絡(luò)) --dport 3306 -j ACCEPTiptables -A INPUT -p tcp --dport 3306 -j DROPservice iptables save

    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)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。