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 为首的推广。
8、Mycat 目前有哪些项目?
答:Mycat-Server :Mycat 核心服务、
Mycat-spider : Mycat 爬虫技术、
Mycat-ConfigCenter :Mycat 配置中心 、
Mycat-BigSQL : Mycat 大数据处理(暂未更细)、
Mycat-Web : Mycat 监控及 web(新版开发中) 、
Mycat-Balance :Mycat 集群负载(暂未更细)
9、Mycat 最新的稳定版本是哪个到哪里下载?
答:打包代码:Mycat 最新稳定版是 1.5.1 ,1.6 为 aphla,下载地址是:
https://github.com/MyCATApache/Mycat-download。
文档:https://github.com/MyCATApache/Mycat-doc
源码:https://github.com/MyCATApache/Mycat-Server
10、Mycat 如何配置字符集?
答:在配置文件 server.xml 配置,默认配置为 utf8。
<system>
<property name="charset">utf8</property>
</system>
11、Mycat 后台管理监控如何使用?
答:9066 端口可以用 JDBC 方式执行命令,在界面上进行管理维护,也可以通过命令行查看命令行操作。命令行操作是:mysql -h127.0.0.1 -utest -ptest -P9066 登陆,然后执行相应命令。
12、Mycat 主键插入后应用如何获取?
答:获得自增主键,插入记录后执行 select last_insert_id()获取。
13、Mycat 如何启动与加入服务?
答:目前 Mycat 暂未封装加入服务,需要自己封装。
linux 环境为:
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态
window 启动为:
直接双击运行 startup_nowrap.bat ,如果闪退用 cmd 模式运行查看日志。
14、Mycat 运行 sql 时经常阻塞或卡死是什么原因?
答: 如果出现执行 sql 语句长时间未返回,或卡死,请检查是否是虚机下运行或 cpu 为单核,具体解决方式请参 考:https://github.com/MyCATApache/Mycat-Server/issues/73,如果仍旧无法解决,可以暂时跳过,目前有些环境阻塞卡死原因未知。
15、Mycat 中,旧系统数据如何迁移到 Mycat 中?
答:旧数据迁移目前可以手工导入,在 mycat 中提取配置好分配规则及后端分片数据库,然后通过 dump或 loaddata 方式导入,后续 Mycat 就做旧数据自动数据迁移工具。
16、Mycat 如何对旧分片数据迁移或扩容,支持自动扩容么?
答:目前除了一致性 hash 规则分片外其他数据迁移比较困难,目前暂时可以手工迁移,未提供自动迁移方案,具体迁移方案情况 Mycat 权威指南对应章节。
17、Mycat 支持批量插入吗?
答:目前 Mycat1.3.0.3 以后支持多 values 的批量插入,如 insert into(xxx) values(xxx),(xxx) 。
注意:批量插入与ID自增长结合的支持,主键不是自增,批量插入不需要加入注解,和普通插入一样,但是如果id为自增,并且批量插入需要加注解
/*!mycat:catlet=io.mycat.route.sequence.BatchInsertSequence */insert into user(name) values('XXX'),('XXX'),('XXX');
18、Mycat 支持多表 Join 吗?
答:注解方式,Mycat 目前支持 2 个表 Join,后续会支持多表 Join,具体 Join 请看 Mycat 权威指南对应章节。
19、Mycat 启动报主机不存在的问题?
答:需要添加 ip 跟主机的映射。
20、Mycat 连接会报无效数据源(Invalid datasource)?
答:例如报错:mysql> select * from company;
ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0
这类错误最常见是一些配置问题例如 schema.xml 中的 dataNode 的配置和实际不符合,请先仔细检查配置项,确保配置没有问题。如果不是配置问题,分析具体日志看出错原因,常见的有:如果是应用连:在某些版本的 Mysql 驱动下连接 Mycat 会报错,可升级最新的驱动包试下。如果是服务端控制台连,确认 mysql 是否开启远程连接权限,或防火墙是否设置正确,或者数据库
database 是否配置,或用户名密码是否正确。
21、Mycat 使用中如何提需求或 bug?
答:bug 或新需求可以到群里提问,同时最好到 github 发起以 isuues:
https://github.com/MyCATApache/Mycat-Server/issues
22、Mycat 如何建表与创建存储过程?
答:注意注解中语句是节点的表请替换成自己表如 select 1 from 表 ,查出来的数据在哪个节点就往哪个节点建存储过程
/*!mycat: sql=select 1 from 表 */ CREATE DEFINER=`root`@`%` PROCEDURE `proc_test`() BEGIN END ;
表:
/*!mycat: sql=select 1 from 表 */create table ttt(id int);
注意:当遇到MyCat不支持的SQL语句的时候,使用注解路由的指定分片,直接交个物理数据库执行该SQL语句,注解中推荐使用DQL语句,不建议使用DML语句,但是如果我们的DQL语句中指定了分片字段(条件),则直接路由到相应的数据节点,不会路由的所有的数据节点,如果条件不是分片字段,则我们的SQL也是会路由到所有的分片上执行的,如果不指定分片字段的话,也是是会在所有分片中执行的,如果分片字段范围(> < !=这些符号,如果在in,between and则不会走所有分片,使用between and但是分片字段的范围在两个分片上就会走两个分片、在一个分片上就会走一个分片,不会查询多余的其他分片,in的效果和between and的查询分片效果相同)的查询,则会走所有节点去检索。
23、Mycat 目前有多少人维护?
答:目前初步统计有 10 人以上核心人员维护。
24、Mycat 支持的或者不支持的语句有哪些?
答:不支持Insert into 中不指定字段名的SQL,复杂子查询,3 表及其以上跨库 join 等不支持。
25、MycatJDBC 连接报 PacketTooBigException 异常
答:检查 mysqljdbc 驱动的版本,在使用 mycat1.3 和 mycat1.4 版本情况下,不要使用 jdbc5.1.37 和 38版本的驱动,会出现如下异常报错:com.mysql.jdbc.PacketTooBigException: Packet for query is too large (60 > -1). You can change this value on the server by setting the max_allowed_packet' variable。建议使用 jdbc5.1.35 或者 36 的版本。
26、Mycat 中文乱码的问题
答:如果在使用 mycat 出现中文插入或者查询出现乱码,请检查三个环节的字符集设置:1)客户端环节(应用程序、mysql 命令或图形终端工具)连接 mycat 字符集 2)mycat 连接数据库的字符集 3)数据库(mysql,oracle)字符集。这三个环节的字符集如果配置一致,则不会出现中文乱码,其中尤其需要注意的是客户端连接 mycat 时使用的连接字符集,通常的中文乱码问题一般都由此处设置不当引出。其中 mycat 内部默认使用 utf8 字符集,在最初启动连接数据库时,mycat 会默认使用 utf8 去连接数据库,当客户端真正连接 mycat 访问数据库时,mycat 会使用客户端连接使用的字符集修改它连接数据库的字符集,在 mycat 环境的管理 9066 端口,可以通过 show @@backend 命令查看后端数据库的连接字符集,通过 show @@connection 命令查看前
端客户端的连接字符集。客户端的连接可以通过指定字符集编码或者发送 SET 命令指定连接 mycat 时
connection 使用的字符集,常见客户端连接指定字符集写法如下:
1)jdbcUrl=jdbc:mysql://localhost:8066/databaseName? characterEncoding=iso_1
2)SET character_set_client = utf8;用来指定解析客户端传递数据的编码
SET character_set_results = utf8;用来指定数据库内部处理时使用的编码
SET character_set_connection = utf8;用来指定数据返回给客户端的编码方式
3) mysql –utest –ptest –P8066 --default-character-set=gbk
27、Mycat 无法登陆 Access denied
答:Mycat 正常安装配置完成,登陆 mycat 出现以下错误:
[mysql@master ~]$ mysql -utest -ptest -P8066
ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: YES)
请检查在 schema.xml 中的相关 dataHost 的 mysql 主机的登陆权限,一般都是因为配置的 mysql 的用户登陆权限不符合,mysql 用户权限管理不熟悉的请自己度娘。只有一种情况例外,mycat 和 mysql 主机都部署在同一台设备,其中主机 localhost 的权限配置正确,使用-hlocalhost 能正确登陆 mysql 但是无法登陆 mycat 的情况,请使用-h127.0.0.1 登陆,或者本地网络实际地址,不要使用-hlocalhost,很多使用者反馈此问题,原因未明。
28、Mycat 的分片数据插入报异常 IndexOutofBoundException
答:在一些配置了分片策略的表进行数据插入时报错,常见的报错信息如下:
java.lang.IndexOutOfBoundsException:Index:4,size:3 这类报错通常由于分片策略配置不对引起,请仔细检查并理解分片策略的配置,例如:使用固定分片 hash 算法,PartitionByLong 策略,如果 schema.xml 里面设置的分片数量 dataNode 和 rule.xml 配置的 partitionCount 分片个数不一致,尤其是出现分片数量 dataNode 小于partitionCount 数量的情况,插入数据就可能会报错。很多使用者都没有仔细理解文档中对分片策略的说明,用默认 rule.xml 配置的值,没有和自己实际使用环境进行参数核实就进行分片策略使用造成这类问题居多。
29、Mycat ER 分片子表数据插入报错
答:一般都是插入子表时出现不能找到父节点的报错。报错信息如: [Err] 1064 - can't find (root) parent sharding node for sql:。此类 ER 表的插入操作不能做为一个事务进行数据提交,如果父子表在一个事务中进行提交,显然在事务没有提交前子表是无法查到父表的数据的,因此就无法确定 sharding node。如果是 ER 关系的表在插入数据时不能在同一个事务中提交数据,只能分开提交。
30、Mycat 最大内存无法调整至 4G 以上
答:mycat1.4 的 JVM 使用最大内存调整如果超过 4G 大小,不能使用 wrapper.java.maxmemory 参数,需要使用 wrapper.java.additional 的写法,注意将 wrapper.java.maxmemory 参数注释,例如增加最大内存至8G:wrapper.java.additional.10=-Xmx8G。
31、Mycat 使用过程中报错怎么办
答:记住无论什么时候遇到报错,如果不能第一时间理解报错的原因,首先就去看日志,无论是启动(wrapper.log)还是运行过程中(mycat.log),请相信良好的日志是编程查错的终极必杀技。日志如果记录信息不够,可以调整 conf/log4j.xml 中的 level 级别至 debug,所有的详细信息均会记录。另外如果在群里面提问,尽量将环境配置信息和报错日志提供清楚,这样别人才能快速帮你定位问题。