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 ACCEPT
 iptables -A INPUT -p tcp --dport 3306 -j DROP
 service 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表上。因为没有使用查询语句,也就不会出现表大小写导致子表数据插入不上的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看不见的罗辑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值