先说点题外话。我最早接触MyCAT是在一次分库分表的改造中,当时团队要把一张几千万行的订单表拆到多个MySQL实例上,手动改业务代码做路由又怕影响线上逻辑,评估了一圈最终选了MyCAT做中间层。测试环境用的就是Windows,装完折腾了一下午,踩了不少坑。后来在Linux上部署反而顺利得多——但Windows下摸索出来的这些经验,对初学阶段理解MyCAT的启动机制和配置方式其实很有帮助。这篇文章就把完整的安装、启动、验证过程写清楚,包括那些配置文件为什么要这么写、启动脚本选哪个、日志怎么看,以及最容易卡住人的几个问题。
1. 动手之前,先搞清楚MyCAT到底解决什么问题
1.1 它不是一个数据库,而是数据库前面的路由层
很多人第一次听说MyCAT,容易把它当成一个存储引擎或者数据库服务。其实MyCAT本身不存任何数据,它是一个介于应用和MySQL之间的中间层。应用连接它的时候,把它当MySQL用——走3306类似的端口、用MySQL协议、发SQL语句。MyCAT收到SQL之后,根据你配置的分片规则(比如按订单ID取模、按时间范围分片),决定这条SQL应该转发给哪一个真实的MySQL实例去执行,然后把结果汇总返回给应用。
这个过程中它对应用基本透明,也就是说,原来连接MySQL的代码几乎不用改,只需要把数据库连接的IP和端口换成MyCAT的地址和端口,再把库名改成逻辑库名。这一点是它最大的价值:业务代码不需要感知底层有多个数据库实例。
1.2 什么时候需要用到它
判断是否需要引入MyCAT,可以从三个信号来看:
表的数据量到了单机MySQL的瓶颈,比如单表过亿,索引维护成本高,读写延迟明显上升。
读多写少的场景,需要把读流量分摊到多个从库上,但应用侧又不希望感知主从切换和从库地址。
数据需要按照某个维度(如用户ID、地区、时间)分散存储,但是暂时不想为了分片引入复杂的分布式数据库。
如果你的项目还处于几百上千行的表、单库单机完全能扛住的状态,那其实没必要上MyCAT这类中间层。因为没有分库分表的需求,强行引入只会增加SQL路由开销和运维成本。
我见过一些团队在数据量不大时就上了分库分表,结果开发要看数据都要先想这条SQL存哪个库,排错链路变长。所以先做判断,确认有分片或者读写分离的需要,再开始部署。
2. Windows 10环境下的安装准备和目录结构
2.1 环境要求与版本选择
MyCAT是Java开发的,所以第一个硬性条件是JDK。它依赖JDK 1.7及以上版本,实际使用中建议直接装JDK 1.8(即Java 8),因为绝大多数生产环境都是这个版本,网上能搜到的经验贴基本也基于1.8运行。
安装前先确认JDK环境,打开命令行执行:
java -version如果能输出类似下面的信息,说明JDK已经就绪:
java version "1.8.0_201" Java(TM) SE Runtime Environment (build 1.8.0_201-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)如果提示"java 不是内部或外部命令",那就是环境变量没配好。需要添加JAVA_HOME变量指向JDK安装目录,并在Path中加入%JAVA_HOME%\bin,配完重新打开命令行再验证一次。
关于MyCAT版本,我用过1.6版本,对于学习测试来说功能足够且文档资料丰富。如果说你想尝试更新的功能,可以找1.6之后的release版本,但记得优先选稳定版,不要随便拿开发分支来跑生产相关的东西。
2.2 下载并解压
MyCAT的发行包是免安装的,下载对应版本的tar.gz或zip压缩包,解压即完成安装。在Windows下我建议把解压目录放到一个路径简单、没有中文和空格的位置,比如D:\mycat或E:\tools\mycat。
这一点不算玄学,而是实用考虑:MyCAT的启动脚本和配置文件中会涉及相对路径和绝对路径的拼接,如果目录名带上中文或空格,某些Windows版本的批处理脚本拼接路径时容易出问题,报错信息还不直观,排查起来非常浪费时间。
解压后进入目录,应该能看到以下核心子目录:
bin:启动、停止、查看状态的脚本,Windows下是.bat文件。conf:核心配置文件所在目录,包括server.xml、schema.xml、rule.xml等,改动最多的就是这里。lib:MyCAT运行依赖的Java类库,解压后一般不用动。logs:运行日志目录,包括mycat.log(主日志)和wrapper.log(启动守护日志)。conf目录下还有log4j2.xml,日志打印级别的配置,排查问题时会用到。
2.3 解压后先别急着启动
装完第一件事不是运行bat脚本,而是先看conf目录里的两份核心配置:server.xml和schema.xml。你要把MyCAT当作一个可以定制路由逻辑的数据库代理,这两份文件就是定义"代理规则"的地方。
如果你直接按照默认配置启动,其实也能跑起来,因为默认配置里已经定义了一个名为TESTDB的逻辑库,并指向了本机3306端口的MySQL。但默认配置里的用户密码等参数往往不符合实际环境,直接启动后再去改配置容易混淆问题归因。所以我的习惯是:先理解配置,再启动。
3. 核心配置文件:server.xml和schema.xml的改动要点
3.1 server.xml中的用户和权限逻辑
server.xml承担两个职责:定义MyCAT服务监听的端口,以及定义允许连接MyCAT的逻辑用户。先看关键片段:
<mycat:server xmlns:mycat="http://org.opencloudb/"> <system> <property name="serverPort">8066</property> <property name="managerPort">9066</property> </system> <user name="mycat"> <property name="password">123456</property> <property name="schemas">TESTDB</property> </user> <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user> </mycat:server>这里有两个端口:
- 8066:数据端口,应用连接MyCAT执行SQL时使用。
- 9066:管理端口,DBA通过命令行查看MyCAT运行状态、数据节点信息、切换主从等操作时使用。
下面定义的用户是逻辑用户,不是MySQL的真实账号。应用连接MyCAT时,用的是这里的用户名密码。schemas字段指定该用户可以访问哪些逻辑库,它必须与schema.xml中定义的逻辑库名称一致,否则连接时提示无法访问数据库。
我配置的时候会单独创建一个专用账号,比如名称为mycat_app,权限只开放给业务需要访问的逻辑库,避免直接用root这类的宽泛账号。另外,readOnly设置为true的账号适合只读业务场景,比如报表查询,而读写账号要留成默认。
3.2 schema.xml:告诉MyCAT数据存放在哪里
schema.xml是MyCAT中最核心的配置文件,它描述了逻辑库、数据节点和物理MySQL实例之间的映射关系。一个最简单的分片配置结构如下:
<mycat:schema xmlns:mycat="http://org.opencloudb/"> <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100"> <table name="orders" dataNode="dn1,dn2" rule="mod-long" /> </schema> <dataNode name="dn1" dataHost="host1" database="db_order_1" /> <dataNode name="dn2" dataHost="host2" database="db_order_2" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="123456" /> </dataHost> <dataHost name="host2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="hostM2" url="127.0.0.1:3307" user="root" password="123456" /> </dataHost> </mycat:schema>逐个解释标签作用:
<schema>定义逻辑库。名字就是应用连接时看到的库名,checkSQLschema决定SQL中带不带库名前缀时是否自动处理,sqlMaxLimit是查询时默认加上的限制行数,防止误查全表。<table>声明逻辑表及其分片规则。dataNode表示数据落在哪些数据节点上,rule引用rule.xml中定义的分片规则,这里mod-long表示按ID对节点数取模。<dataNode>定义数据节点,绑定一个真实的MySQL数据库。<dataHost>定义物理MySQL实例的连接信息。多个writeHost可以组成主从,balance控制读写分离的负载均衡策略,heartbeat里是心跳检测SQL,用来判断后端数据库是否存活。
这个配置读起来很像在声明一张"路由表"——什么样的表、按什么规则、分发到哪些物理存储去。
3.3 配置修改后务必检查XML格式
在Windows下用记事本编辑这些XML文件,有件很容易忽略的事:保存时的编码。MyCAT默认配置文件的编码方式一般是UTF-8,Windows记事本默认保存为ANSI,如果你在配置中写了中文注释而保存编码不对,可能导致启动时解析失败。
我建议:
- 统一使用支持UTF-8编码的编辑器,比如VS Code或者Notepad++。
- 修改前备份原配置文件,改完先另存一份副本。
- 写完XML后养成一个习惯:扫一眼标签是否闭合、属性值是否带了多余空格。
XML解析错误是MyCAT启动失败中最常见的一类原因,而且报错信息通常直指conf目录下的某个文件,看到这类报错时优先检查编码和闭合标签,比反复重启要有效得多。
4. 启动、验证和停止:完整的操作链条
4.1 启动脚本的选择:startup.bat还是startup_nowrap.bat
进入bin目录,你会看到几个bat文件。Windows下最常用的是:
startup.bat:通过Java Service Wrapper方式启动,会弹出一个独立的控制台窗口,日志同时写入logs目录。startup_nowrap.bat:直接以Java进程方式启动,不会调用Wrapper包装,日志直接输出在当前命令行窗口。stop.bat:停止MyCAT进程。
初学阶段,我强烈建议用startup_nowrap.bat。原因很实际:Wrapper方式启动时如果后端配置有问题,你看到的控制台输出有限,很多错误细节被wrapper.log吞掉;而nowrap方式直接把日志打在屏幕上,启动过程中每一步做了什么、哪一步报错,都清清楚楚。
双击或命令行执行:
cd D:\mycat\bin startup_nowrap.bat如果一切正常,命令行里会出现类似MyCAT Server startup successfully这样的输出,并且窗口会保持在前台运行,不要关掉,关掉就相当于停止了服务。
4.2 通过日志确认运行状态
即使看到启动成功的提示,我也建议再打开logs目录下的mycat.log确认几处关键信息:
- 配置加载是否完整,有没有出现"ERROR"级别的报错。
- 分片规则是否初始化成功。
- 后端数据节点连接是否建立。
mycat.log的默认输出位置在logs/mycat.log,打开后搜索关键字startup或者successfully可以快速定位启动结果。如果存在数据节点连接失败,日志里通常会出现类似connect failed的异常堆栈,这时要回到schema.xml检查dataHost中的url、用户名和密码是不是对应了真实MySQL的配置。
4.3 验证端口和连接
打开一个新的命令行窗口,执行:
netstat -ano | findstr 8066 netstat -ano | findstr 9066如果看到进程监听了8066和9066,说明MyCAT的数据端口和管理端口都已经就绪。
接下来验证SQL层,最直接的方式是用MySQL命令行客户端连接MyCAT:
mysql -h127.0.0.1 -P8066 -umycat -p123456注意端口是8066,不是3306。这里用的用户名是server.xml里定义的逻辑用户,连上后:
show databases; use TESTDB; show tables;如果能看到TESTDB逻辑库以及schema.xml中定义的表,说明MyCAT已经能正常接收SQL请求并路由到后端MySQL了。
我遇到过一种情况:MyCAT启动后端口正常监听,但用MySQL客户端连接时报Access denied for user,原因就是server.xml里的逻辑用户密码和后端MySQL的真实账号密码混淆了,登录MyCAT用逻辑用户,MyCAT连接后端MySQL用dataHost里的账号密码,两边是独立的。
4.4 停止MyCAT
停止时直接执行bin目录下的stop.bat。如果窗口是启动时那个前台窗口,也可以直接按Ctrl+C。停止后再次执行netstat确认8066端口已经释放,防止残留进程影响后续重新启动。
有一点要在Windows上特别注意:如果之前是用startup.bat(Wrapper方式)启动的,停止时需要确保执行的是同一个脚本体系下的stop.bat,最好不要手动在任务管理器里乱杀Java进程。杀错了可能把MyCAT的守护进程和数据端口进程分开处理,留下孤儿进程。
5. Windows 10特有的坑和排查过程
5.1 端口被占用的问题
如果启动时日志提示8066端口已被占用,常见的原因有两个:一是之前启动过MyCAT没有正确停止,残留进程还在监听;二是8066被其他程序占了。
先找出占用端口的进程:
netstat -ano | findstr 8066最后一列是PID,然后:
tasklist | findstr <PID>确认是残留的Java进程后,可以执行stop.bat试试看能否正常停止,不行的话才考虑用taskkill /PID <PID> /F强制结束。杀进程是最后手段,不要一上来就强杀,否则配置文件里的持久化状态可能不一致。
5.2 防火墙拦截导致本机连接都异常
Windows的防火墙默认会拦截未识别的进程对外监听端口的入站连接。如果你在启动时选择允许访问,那一般没问题;但如果你之前点过"取消"或者运行环境的安全策略比较严格,MyCAT虽然监听了8066,但外部客户端(包括本机命令行)连接时会被拦。
排查方法:
- 打开"Windows Defender防火墙",在"高级设置"中查看是否有Java相关的入站规则。
- 如果不确定,临时在测试环境关闭防火墙(仅限测试机)再连接,能连上说明就是防火墙拦截,再针对Java添加允许规则即可。
生产环境不建议关闭防火墙,这里只是定位问题的手段。
5.3 日志乱码和路径分隔符
Windows下用notepad查看mycat.log,有时中文注释和日志内容会乱码。这大概率是编码问题——MyCAT日志用UTF-8编码,而Windows记事本默认按ANSI读取。
解决:
- 用VS Code等支持编码识别的编辑器打开。
- 或者在log4j2.xml中修改日志输出编码格式。
另一个容易忽略的点是路径分隔符:Windows下是反斜杠\,而Java配置和XML解析时更习惯正斜杠/。在某些配置中如果手写了本地文件路径,请统一用正斜杠或者双反斜杠,否则可能出现文件找不到的情况。
5.4 后端MySQL是8.x时的认证兼容性问题
用MyCAT连接MySQL 8.x时,有一个比较隐蔽的问题:MySQL 8.0版本默认使用了新的认证插件caching_sha2_password,而MyCAT某些版本的native驱动对它的支持并不完善,连接时会报认证失败。
解决办法有两个:
- 在MySQL 8.x中为MyCAT使用的账号指定老的认证插件,例如
mysql_native_password。 - 更换MyCAT版本,选择官方版本说明中支持MySQL 8.x的发行包。
如果你只是本地测试,第一种方法更快。如果生产环境用,建议在正式选型前就把MyCAT版本和后端MySQL版本的兼容性清单拉出来核对一遍,不要等部署到一半才发现连不上库。
5.5 配置改了但没生效
很多人会遇到"我明明改了schema.xml,重启了MyCAT,为什么连TESTDB还是旧结构"的困惑。
排查顺序是:
- 确认修改的文件是
conf目录下被实际加载的那份。有的情况是工作目录不对,启动脚本加载了别的路径下的配置。 - 确认重启操作是真的停干净了,而不是旧进程还在跑、新进程没起来。用netstat看端口PID是否变了。
- 确认使用的是setEnv变量启动的bat脚本,没有因为环境变量覆盖导致加载了其他配置文件。
这类问题多数出在启动方式不干净上,建议先stop再确认端口释放,再重新startup。
6. 从安装到跑通的验证清单和后续使用建议
6.1 快速自检清单
我把整个安装过程收敛成一份自检清单,照着做一遍基本不会漏:
- [ ] JDK版本是否1.8及以上,
java -version能正常输出。 - [ ] MyCAT解压路径是否无中文、无空格。
- [ ] server.xml中逻辑用户、schemas名称是否正确。
- [ ] schema.xml中dataHost的MySQL地址、端口、账号密码是否真实可用。
- [ ] rule.xml中用到的分片规则是否被正确引用。
- [ ] 使用
startup_nowrap.bat启动,观察控制台和mycat.log。 - [ ] netstat确认8066和9066监听正常。
- [ ] 用MySQL客户端连接8066,登录逻辑用户,执行show databases和select。
- [ ] 验证完毕后用
stop.bat停止,确认端口释放。
6.2 跑通之后,接下来做什么
如果只是想验证MyCAT能跑,那到上面一步已经完成了。但既然装了中间层,建议把分片规则的实际效果也验证一遍,否则只是"启动成功"意义不大。
可以先建一个简单的订单表,配置一个取模分片规则,插入几条数据,查看它们分别落到哪个数据节点上。这个过程能直观理解MyCAT路由的执行机制,比只看文档印象深得多。
6.3 Windows环境定位测试,生产别省事
最后说一下我的实际体会:Windows 10下的MyCAT部署完全可用于功能验证、学习分片思路、熟悉配置结构,但不建议作为长期生产环境的主阵地。原因倒不是MyCAT本身不支持Windows,而是Java服务在Windows下的守护、开机自启、资源隔离、日志轮转等运维环节都比Linux麻烦,生产环境用Linux是更省心的选择。
把Windows当作一个"教学环境"来理解MyCAT的启动和配置逻辑,再迁移到Linux部署时,你只需要改启动脚本的差异(bat换成shell),配置文件、分片规则、端口、验证方式几乎完全一致。这也是我建议初学者先在Windows上跑通一遍的原因——排错链路短、看日志方便、改配置即时生效,等熟悉了核心机制,再去面对更复杂的环境就不会手忙脚乱了。