MyCat不支持的Sql语句
mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离
mysql+mycat搭建稳定⾼可⽤集群,负载均衡,主备复制,读写分离数据库性能优化普遍采⽤集群⽅式,oracle集群软硬件投⼊昂贵,今天花了⼀天时间搭建基于mysql的集群环境。
主要思路简单说,实现mysql主备复制-->利⽤mycat实现负载均衡。
⽐较了常⽤的读写分离⽅式,推荐mycat,社区活跃,性能稳定。
测试环境MYSQL版本:Server version: 5.5.53,到官⽹可以下载WINDWOS安装包。
注意:确保mysql版本为5.5以后,以前版本主备同步配置⽅式不同。
linux实现思路类似,修改f即可。
A主mysql。
192.168.110.1:3306, ⽤户root,密码root。
操作系统:win7 x64,内存:4g安装路径:C:\Program Files\MySQL\MySQL Server 5.5\binB备mysql。
192.168.110.2:3306, ⽤户root,密码root。
操作系统:win2003 x64,内存:1g安装路径:C:\Program Files\MySQL\MySQL Server 5.5\binA主、B备的mysql中创建sync_test数据库实现mysql主备复制主要思路:A主mysql开启⽇志,B备mysql读取操作⽇志,同步执⾏。
⼀般为主备同步,主主同步不推荐使⽤。
配置A主mysql1)修改my.ini。
需要在log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log"的相关位置创建log⽬录,以及mysql-bin.log⽂件。
[mysqld]server-id=1 #主机标⽰,整数port=3306log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log" #确保此⽂件可写read-only=0 #主机,读写都可以binlog-do-db=sync_test #需要备份数据库,多个写多⾏binlog-ignore-db=mysql #不需要备份的数据库,多个写多⾏2)允许MYSQL远程访问#登录mysql console进⼊%home%/bin,执⾏mysql -uroot -proot#授权。
MyCat不支持的Sql语句
MyCat不支持的SQL语句已知的MyCat不支持的SQL语句类型如下(不完全统计,后续会更新):SELECT:跨分片(实体库)的交叉查询跨节点的联合查询(如用户库的表和平台库的表做联合查询)INSERT:插入的字段不包含分片字段(如插入tbl_user_base_info表,没有提供user_id列)插入的分片字段找不到对应分片复制插入Insert into…select…多行插入insert into tab_a(c1,c2) values(v1,v2),(v11,v21)…UPDATE:更新的列包含分片列多表更新update a, b set a.nation=’China’, b.pwd=’123456’ where a.id=b.id复杂更新update a, b set a.nation=’China’ where a.id=b.id; 但支持子查询方式update a set a.nation=’China’ where id in (select id from b); DELETE:复杂删除delete a from a join b on a.id=b.id; 支持子查询方式delete from a where a.id in (select id from b), 但表不能起别名其它:Call procedure() MyCat未支持存储过程定义, 因而不允许调用存储过程,但可通过注解来调用各个分片上的存储过程Select func(); 不支持这种方式直接调用自定义函数,但支持select id, func() from employee 只需employee所在的所有分片上存在这个函数。
MySql自带函数可随意使用。
注意事项:Order by字段必须出现在select中(MyCat先将结果取出,然后排序)Group by务必使用标准语法select count(1),type from tab_a group by type;MyCat的一些自带函数sum,min,max等可以正确使用,但多分片执行的avg有bug,执行的结果是错误的谨慎使用子查询,外层查询没有分片查询条件,则会在所有分片上执行(子查询内外层的表一样较为特殊)。
MySQL之MyCat
MySQL之MyCat Mycat 可以简单概括为⼀个彻底开源的,⾯向企业应⽤开发的⼤数据库集群⽀持事务、ACID、可以替代MySQL的加强版数据库⼀个可以视为MySQL集群的企业级数据库,⽤来替代昂贵的Oracle集群⼀个融合内存缓存技术、NoSQL技术、HDFS⼤数据的新型SQL Server结合传统数据库和新型分布式数据仓库的新⼀代企业级数据库产品⼀个新颖的数据库中间件产品Mycat⼯作原理Mycat的原理中最重要的⼀个动词是"拦截",它拦截了⽤户发送过来的SQL语句,⾸先对SQL语句做了⼀些特定的分析:如分⽚分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给⽤户Mycat应⽤场景Mycat适⽤的场景很丰富,以下是⼏个典型的应⽤场景单纯的读写分离,此时配置最为简单,⽀持读写分离,主从切换分表分库,对于超过1000万的表进⾏分⽚,最⼤⽀持1000亿的单表分⽚多租户应⽤,每个应⽤⼀个库,但应⽤程序只连接Mycat,从⽽不改造程序本⾝,实现多租户化报表系统,借助于Mycat的分表能⼒,处理⼤规模报表的统计替代Hbase,分析⼤数据作为海量数据实时查询的⼀种简单有效⽅案,⽐如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择Mycat长期路线图强化分布式数据库中间件的⽅⾯的功能,使之具备丰富的插件、强⼤的数据库智能优化功能、全⾯的系统监控能⼒、以及⽅便的数据运维⼯具,实现在线数据扩容、迁移等⾼级功能进⼀步挺进⼤数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的巨表关联、排序、分组聚合等 OLAP⽅向的能⼒,并集成⼀些热门常⽤的实时分析算法,让⼯程师以及DBA们更容易⽤Mycat实现⼀些⾼级数据分析处理功能不断强化Mycat开源社区的技术⽔平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache基⾦会,成为国内顶尖开源项⽬,最终能够让⼀部分志愿者成为专职的Mycat开发者,荣耀跟实⼒⼀起提升Mycat不适合的应⽤场景设计使⽤Mycat时有⾮分⽚字段查询,请慎重使⽤Mycat,可以考虑放弃!设计使⽤Mycat时有分页排序,请慎重使⽤Mycat,可以考虑放弃!设计使⽤Mycat时如果要进⾏表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使⽤Mycat,可以考虑放弃!设计使⽤Mycat时如果有分布式事务,得先看是否得保证事务得强⼀致性,否则请慎重使⽤Mycat,可以考虑放弃!MyCat的⾼可⽤性:需要注意: 在⽣产环境中, Mycat节点最好使⽤双节点, 即双机热备环境, 防⽌Mycat这⼀层出现单点故障.可以使⽤的⾼可⽤集群⽅式有:Keepalived+Mycat+MysqlKeepalived+LVS+Mycat+MysqlKeepalived+Haproxy+Mycat+Mysqlmycat安装⽬录结构:bin mycat命令,启动、重启、停⽌等catlet catlet为Mycat的⼀个扩展功能conf Mycat 配置信息,重点关注lib Mycat引⽤的jar包,Mycat是java开发的logs ⽇志⽂件,包括Mycat启动的⽇志和运⾏的⽇志version.txt mycat版本说明logs⽬录:wrapper.log mycat启动⽇志mycat.log mycat详细⼯作⽇志Mycat的配置⽂件都在conf⽬录⾥⾯,这⾥介绍⼏个常⽤的⽂件:server.xml Mycat软件本⾝相关的配置⽂件,设置账号、参数等schema.xml Mycat对应的物理数据库和数据库表的配置,读写分离、⾼可⽤、分布式策略定制、节点控制rule.xml Mycat分⽚(分库分表)规则配置⽂件,记录分⽚规则列表、使⽤⽅法等Mycat 主要配置⽂件说明server.xml存放Mycat软件本⾝相关的配置⽂件,⽐如:连接Mycat的⽤户,密码,数据库名称等server.xml⽂件中配置的参数解释说明:参数说明user ⽤户配置节点name 客户端登录MyCAT的⽤户名,也就是客户端⽤来连接Mycat的⽤户名。
TPCC测试mycat测试报告
1前言使用tpc-c的标准对mycat进行测试,以发现mycat对事务支持的bug和mycat事务使用中的注意事项,同时,通过让mycat通过tpcc这种标准企业级测试,让使用mycat的人群更有信心来使用mycat 。
2测试方法概述2.1测试环境2.2硬件环境2.3软件环境2.4测试工具2.4.1TPCC介绍TPC(Tracsaction Processing Performance Council) 事务处理性能协会是一个评价大型数据库系统软硬件性能的非盈利的组织,TPC-C是TPC协会制定的,用来测试典型的复杂OLTP系统的性能。
Tpcc测试结果主要关注两个指标:流量指标和性价比。
流量指标:(Throughput,简称tpmC)系统每分钟能够执行多少个用户订单请求,即在执行支付(Payment)、订单状态查询(Order-status)、发货(Delivery)、库存状态查询(Stock-Level)这四种交易的同事,每分钟可以处理多少个新订单(New-Order)交易。
每分钟能处理的新订单事务数越大,说明数据库管理系统的性能越好,例如:每分钟能处理的新订单事务数:13.6 个。
性价比(Price/Performance,简称Price/tpmC):系统价格(指在美国的报价)与流量指标的比值2.4.1.1T pcc商业模型测试用到的模型是一个大型的批发销售公司,每个仓库负责10个区域的供货,每个区域为3000个客户提供服务。
每个仓库维护公司销售的100,000种商品的库存记录,随着企业并发用户的增加,数据量也逐渐增加。
商业模型示意图如下:2.4.1.2T pcc表关系及数据量关系2.4.1.3模拟事务新订单从固定的仓库中随机选取5-15件商品,创建新订单。
支付操作采用随机的金额支付一笔订单,并作相应历史记录。
订单状态查询显示订单内每件商品的状态。
发货随机选取一个发货包,更新被处理订单的用户帐户余额 库存状态查询检查订单中所有货物的库存。
mycat生产实施方案
mycat生产实施方案Mycat生产实施方案一、引言Mycat是一个开源的分布式数据库中间件,它提供了对MySQL数据库的高可用、负载均衡、分库分表等功能。
在大规模的数据存储和访问场景下,Mycat能够有效地提升数据库的性能和稳定性。
因此,本文将介绍Mycat生产实施方案,帮助您更好地使用Mycat来提升数据库的处理能力和可靠性。
二、Mycat生产实施方案1. 硬件环境准备在实施Mycat之前,首先需要准备好适用的硬件环境。
需要确保服务器的性能和稳定性能够满足Mycat的需求,包括CPU、内存、硬盘等方面的配置。
同时,还需要考虑网络带宽和安全防护等方面的因素,以确保Mycat能够在稳定可靠的环境下运行。
2. 软件环境准备除了硬件环境,还需要准备好适用的软件环境。
首先需要安装和配置MySQL数据库,然后再安装Mycat中间件,并进行相应的配置和优化。
在软件环境准备阶段,需要特别注意各个组件之间的兼容性和稳定性,以确保整个系统能够正常运行。
3. 数据库架构设计在实施Mycat之前,需要对数据库架构进行设计和优化。
这包括数据库的分库分表设计、索引优化、SQL语句优化等方面。
通过合理的数据库架构设计,能够有效地提升数据库的性能和可靠性,从而更好地支持Mycat中间件的运行。
4. Mycat配置和优化Mycat的配置和优化是实施过程中的关键环节。
需要根据实际的业务需求和硬件环境,对Mycat进行相应的配置和优化,包括负载均衡策略、读写分离配置、连接池配置等方面。
通过合理的配置和优化,能够更好地发挥Mycat中间件的性能和功能优势。
5. 测试和监控在实施Mycat之后,需要进行相应的测试和监控工作。
通过压力测试、性能测试等手段,验证Mycat中间件的稳定性和性能表现。
同时,需要建立完善的监控系统,实时监控Mycat中间件的运行状态和性能指标,及时发现和解决潜在的问题。
6. 故障处理和优化最后,需要建立完善的故障处理和优化机制。
分表分库解决方案(mycat,tidb,shardingjdbc)
分表分库解决⽅案(mycat,tidb,shardingjdbc)公司最近有分表分库的需求,所以整理⼀下分表分库的解决⽅案以及相关问题。
1.sharding-jdbc(sharding-sphere)优点:1.可适⽤于任何基于java的ORM框架,如:JPA、Hibernate、Mybatis、Spring JDBC Template,或直接使⽤JDBC2.可基于任何第三⽅的数据库连接池,如:DBCP、C3P0、Durid等3.分⽚策略灵活,可⽀持等号、between、in等多维度分⽚,也可⽀持多分⽚键。
4.SQL解析功能完善,⽀持聚合、分组、排序、limit、or等查询,并⽀持Binding Table以及笛卡尔积表查询。
5.性能⾼,单库查询QPS为原⽣JDBC的99.8%,双库查询QPS⽐单库增加94%。
缺点:1.理论上可⽀持任意实现JDBC规范的数据库。
⽬前仅⽀持mysql2.维护会⽐较⿇烦,需要逐个项⽬的修改配置。
不能进⾏跨库连接,代码需要进⾏改造。
3.在扩展数据库服务器时需要考虑⼀致性哈希问题,或者采⽤分⽚键局部取模⽅式,也难免要进⾏部分的数据迁移。
2.mycat优点:1.⽀持Mysql集群,可以作为Proxy使⽤2.⽀持JDBC连接ORACLE、DB2、SQL Server,将其模拟为MySQL Server使⽤3.⾃动故障切换,⾼可⽤性4.⽀持读写分离,⽀持Mysql双主多从,以及⼀主多从的模式,⽀持全局表,数据⾃动分⽚到多个节点,⽤于⾼效表关联查询5.⽀持独有的基于E-R 关系的分⽚策略,实现了⾼效的表关联查询6.多平台⽀持,部署和实施简单缺点:1.mycat不⽀持⼆维路由,仅⽀持单库多表或多库单表由于⾃定义连接池,这样就会存在mycat⾃⾝维护⼀个连接池,MySQL也有⼀个连接池,任何⼀个连接池上限都会成为性能的瓶。
3.tidb优点:1 .⾼度兼容 MySQL ⼤多数情况下,⽆需修改代码即可从 MySQL 轻松迁移⾄ TiDB,分库分表后的 MySQL 集群亦可通过 TiDB ⼯具进⾏实时迁移。
mycat面试题
1.什么叫混合切分答:项目组中如果有水平切分,那项目组里的开发方式就叫混合切分。
或者项目组里就是单纯的垂直切分。
2.在项目组中,切分后的库从哪里而来?答:在开发中是基于原有库创建出来,并且原有库和切分后的库是数据表的设计是保持一致的。
dm_order1,dm_order2,dm_order3这些库是需要和dm_order的设计保持一致的!!!!附注:所以,切分后的库例如dm_order1,dm_order2,dm_order3这些都是有数据库维护团队创建出来的。
3.搭建mycat的核心配置文件有哪些?答:schem.xml 配置参数:逻辑库,逻辑表,数据节点。
节点主机rule.xml:分片规则server.xml:连接mycat的用户信息(账号和密码)这里是使用中间件做数据切分,感兴趣的小伙伴还可以了解一下mysql的分库分表高可用方案IT架构师luke:Mysql分库分表面试题(mysql高可用方案解析)7 赞同·1 评论文章4.mycat分库可以分成100个库吗?答:我们目前项目组分的是3个库,我们说一般数据量大的话我们使用的是mycat中间件进行分片处理,如果更大的话,我们可以使用oracle数据库,如果更大的话可以使用hadoop 或是云存储数据,不需要mycat作为工具手段。
衡量的标准是项目有没有对应的硬件设备。
如果没有,基本就是使用mysql 因为搭建一套云环境或者大数据的环境基本都是超大型的公司。
比如大数据中的所有的技术,例如hbase 或者是一大堆的服务器一大堆的网络路由设备或是私有云。
或者是一大堆的数据库运维实施人员都是成本5.进行库表拆分时,拆分规则怎么取舍?1.不存在热点数据时,则使用连续分片2.存在热点数据时,使用离散分片或者是综合分片3.离散分片暂时迁移比较麻烦(但是mycat给出了数据迁移的脚本,虽然现在还是不是很完美),综合分片占用总机器数量多6.Mycat中全局ID方案有哪些?程序自定义全局ID的方案有哪些?1.mycat的全局id方案(1)本地文件方式sequnceHandlerType = 0配置sequence_conf.properties使用next value for MYCATSEQ_XXX(2)数据库方式sequnceHandlerType = 1配置sequence_db_conf.properties使用next value for MYCATSEQ_XXX或者指定autoIncrement(3)本地时间戳方式ID= 64 位二进制(42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)sequnceHandlerType = 2配置sequence_time_conf.properties指定autoIncrement2. 程序方式(1)Snowflake(2)UUID(3)Redis7.mycat是怎样实现分库分表的?mycat里面通过定义路由规则来(路由规则里面会定义分片字段,以及分片算法)。
MySql之Mycat和Sharding-jdbc的区别
MySql之Mycat和Sharding-jdbc的区别⼀、Mycat和Sharding-jdbc的区别1)mycat是⼀个中间件的第三⽅应⽤,sharding-jdbc是⼀个jar包2)使⽤mycat时不需要改代码,⽽使⽤sharding-jdbc时需要修改代码Mycat(proxy中间件层):Sharding-jdbc(TDDL为代表的应⽤层):⼆、Mycat分⽚join在前⾯的⽂章中,已经说过分库分表需要应对的技术难题有如下⼏个:1.)分布式全局唯⼀id2.)分⽚规则和策略3.)跨分⽚技术问题4.)跨分⽚事物问题下⾯我们来看⼀下Mycat是如何解决跨分⽚技术问题——分⽚join的1. 使⽤全局表⽅式解决跨分⽚join问题1.1 先在server.xml⾥⾯全局表⼀致性检测<property name="useGlobleTableCheck">1</property> <!-- 1为开启全局表⼀致性检测、0为关闭 -->1.2 在schema.xml⾥⾯配置全局表<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />全局表说明:1)全局表的插⼊、更新操作会实时在所有节点上执⾏,保持各个分⽚数据的⼀致性2)全局表的查询操作只从⼀个节点上获取3)全局表可以跟任何⼀个表进⾏join操作2. 使⽤Share Join⽅式解决跨分⽚join问题Share Join是⼀个简单的跨分⽚join,基于HBT(Human Brain Tech)的⽅式实现。
原理:解析SQL语句,拆分成单表的SQL语句执⾏,然后把各个节点的数据汇集。
⽰例:/*!mycat:catlet=io.mycat.catlets.ShareJoin*/select * from employee a, employee_detail b where a.id = b.id;说明:⽬前只⽀持两张分⽚表的Join,如果要⽀持多张表需要⾃⼰改造程序代码或者改造Mycat的源代码对应Mycat源码:io.mycat.catlets.ShareJoinio.mycat.catlets.Catletpublic class ShareJoin implements Catlet3. 使⽤ER Join⽅式解决跨分⽚join问题ER表也叫⽗⼦表,⼦表存储在哪个分⽚上依赖于⽗表的存储位置,并且和⽗表存储同⼀个分⽚上,即⼦表的记录与所关联的⽗表记录存放在同⼀个数据分⽚上,从⽽解决跨库join的问题在schema.xml⾥⾯的配置<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile"><childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id"><childTable name="order_items" joinKey="order_id" parentKey="id" /></childTable><childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /></table>说明:childTable:标签⽤来声明⼦表:joinKey:声明⼦表的那个字段和⽗表关联parentKey:声明⽗表的关联主键primaryKey:⽗表⾃⾝的主键三、Mycat分页中的坑Mycat分页的⼤坑⼀定要注意:在对应的分⽚上去查询分页数据的时候是从第⼀条记录开始扫描,然后再取出对应的分页数据,如SELECT * FROM customer ORDER BY id LIMIT 1000100, 100;这个sql语句被Mycat转化后1 -> dn1{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}2 -> dn2{SELECT * FROM customer ORDER BY id LIMIT 0, 1000100}所以要在Mycat的server.xm⾥⾯开启使⽤⾮堆内存。
MyCat配置详解
MyCat配置详解MyCat配置1. server.xml配置Server.xml保存了mycat需要的所有的系统配置信息,代码映射为SystemConfig类。
标签主要有三个:system,user,firewarll1.1 user标签1.1.1 property标签<user name="test"> <!--⽤户名是test--><property name="password">password</property><!--密码是password--><property name="schemas">TESTDB</property><!-- 使⽤的schema是TESTDB-->⽰例说明test⽤户密码是testdb1, db2可访问的schema有db1,db2true是否只读11111连接上限,降级权值0是否对密码加密默认 0 否如需要开启配置 1,1.1.2 privileges标签对⽤户的 schema以及表进⾏精细化的DML权限控制。
<privileges check="false">check表⽰是否开启DML权限检查。
默认是关闭。
dml顺序说明iinsert,update,select,delete<schema name="db1" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema>db1的权限是update,select。
mycat2建立数据库语法
mycat2建立数据库语法Mycat2是一个开源的分布式数据库中间件,它可以将多个数据库服务器组合成一个逻辑上的数据库集群,提供高可用性和负载均衡的功能。
在使用Mycat2建立数据库时,我们需要掌握一些基本的语法。
首先,我们需要在Mycat2的配置文件中定义数据库集群的基本信息。
配置文件一般为mycat.yml,其中包含了数据库服务器的连接信息、分片规则、读写分离策略等。
在配置文件中,我们需要定义数据库服务器的地址、端口号、用户名和密码等信息,以便Mycat2能够正确连接到数据库服务器。
接下来,我们需要定义逻辑数据库和逻辑表。
逻辑数据库是由多个物理数据库组成的,而逻辑表是由多个物理表组成的。
在Mycat2中,我们可以通过配置文件来定义逻辑数据库和逻辑表的映射关系。
例如,我们可以将两个物理数据库的表映射为一个逻辑表,或者将一个物理表映射为多个逻辑表。
在定义完逻辑数据库和逻辑表之后,我们可以使用SQL语句来创建和管理数据库。
Mycat2支持大部分标准的SQL语法,包括创建数据库、创建表、插入数据、更新数据、删除数据等操作。
例如,我们可以使用以下语句来创建一个数据库:CREATE DATABASE mydb;然后,我们可以使用以下语句来创建一个表:CREATE TABLE mytable (id INT PRIMARY KEY,name VARCHAR(50));接着,我们可以使用以下语句来插入数据:INSERT INTO mytable (id, name) VALUES (1, 'John');除了标准的SQL语法之外,Mycat2还提供了一些特殊的语法来支持分片和读写分离功能。
例如,我们可以使用以下语句来定义分片规则:CREATE SHARDING RULE myrule (TABLE mytableCOLUMN idALGORITHM MOD);这样,Mycat2会根据id的值来将数据分散到不同的物理数据库中。
Mycat常见问题与解决方案
Mycat常见问题与解决⽅案转载于:1 Mycat⽬前有哪些功能与特性?答:• ⽀持 SQL 92标准• ⽀持Mysql集群,可以作为Proxy使⽤• ⽀持JDBC连接多数据库• ⽀持NoSQL数据库• ⽀持galera for mysql集群,percona-cluster或者mariadb cluster,提供⾼可⽤性数据分⽚集群• ⾃动故障切换,⾼可⽤性• ⽀持读写分离,⽀持Mysql双主多从,以及⼀主多从的模式• ⽀持全局表,数据⾃动分⽚到多个节点,⽤于⾼效表关联查询• ⽀持独有的基于E-R 关系的分⽚策略,实现了⾼效的表关联查询• ⽀持⼀致性Hash分⽚,有效解决分⽚扩容难题• 多平台⽀持,部署和实施简单• ⽀持Catelet开发,类似数据库存储过程,⽤于跨分⽚复杂SQL的⼈⼯智能编码实现,143⾏Demo完成跨分⽚的两个表的JION查询。
• ⽀持NIO与AIO两种⽹络通信机制,Windows下建议AIO,Linux下⽬前建议NIO• ⽀持Mysql存储过程调⽤• 以插件⽅式⽀持SQL拦截和改写• ⽀持⾃增长主键、⽀持Oracle的Sequence机制2 Mycat除了Mysql还⽀持哪些数据库?答:mongodb、oracle、sqlserver 、hive 、db2 、 postgresql。
3 Mycat⽬前有⽣产案例了么?答:⽬前Mycat初步统计⼤概600家公司使⽤。
4 Mycat稳定性与Cobar如何?答:⽬前Mycat稳定性优于Cobar,⽽且⼀直在更新,Cobar已经停⽌维护,可以放⼼使⽤。
5 Mycat⽀持集群么?答:⽬前Mycat没有实现对多Mycat集群的⽀持,可以暂时使⽤haproxy来做负载,或者统计硬件负载。
6 Mycat多主切换需要⼈⼯处理么?答:Mycat通过⼼跳检测,⾃主切换数据库,保证⾼可⽤性,⽆须⼿动切换。
7 Mycat⽬前有多少⼈开发?答:Mycat⽬前开发全部是志愿者⽆偿⽀持,主要有以leaderus 为⾸的Mycat-Server 开始、以rainbow为⾸的Mycat-web开发、以海王星为⾸的产品发布及代码管理,还有以Marshy为⾸的推⼴。
mycat 原理
mycat 原理Mycat原理。
Mycat是一个开源的分布式数据库中间件,它是为了解决MySQL数据库的扩展性和高可用性而设计的。
Mycat可以将多个MySQL数据库组合成一个逻辑的数据库集群,从而实现数据的分片存储和负载均衡。
在本文中,我将介绍Mycat的原理及其工作机制。
Mycat的原理主要包括分片规则、路由规则和SQL解析。
首先,分片规则是指将数据按照一定的规则分散到不同的数据库节点上,这样可以实现数据的水平分片存储。
其次,路由规则是指根据SQL语句的特征将请求路由到相应的数据库节点上,从而实现负载均衡和高效的数据访问。
最后,SQL解析是指解析SQL语句,根据分片规则和路由规则将SQL请求转发到相应的数据库节点上,并将结果返回给客户端。
Mycat的工作机制主要包括SQL拦截、路由分发和结果集合并。
首先,SQL拦截是指Mycat拦截客户端的SQL请求,然后根据路由规则将请求路由到相应的数据库节点上。
其次,路由分发是指Mycat将SQL请求分发到各个数据库节点上,并将结果集合并后返回给客户端。
最后,结果集合并是指Mycat将各个数据库节点返回的结果集进行合并,然后返回给客户端,从而实现透明的数据访问。
总的来说,Mycat的原理和工作机制都是围绕着数据分片存储、负载均衡和高可用性展开的。
通过分片规则、路由规则和SQL解析,Mycat可以实现数据的水平分片存储和高效的数据访问。
通过SQL拦截、路由分发和结果集合并,Mycat 可以实现负载均衡和高可用性。
因此,Mycat在大数据时代具有重要的意义,它可以帮助企业解决数据库的扩展性和高可用性问题,从而提高数据访问的效率和可靠性。
总之,Mycat作为一个开源的分布式数据库中间件,其原理和工作机制都非常复杂和精妙。
通过深入理解Mycat的原理和工作机制,我们可以更好地应用Mycat 来解决数据库的扩展性和高可用性问题,从而更好地满足企业的数据访问需求。
希望本文对你理解Mycat有所帮助。
mycat的原理
mycat的原理
"MyCat" 是一个开源的Java分布式数据库解决方案,它基于分布式数据库管理系统(DBMS)进行开发和构建。
以下是MyCat的主要原理:
1. 数据分片:MyCat通过将数据按照一定的规则进行分片,将数据分散存储在不同的数据库节点上。
这样可以提高数据的读取和写入速度,并且可以实现水平扩展。
2. 数据路由:当客户端发送请求时,MyCat根据事先设定的规则将请求路由到对应的数据库节点上。
这样可以避免单一数据库节点成为瓶颈,提高整体系统的性能。
3. 数据复制:MyCat支持主从复制和多主复制,将数据从一个数据库节点复制到另一个或多个数据库节点上。
这样可以提高数据的可靠性和容错性,同时也可以分担读取压力。
4. 数据缓存:MyCat内部维护了一个内存缓存,将频繁访问的数据存储在内存中,以提高数据的读取速度。
同时,MyCat还支持与外部缓存系统(如Redis)的集成,提供更高级别的缓存功能。
5. SQL解析和优化:MyCat对客户端发来的SQL进行解析和优化,可以将SQL转换成对底层数据库最优的查询语句。
这样可以提高查询的效率和性能。
总结起来,MyCat通过数据分片、数据路由、数据复制、数据
缓存、SQL解析和优化等技术手段,实现了一个分布式数据库的解决方案,提高了数据库的性能、可靠性和可扩展性。
mycat的使用
mycat的使用
Mycat是一款开源的分布式数据库中间件,可以用于MySQL、MariaDB、Oracle等关系型数据库。
它提供了数据分片、读写分离、负载均衡、高可用等功能。
Mycat的使用可以大大提高数据库的性能和可用性。
它可以将数据分片存储在不同的节点上,从而提高数据的读写速度和并发能力。
同时,它可以将读操作和写操作分配到不同的节点上,从而实现读写分离,减轻数据库的负担。
此外,Mycat还支持主从同步和自动故障转移,保证数据库的高可用性。
要使用Mycat,需要进行以下步骤:
1. 下载Mycat并解压缩到任意目录。
2. 修改Mycat的配置文件,包括server.xml、schema.xml、rule.xml等,配置数据源、分片规则、读写分离等。
3. 启动Mycat的管理端口,通过管理端口管理Mycat的运行状态和配置。
4. 将应用程序的连接信息指向Mycat,从而实现对数据库的访问。
需要注意的是,Mycat需要对应用程序进行一定的改造,包括修改连接字符串、使用Mycat提供的SQL语法等。
此外,Mycat还有一些限制和不足之处,需要根据具体情况进行权衡和选择。
总之,Mycat是一款非常有用的数据库中间件,可以大大提高数据库的性能和可用性。
使用Mycat需要一定的技术水平和实践经验,
但只要按照要求进行配置和使用,就可以获得显著的效果。
sql 语句的exception
在SQL中,当执行SQL语句时可能会出现多种异常情况,常见的SQL异常包括但不限于:
1. 语法错误:当SQL语句的语法不正确时,会抛出语法错误异常。
这通常是由于拼写错误、错误的关键字使用或者错误的语法结构导致的。
2. 数据库连接异常:当连接数据库时出现问题,比如数据库服务器不可用、网络连接问题等,会抛出数据库连接异常。
3. 数据库访问异常:当执行SQL语句时出现数据库访问问题,比如表不存在、字段不存在、权限不足等,会抛出数据库访问异常。
4. 数据完整性异常:当违反了数据库的数据完整性约束,比如主键重复、外键约束失败等,会抛出数据完整性异常。
5. 数据类型转换异常:当尝试将一个数据类型转换为另一个数据类型时出现问题,比如字符串无法转换为数字,会抛出数据类型转换异常。
在Java等编程语言中,通常会通过try-catch语句来捕获SQL异常,并进行相应的处理。
例如:
try {
// 执行SQL语句
// ...
} catch (SQLException e) {
// 捕获SQL异常
e.printStackTrace();
// 处理异常
}
不同的编程语言和数据库操作接口对SQL异常的处理方式可能会有所不同,但通常都提供了相应的机制来捕获和处理SQL异常。
如果您有特定的SQL异常情况需要处
理,可以提供更具体的信息,我可以为您提供更详细的帮助。
Mysql中错误使用SQL语句Groupby被兼容的情况
Mysql中错误使⽤SQL语句Groupby被兼容的情况⾸先创建数据库hncu,建⽴stud表格。
添加数据:create table stud(sno varchar(30) not null primary key,sname varchar(30) not null,age int,saddress varchar(30));INSERT INTO stud VALUES('1001','Tom',22,'湖南益阳');INSERT INTO stud VALUES('1002','Jack',23,'益阳');INSERT INTO stud VALUES('1003','李⽩',22,'益阳');INSERT INTO stud VALUES('1004','王五',24,'中国北京');INSERT INTO stud VALUES('1005','张三',22,'益阳');INSERT INTO stud VALUES('1006','张四',23,'益阳');INSERT INTO stud VALUES('1007','李四',22,'湖南益阳');INSERT INTO stud VALUES('1008','刘备',24,'北京');执⾏语句如下:<喎�"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:sql;"> SELECT * FROM stud GROUP BY saddress;显⽰了如下错误:ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'hncu.stud.sno' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by再执⾏此句:SELECT saddress as 平均年龄 FROM stud GROUP BY saddress;-没有问题然后我们⽤MySQL,再执⾏前⾯那句错误的代码:也就是:SELECT * FROM stud GROUP BY saddress;我们看结果:顺利的通过了,但是,你发现没有,前⾯的smo,sname,age,这3列的数据不对啊,没错,MySQL强⾏显⽰第⼀次查找到的saddress不同的⾏了其实这个结果是不对,但是MySQL应该是兼容了这个错误!⽽DOS却是严格按照SQL的语法来的。
mysql、oracle分库分表方案之sharding-jdbc使用(非demo示例)
mysql、oracle分库分表⽅案之sharding-jdbc使⽤(⾮demo⽰例)选择开源核⼼组件的⼀个⾮常重要的考虑通常是社区活跃性,⼀旦项⽬团队⽆法进⾏⾃⼰后续维护和扩展的情况下更是如此。
⾄于为什么选择sharding-jdbc⽽不是Mycat,可以参考知乎讨论帖⼦https:///question/64709787。
还可以参考https:///u013898617/article/details/79615427。
关于分库分表和读写分离、主从⼀般来说,需要分库分表的系统是流量⽐较⼤的,⽽且⽐较容易出现峰值的⽐如说打折/活动的时候;其次,当单机扛不住业务流量的时候,分库分表⼀定不是第⼀选择,在分库分表之前,应该先保证垂直拆分完成了,⼦系统内都是⾼内聚的,其次基于Master-Slave的读写分离或者模糊查询很多的,可能NoSQL⽐如elastic就引流去很⼤⼀部分了。
当读写分离也做完了,主库只剩下关键业务逻辑之后,流量还是很⾼,这个时候才开始考虑分库分表。
因为相对于读写分离、垂直拆分,分库分表对开发和运维的要求多得多,如果确定业务⼀两年内不会剧增的,盲⽬引⼊只会导致成本⾼昂(尤其是各种SQL限制)。
其次,分库分表会增加N倍的数据库服务器,⼀般来说是4的倍数,如果某个应⽤说要做分库分表,⼜只有两台机器,那完全就是凑热闹。
读写分离和分库分表应该来说是前后的两件事⽐较合理,不少⼈将这两个事情混到⼀起去讲准确的说不合理的。
分库分表通常更多的是⽤于纯粹的OLTP的事情,让系统可以⽔平扩展。
⽽读写分离更多的是为了把⼀部分可以容忍短时延迟/不保证100%(但应该在99%以上)准确的查询路由到查询库,准确的说是对业务根据优先级做个归类,这些查询从资源消耗的⾓度来说相对逻辑上的PK查询要⾼⼏倍到数百倍,⽐如说查询某个⼈过去3个⽉的交易情况,但他从业务⾓度并不算是DSS概念,⽐如说查询已经T-N的订单/针对这些订单进⾏导出,并针对这个单⼦可能会进⾏⼀些操作,甚⾄⼈⼯修改状态。
MyCat-schema.xml详解
MyCat-schema.xml详解⼀、概念与图⽰schema.xml配置的⼏个术语与其关系图⽰:⼆、schema 标签schema 标签⽤于定义 MyCat 实例中的逻辑库,如:<schema name="USERDB" dataNode="dn1" checkSQLschema="false" sqlMaxLimit="100">1. name属性配置逻辑库的名字(即数据库实例名);2. dataNode属性⽤于配置该逻辑库默认的分⽚。
没有通过table标签配置的表,就会⾛到默认的分⽚上。
这⾥注意没有配置在table标签的表,⽤⼯具查看是⽆法显⽰的,但是可以正常使⽤。
如果没有配置dataNode属性,则没有配置在table标签的表,是⽆法使⽤的。
注意,dual表在mycat中,也被视为⼀个表。
查询:select sysdate() from dual LIMIT 0, 1000错误代码: 1064can't find table define in schema DUAL schema:USERDB另外,通过mycat建表,⽽该表并没有提前配置table标签,则mycat会找到默认的dataNode,并把表建在默认的dataNode上。
如果没有配置默认dataNode,则mycat会报错。
查询:create table test(id varchar(10))错误代码: 1064op table not in schema----TEST⽽如果该表有配置table标签,则表会分别在table标签指定的dataNode上建表。
3. checkSQLschema属性boolean类型。
当前端执⾏【select *from USERDB.tf_user;】时(表名前指定了mycat逻辑库名),两种取值:true:mycat会把语句转换为【select * from tf_user;】false:会报错查询:SELECT * FROM USERDB.tf_user LIMIT 0, 1000错误代码: 1064find no Route:SELECT * FROM USERDB.tf_user LIMIT 0, 10004. sqlMaxLimit属性相当于sql的结果集中,加上【limit N】。
数据库相关中间件介绍
数据库相关中间件介绍这⾥主要介绍互联⽹⾏业内有关数据库的相关中间件。
数据库相关平台主要解决以下三个⽅⾯的问题:为海量前台数据提供⾼性能、⼤容量、⾼可⽤性的访问为数据变更的消费提供准实时的保障⾼效的异地数据同步应⽤层通过分表分库中间件访问数据库,包括读操作(Select)和写操作(update, insert和delete等,DDL, DCL)。
写操作会在数据库上产⽣变更记录,MySQL的变更记录叫binlog, Oracle的称之为redolog, 增量数据订阅与消费中间件解析这些变更,并以统⼀的格式保存起来,下层应⽤根据这些数据进⾏消费应⽤。
当然,在数据库与数据库本⾝之间也会有数据库迁移的操作,这种操作可以不需要增量数据订阅与消费中间件的数据,⽽可以⾃⾏处理。
数据库中间件有以下⼏种:分布式数据库分表分库数据增量订阅与消费数据库同步(全量、增量、跨机房、复制)跨数据库(数据源)迁移整个产品族图如下:最上层的是分布式数据库分表分库中间件,负责和上层应⽤打交道,对应⽤可表现为⼀个独⽴的数据库,⽽屏蔽底层复杂的系统细节。
分布式数据库中间件除了基本的分表分库功能,还可以丰富⼀下,⽐如讲读写分离或者⽔平扩容功能集成在⼀起,或者⽐如读写分离本⾝也可以作为⼀个独⽴的中间件。
(Cobar, MyCAT, TDDL, DRDS, DDB)增量数据订阅和消费,⽤户对数据库操作,⽐如DML, DCL, DDL等,这些操作会产⽣增量数据,下层应⽤可以通过监测这些增量数据进⾏相应的处理。
典型代表Canal,根据MySQL的binlog实现。
也有针对Oracle(redolog)的增量数据订阅与消费的中间件。
(Canal, Erosa)数据库同步中间件涉及数据库之间的同步操作,可以实现跨(同)机房同步以及异地容灾备份、分流等功能。
可以涉及多种数据库,处理之后的数据也可以以多种形式存储。
(Otter, JingoBus, DRC)数据库与数据库之间会有数据迁移(同步)的动作,同款数据同步原理⽐较简单,⽐如MySQL主备同步,只要在数据库层进⾏相应的配置既可,但是跨数据库同步就⽐较复杂了,⽐如Oracle->MySQL. 数据迁移⼀般包括三个步骤:全量复制,将原数据库的数据全量迁移到新数据库,在这迁移的过程中也会有新的数据产⽣;增量同步,对新产⽣的数据进⾏同步,并持续⼀段时间以保证数据同步;原库停写,切换新库。
mycat分库分表配置
mycat分库分表配置1.什么是分库分表在同⼀个系统(项⽬)中,把⼀张数据⽐较多的表放到不同的集群节点上,这种模式就称之为分库分表2.需求使⽤mycat实现分库分表(HDFS:namenode datanode secondarynamdenode)在整个mycat中也会使⽤到namenode和datanodemysql01服务器(linux)192.168.152.147: mysql数据库 TEACH(真实的库) book(表)mysql02服务器(linux)192.168.152.148: mysql数据库 TEACH(真实的库) book(表)使⽤mycat(192.168.152.149)把数据分别存放在两个student中,也就是说这两张student表合在⼀起才是⼀个完整的数据表 mycat --> mysql01存⼊⼀条数据 mycat --> mysql02存⼊⼀条数据 依次交替3.配置mycat3.1.规定linux的⽤户名和全名不能叫mycat!!!否则mycat会不⽣效(原因是影响整个linux系统的环境变量导致mycat的配置环境变量没有⽣效) 3.2.vim /etc/sysconfig/network也不能叫mycat3.3.mycat使⽤的是Java语⾔编写-->所以必须要在linux上配置jdk(要求jdk必须为64位,因为mycat是在64位的jdk8上进⾏编译的)3.4.配置jdk3.5.使⽤xftp把mycat的压缩包上传到linux服务器上3.6.解压mycat压缩包tar -zxvf xxxxx3.7.配置mycat的环境变量3.8.启动mycat 进⼊mycat的bin⽬录./mycat console 或者在任意的位置直接使⽤(需配置环境变量)mycat console start | stop | restart | status | dumpmycat console 类似于IDEA中控制台,mycat会把⽇志打印出来mycat start 就是正常启动⼀般情况下推荐使⽤console启动⼀旦启动mycat就关不掉,kill -9关不掉除⾮重启或者关机看到以下信息说明启动成功:jvm 1 | MyCAT Server startup successfully. see logs in logs/mycat.log4.mycat的三个核⼼配置⽂件所有的读写分离/分库分表都必须要在这三个配置⽂件完成mycat的conf⽬录server.xml: 配置了mycat的⽤户(账号:root 密码:root) --> 账号和密码可以根据情况随意更改 相当于mysql的⽤户(账号:root 密码:root) mycat也是可以直接使⽤数据库连接软件进⾏连接的<!--整个user标签中就是配置了mycat的账号和密码name===》就是mycat的账号defaultAccount====》表⽰该账号为管理员账号,⽽且只能出现⼀次property:属性标签password===》就是name的密码⽆论是账号还是密码都可以随意定制,开⼼就好!!!readOnly:只读(该账号只能查询数据,不能写⼊数据)schemas:指向的是mycat的数据库(mycat的虚拟库!!!这个库并不是真实存在的,是需要通过mysql的数据库进⾏映射的),⼀个mycat中可以有多个schema 隐藏mysql的真实库的名字连接mysql:jdbc:mysql:localhost:3306/数据库名连接mycat:jdbc:mysql:ip地址:端⼝号/mycat的虚拟库名schemas中的配置和mysql的数据库可以⼀样,也可以不⼀样--><user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">TEACH</property></user>rule.xml: mycat的规则<!--所有的规则配置⼀个tableRule对应⼀个function,如果需要进⾏配置必须要配置⼀对,不能单独配置⼀个(如果单独配置了⼀个的情况下,mycat启动的时候会直接报错)⼀共有⼗种规则:homework1:百度把这10种规则全部弄明⽩,然后整理⼀份⽤⾃⼰语⾔描述的电⼦⽂档mod-long:(轮询)mysql01mysql数据库teachstudentmysql02mysql数据库teachstudent当客户端发送请求===插⼊数据===》mycat===请求mysql===》会把第⼀条数据插⼊进mysql01,会把第⼆条数据插⼊进mysql02依次循环--><tableRule name="mod-long"><rule><columns>id</columns><algorithm>mod-long</algorithm></rule></tableRule><function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!--代表了datanode的节点数量如果只有两台datanode就必须要写2--><property name="count">2</property>schema.xml: 实现了读写分离和分库分表的具体配置<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><!--!!!schema标签的name属性值必须要和server.xml中的schames保持⼀致!!!schema就类似于mysql的数据库checkSQLschema:检查SQL语句是否错误(select * from user wher id = 1)默认值为false,不需要改为true,把对SQL语句的检查交给mysql处理sqlMaxLimit:最⼤执⾏SQL语句的数量⼀次性可以执⾏多少条SQL语句在schame标签中有table标签,这个标签就是定义了mycat中的表类似于mysql数据库中的表和mysql中的表名可以重复也可以不⼀致dataNode:数据节点在HDFS中存放数据在mycat中映射的就是真实mysql数据库(可以有多个,也可以只有⼀个),名字可以随意起今天的⽬标是实现分库分表,需要⽤到两台mysql数据库,所以只需要配置dn1和dn2rule:配置规则配置⼀定要和rule.xml中保持⼀致--><schema name="TEACH" checkSQLschema="false" sqlMaxLimit="100"><!-- auto sharding by id (long) --><table name="book" dataNode="dn1,dn2" rule="mod-long" /></schema><!--datanode标签对应的是table标签中的datanode属性也就是说datanode属性值必须要和dataNode的标签name属性值保值⼀致dn1:代表了mysql01服务器==》mysql数据库dn2:代表了mysql02服务器==》mysql数据库dataHost:才是真正的配置了分库分表和读写分离的核⼼配置database:映射的是真实mysql的数据库名--><dataNode name="dn1" dataHost="localhost1" database="TEACH" /><dataNode name="dn2" dataHost="localhost2" database="TEACH" /><!--dataHost标签必须要和dataNode标签中的dataHost属性保持⼀致如果dataHost属性名重复了,映射的是同⼀个dataHost每⼀个dataHost标签就是⼀个真实的mysql数据库maxCon:最⼤连接数minCon:最⼩连接数balance: homework2:把balance,writeType,switchType弄明⽩,并且⽤⾃⼰的语⾔描述每个值代表什么意思,记录电⼦⽂档负载均衡writeType:写⼊的类型(读写分离使⽤)switchType:转换的类型(读写分离所使⽤的数据)dbType:数据库的类型(在最早的版本mycat只⽀持mysql⼀种数据库,后来发展⽀持很多种数据库)dbDriver:数据库驱动(使⽤本地驱动,使⽤的是mycat所提供的驱动)slaveThreshold:⾃⼰查!!!!master:主节点slave:从节点threshold:⼊⼝--><dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><!--heartbeat:⼼跳mycat⼀直在监视mysql的user表(⼼跳),如果⼀旦发现mysql的user不再有⼼跳,就会认为这⼀台mysql处于宕机状态,也就不会再向这⼀台mysql进⾏做增删改查的操作 --><heartbeat>select user()</heartbeat><!--writeHost:标签是该台mysql数据库为读和写的数据库readHost:标签是该台mysql数据库为读的数据库writeHost如果单独存在,标识该台mysql数据库为读和写的操作如果⼀旦和readHost⼀起使⽤,writeHost就只能做些的操作,所有的读操作都使⽤readHost完成readHost必须要配置在writeHost的内容,不允许单独存在host:属性只是标识了该台数据库的操作的内容,可以随意定义url:数据库的urljdbc:mysql://localhost:3306!!!!!如果配置了两个writeHost,那么host的值就必须不能重复!!!!!--><writeHost host="write01" url="192.168.23.129:3306" user="root"password="root" /><dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="write02" url="192.168.23.130:3306" user="root"password="root" /></dataHost><!--mycat中所映射的真实mysql的表必须要mycat所声明的table的名字保持⼀致也就是说mycat的表名必须要和mysql的表名⼀模⼀样,否则映射不到--></mycat:schema> 其实mycat也可以看成是⼀个数据库,只是这个数据库是虚拟的,把真实的mysql数据中的表数据映射进了虚拟库中,使⽤Java项⽬连接的时候只需要连接mycat即可,不再需要连接mysql启动成功后可以直接使⽤数据库连接⼯具连接mycatmycat的dbType配置的是什么数据库,就使⽤这⼀种数据库进⾏连接即可mycat有两个端⼝号: 9066:管理端⼝号(管理mycat使⽤的) 8066:通讯端⼝号(连接端⼝号)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MyCat不支持的SQL语句
已知的MyCat不支持的SQL语句类型如下(不完全统计,后续会更新):
SELECT:
跨分片(实体库)的交叉查询
跨节点的联合查询(如用户库的表和平台库的表做联合查询)
INSERT:
插入的字段不包含分片字段(如插入tbl_user_base_info表,没有提供user_id列)
插入的分片字段找不到对应分片
复制插入Insert into…select…
多行插入insert into tab_a(c1,c2) values(v1,v2),(v11,v21)…
UPDATE:
更新的列包含分片列
多表更新update a, b set a.nation=’China’, b.pwd=’123456’ where a.id=b.id
复杂更新update a, b set a.nation=’China’ where a.id=b.id; 但支持子查询方式update a set a.nation=’China’ where id in (select id from b); DELETE:
复杂删除delete a from a join b on a.id=b.id; 支持子查询方式delete from a where a.id in (select id from b), 但表不能起别名
其它:
Call procedure() MyCat未支持存储过程定义, 因而不允许调用存储过程,但可通过注解来调用各个分片上的存储过程
Select func(); 不支持这种方式直接调用自定义函数,但支持select id, func() from employee 只需employee所在的所有分片上存在这个函数。
MySql自带函数可随意使用。
注意事项:
Order by字段必须出现在select中(MyCat先将结果取出,然后排序)
Group by务必使用标准语法select count(1),type from tab_a group by type;
MyCat的一些自带函数sum,min,max等可以正确使用,但多分片执行的avg有bug,执行的结果是错误的
谨慎使用子查询,外层查询没有分片查询条件,则会在所有分片上执行(子查询内外层的表一样较为特殊)。