作者:冰河
星球:http://m6z.cn/6aeFbs
博客:https://binghe.gitcode.host
文章汇总:https://binghe.gitcode.host/md/all/all.html
星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html
沉淀,成长,突破,帮助他人,成就自我。
- 本章难度:★★☆☆☆
- 本章重点:介绍Mycat在使用过程中常见的问题,让大家少走弯路,在使用Mycat的过程中尽快规避这些问题。
大家好,我是冰河~~
今天给大家介绍《Mycat核心技术》的第06章:给大家简单介绍下处理真实场景使用Mycat的问题的一点小小的总结,好了,开始今天的内容。
一、报错1
mysql> INSERT INTO t_order(ID,SN,CREATE_TIME) VALUES(1,'2BJ0001001',NOW());
ERROR 1064 (HY000): For input string: "2BJ0001001"
mysql>
报错是因为分片字段是str字符串,所以需要修改分片规则1中type从0改成1,0是数字型分片,1是字符串分片。
二、报错2
mysql> INSERT INTO t_order_detail(ID,ORDER_ID,ORD_STATUS,ADDRESS,CREATE_TIME) VALUES (1,1,'1','test data of ORDER1(ID=1,2BJ0001001) ',NOW());
ERROR 1064 (HY000): can't find (root) parent sharding node for sql:INSERT INTO t_order_detail(ID,ORDER_ID,ORD_STATUS,ADDRESS,CREATE_TIME) VALUES (1,1,'1','test data of ORDER1(ID=1,2BJ0001001) ',NOW())
mysql>
解决方案1: 此类ER表的插入操作不能作为一个事务进行数据提交,如果父子表在一个事务中进行提交,显然在事务没有提交前子表是无法查询附表的数据的,因此就无法确定分片节点,如果是ER关系的表在插入数据时不能再同一个事务中提交数据,需要分开提交。
解决方案2: 上面的方案2个事务搞不定,所以查看后台Mycat日志
08/13 10:52:09.378 DEBUG [$_NIOREACTOR-3-RW] (ServerQueryHandler.java:56) -ServerConnection [id=1, schema=TESTDB, host=127.0.0.1, user=test,txIsolation=3, autocommit=true, schema=TESTDB]INSERT INTO t_order_detail(ID,ORDER_ID,ORD_STATUS,ADDRESS,CREATE_TIME) VALUES (1,1,'1','test data of ORDER1(ID=1,2BJ0001001) ',NOW())
08/13 10:52:09.506 DEBUG [$_NIOREACTOR-3-RW] (RouterUtil.java:1188) -find root parent's node sql select t_order.id from t_order where t_order.id=1
08/13 10:52:09.513 DEBUG [BusinessExecutor5] (EnchachePool.java:76) -ER_SQL2PARENTID miss cache ,key:TESTDB:select t_order.id from t_order where t_order.id=1
08/13 10:52:09.513 DEBUG [BusinessExecutor5] (FetchStoreNodeOfChildTableHandler.java:73) -find child node with sql:select t_order.id from t_order where t_order.id=1
08/13 10:52:09.514 DEBUG [BusinessExecutor5] (FetchStoreNodeOfChildTableHandler.java:81) -execute in datanode dn21
08/13 10:52:09.514 DEBUG [BusinessExecutor5] (PhysicalDBPool.java:452) -select read source hostM2 for dataHost:m1
08/13 10:52:09.535 WARN [$_NIOREACTOR-3-RW] (FetchStoreNodeOfChildTableHandler.java:135) -errorResponse 1146 Table 'db3.t_order' doesn't exist
08/13 10:52:09.535 DEBUG [$_NIOREACTOR-3-RW] (PhysicalDatasource.java:403) -release channel MySQLConnection [id=3, lastTime=1455258729497, user=root, schema=db3, old shema=db3, borrowed=true, fromSlaveDB=false, threadId=290, charset=latin1, txIsolation=0, autocommit=true, attachment=null, respHandler=null, host=192.168.209.137, port=3317, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
08/13 10:52:09.715 DEBUG [BusinessExecutor5] (FetchStoreNodeOfChildTableHandler.java:81) -execute in datanode dn22
08/13 10:52:09.715 DEBUG [BusinessExecutor5] (PhysicalDBPool.java:452) -select read source hostM2 for dataHost:m2
08/13 10:52:09.716 WARN [$_NIOREACTOR-1-RW] (FetchStoreNodeOfChildTableHandler.java:135) -errorResponse 1146 Table 'db3.t_order' doesn't exist
后台执行sql确实找不到
mysql> select t_order.id from t_order where t_order.id=1;
ERROR 1105 (HY000): Table 'db3.t_order' doesn't exist
mysql
原因是2个datanode是互为主从的关系,dn1和dn2是mm结构,然后停止mm结构,2个都是单独的MySQL,然后重建t_order和t_order_detail表,再执行insert操作,问题解决了。
三、报错4
mysql> INSERT INTO t_order_detail(ID,ORDER_ID,ORD_STATUS,ADDRESS,CREATE_TIME) VALUES (1,1,'1','test data of t_order(ID=1,2BJ0001001) ',NOW());
ERROR 1064 (HY000): can't find (root) parent sharding node for sql:INSERT INTO t_order_detail(ID,ORDER_ID,ORD_STATUS,ADDRESS,CREATE_TIME) VALUES (1,1,'1','test data of t_order(ID=1,2BJ0001001) ',NOW())
mysql>
原因:表名字大小写的问题导致
解决方案:
打开MySQL的my.cnf配置文件,在[mysqld]节点下加上如下配置:
[mysqld]
lower_case_table_names = 1
问题解决。
四、报错4
Mycat启动后,不能进行任何数据库的操作,报Unknown charsetIndex:224错误。
从错误看是因为字符集问题引起的 ,因为我MYSQL服务器默认使用的是utf8mb4,所以修改Mycat字符集的配置文件。
vim index_to_charset.properties
在配置文件最后加入224=utf8mb4,重启服务即正常。
好了,今天就到这儿吧,我是冰河,我们下期见~~