日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2024/2/28 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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表),

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

設置完之后需要將其刷新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中設置的

<user name="root" defaultAccount="true"><property name="password">這里設置密碼</property><property name="schemas">TESTDB</property><!-- 表級 DML 權限設置 --><!-- <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服務啟動不了,或者啟動后關閉
補充:無論有幾個節點的mysql,實際需要的mycat只是一個。除非需要部署mycat的HA模式。
這個需要查看mycat的log文件wrapper.log,看他內部是什么錯誤,一般是schema.xml配置錯誤,比如表不存在,拼寫錯誤等問題。修改配置文件后重啟mycat即可。
4.mycat主從節點復制(一般用于集群統一mysql表數據):
需要設置/etc/my.cnf ,主節點設置

server-id=1 symbolic-links=0 log-bin=mysql-bin binlog-do-db=StudyTest//如果要同步復制多個數據庫可以再加入 binlog_format=STATEMENT

副節點設置:

server-id=2 relay-log=mysql-relay

重啟mysql服務,主節點進入mysql界面后使用show master status;查看master狀態記下其中的file編號和position端口號。副節點進入SQL界面

  • CHANGE MASTER TO MASTER_HOST='主機的IP地址', MASTER_USER='slave', MASTER_PASSWORD='主節點mysql密碼', MASTER_LOG_FILE='主節點file編號',MASTER_LOG_POS=主節點position端口號;

    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函數中設置

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

    遇到的問題
    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主機訪問此數據庫
    添加防火墻,只允許我們的網絡訪問

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

    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到成功进行分表操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。