MyCat使用问题汇总

MyCat Nicholas 2018-12-01 552浏览
相关标签: MyCat

image.png

1. 问题:分表的自增主键重复

现象:

对point_msg_his和broadcast_msg_his表进行了分表操作,该表有自增主键id,分表键使用的是其他字段。

在sqlmap中的insert语句:

<!--table insert-->
<insert id="insert" parameterClass="pointMsgHisDO" >
	insert into point_msg_his ( 
		id,
		receive_id,
		template_id,
		app_id,
		app_channel,
		content,
		status,
		memo,
		gmt_created,
		gmt_modified 
	) values ( 
		#id#,
		#receiveId#,
		#templateId#,
		#appId#,
		#appChannel#,
		#content#,
		#status#,
		#memo#,
		now(),
		now()  
	)

	<selectKey resultClass="long" keyProperty="id">
		<![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>
	</selectKey>
</insert>

插入的时候,出现了多张分表的id重复,全局sequence表中message_his表的全局自增主键,没有增加。


原因:

在插入数据时,如果在字段列表中指定自增字段,且在values 列表中没有指定以next value for MYCATSEQ_POINT_MSG_HIS 取值,则会使用数据表本身的自增规则,导致主键重复


解决方案:

方案-1 [推荐使用]:在插入数据的代码中,删除列表字段 id 以及对应的 values;

<!--table insert-->
<insert id="insert" parameterClass="pointMsgHisDO" >
	insert into point_msg_his ( 
		receive_id,
		template_id,
		app_id,
		app_channel,
		content,
		status,
		memo,
		gmt_created,
		gmt_modified 
	) values ( 
		#receiveId#,
		#templateId#,
		#appId#,
		#appChannel#,
		#content#,
		#status#,
		#memo#,
		now(),
		now()  
	)
   
	<selectKey resultClass="long" keyProperty="id">
		<![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>
	</selectKey>
</insert>

方案-02:使用 insert into point_msg_his(id,####) values(next value for MYCATSEQ_POINT_MSG_HIS ,###)

<!--table insert-->
<insert id="insert" parameterClass="pointMsgHisDO" >
	insert into point_msg_his ( 
		id,
		receive_id,
		template_id,
		app_id,
		app_channel,
		content,
		status,
		memo,
		gmt_created,
		gmt_modified 
	) values ( 
		next value for MYCATSEQ_POINT_MSG_HIS,
		#receiveId#,
		#templateId#,
		#appId#,
		#appChannel#,
		#content#,
		#status#,
		#memo#,
		now(),
		now()  
	)
   
	<selectKey resultClass="long" keyProperty="id">
		<![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>
	</selectKey>
</insert>

2. 问题:SQL语句查询结果比实际条数少

现象:

在sql语句没有加limit关键字,且符合条件的条目大于100个时,查询结果只返回了100条数据。

sql语句:

select * from table where xxx=xxx

因为涉及到所有查询语句,所以在使用MyCat后,每条语句都要经过审核。


原因:

MyCAT为了限制不带任何过过滤条件的查询(尤其是大表),给服务器带来的额外压力,默认返回100行数据。

参数配置 schema.xml

<schema name="push_center" checkSQLschema="false" sqlMaxLimit="100">


方案:

已经将MyCat默认limit改为了1000.

方案-01:应用层面,非主键查询,必须先对总数进行查询(就是先count),然后可以选择分页查询,或者在语句中加入 limit关键字。

PS: 当查询SQL中加入 limit 限制之后,返回结果以语句中限制为准。对大表的分页查询,请提交DBA审核。

相关标签: MyCat
相关文章
1. 问题:分表的自增主键重复 现象: 对point_msg_his和broadcast_msg_his表进行了分表操作,该表有自增主键id,分表键使用的是其他字段。 在sqlmap中的insert语句: <!--table insert--> <insert id="insert" parameterClass="pointMsgHisDO" > insert into&nb继续阅读>>
2018-12-01 551浏览 2个赞
分片规则: 1:官方建议是做成MyCAT Cluster  ,但是测试环境中开启两个MyCAT,会有时而连不上的问题; 2:MyCAT 在修改配置文件之后,可以通过 reload @@config ,在不重启的情况下更新配置:比如修改schema.xml  <table /> <dataNode /> <dataHost />,server.xml 。但是在管理端口看不到修改后的配置信息。 3:对节点、表的扩展操作可以执继续阅读>>
2018-11-28 333浏览 0个赞
数据库配置方式: 在数据库中建立一张表,存放sequence 名称(name) sequence 当前值(current-value),步长(increment int 类型每次读取多少个 sequence,假设为 K)等信息 创建全局序列表: CREATE TABLE MYCAT_SEQUENCE     (`name` VARCHAR(50) NOT NULL,    继续阅读>>
2018-11-28 277浏览 0个赞
表 tdate 的数据水平分布在3 个数据库上 新建3个数据库: CREATE DATABASE db1; CREATE DATABASE db2; CREATE DATABASE db3; 每个数据库新建表: CREATE TABLE `tdate` (    `id` INT(11) NOT NULL,   &nbs继续阅读>>
2018-11-28 388浏览 0个赞
水平拆分:通俗来讲就是将大表按行还拆分 在一般的应用系统中,用户表及其密切相关的关联表,可根据“用户表”(eg:t_user)中的“用户ID”(user_id)进行水平切分,并基于MyCAT的E-R关系分片策略将其密切相关的表(eg:t_user_class_rel)也分到对应的库中。 多(2)实例实现水平拆分:192.168.1.195:3306、192.168.1.18:3306 在每个实例上新建库、表: CREATE DATABAS继续阅读>>
2018-11-28 246浏览 1个赞
垂直切分即常说的分库,降低数据库耦合性。可以配置同一个实例下不同库,不同实例下不同库 schema.xml 配置 <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"> 继续阅读>>
2018-11-28 178浏览 0个赞
1、安装 JAVA 环境,必须是 JDK7 或更高版本 yum search JDK yum install java-1.7.0 java -version     java version "1.7.0_95"     OpenJDK Runtime Environment (rhel-继续阅读>>
2018-11-28 270浏览 2个赞
版权声明
本站的文章和资源来自互联网或者站长的原创。如果有侵犯版权的资源请尽快联系站长,我们会在24h内删除有争议的资源。