ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

MyCat2基础安装包实战:环境准备、启动排错与分片配置

2026/10/1 18:22:16 拓冰建站 浏览量
MyCat2基础安装包实战:环境准备、启动排错与分片配置 简介mycat2基础安装包是一个面向开源数据库中间件Mycat2的基础部署资源主要服务于需要在分布式数据库场景中搭建访问层、学习数据分片与读写分离的开发者或运维人员。压缩包内共51个文件整体约1.2MB包含schema.xml、server.json等核心配置以及覆盖Linux、Windows、Solaris、macOS等多平台的wrapper启动组件和动态链接库用户解压后即可按需调整数据库分片规则、连接池参数与路由策略快速在当前环境中启动Mycat2服务。目前该资源已有1054人学习下载在Mycat2相关部署资料中具备一定的实践参考热度。通过这份安装包读者不仅能获得完整的Mycat2运行骨架还能结合自带SQL脚本和日志配置理解节点、用户、序列等关键定义从而减少从零搭建的摸索成本更高效地完成本地或服务器上的中间件部署与基础验证。1. MyCat2基础安装包数据库中间件的第一块起跳板MyCat2 是站在 Java 与 MySQL 之间的一层数据库中间件业务代码把 SQL 发给它它按分片规则把 SQL 路由到真正存储数据的那台 MySQL 上。对于还没上云、又想把大表横向拆开的中小团队MyCat2 基础安装包是当前成本最低的切入点下载一个 zip、解压、配一个 yml、启动就能把一个逻辑库映射到多台 MySQL 实例上。这篇笔记把安装包从下载到跑通讲细JDK 环境、目录结构、启动脚本、日志定位、数据源配通按实际部署顺序来把这一路遇到的坑提前给你标好。2. 装之前先想清楚三件事JDK 版本、目录结构、安装包形态怎么选2.1 为什么 MyCat2 安装包开口就要 JDK 1.8而不是越新越好MyCat2 用 Java 写成bin 目录底下的启动脚本本质就是一段 java -cp 的封装。最省事的方式是把 JDK 装在默认路径然后配好 JAVA_HOME 和 PATH。注意网上大量安装失败案例都出在 JDK 版本上而且出错的姿势出奇一致装了高版本 JDK启动直接报 UnsupportedClassVersionError。先看当前环境到底有什么java -version echo ${JAVA_HOME}如果 java -version 输出的是 17 或 21第一次启动 MyCat2 十有八九会在日志里甩出 UnsupportedClassVersionError安装包里的 class 文件是按 JDK 1.8 的目标字节码编译的低版本 JDK 跑高版本字节码会直接拒绝。反过来高版本 JVM 跑 1.8 的 class 理论可行可 MyCat2 内部用了一些反射和线程模型在高版本 JDK 下会触发模块化访问限制启动日志里全是 warning甚至起不来。我的建议是别挣扎直接装 JDK 8设置 JAVA_HOME 指向它。装完之后把环境变量写进 /etc/profileexport JAVA_HOME/usr/local/jdk1.8.0_202 export PATH${JAVA_HOME}/bin:$PATH source /etc/profile这里有一层容易被新手忽略PATH 里如果还有别的 java比如 CentOS 预装的 openjdk 11那 mycat 启动脚本优先用的是 PATH 上的 java而不是 JAVA_HOME。所以两层要同时确认。怎么确认环境已经就位一条命令组合就够which java java -version echo ${JAVA_HOME}三个命令的输出要能对得上JAVA_HOME 指向的目录里有 bin/java且版本是 1.8.x。这一步做好后面启动阶段省掉一半的坑。别小看这个环境准备我见过太多同事把时间耗在后期排错上回头一看根因就是 JDK 没钉死。2.2 解压后的目录结构bin、conf、lib、logs 各管哪一段拿到基础安装包之后不要急着点启动先花两分钟把目录认一遍。MyCat2 的 release 包解压以后核心目录就这四个每个职责都很清晰目录作用我平时会重点看什么bin启动/停止脚本mycat、mycat.bat 里的 JVM 参数conf所有配置文件mycat.yml、bootstrap.yml 的端口与账号lib依赖 jar 包汇总是否存在体积明显不对的文件logs运行日志首次启动后生成mycat.log、wrapper.log 的 ERROR 堆栈bin 目录下面Linux 环境跑 ./bin/mycatWindows 跑 mycat.bat。脚本支持 start、stop、restart、status、console 五个子命令其中 console 会让 Java 进程在前台运行所有日志直接打在终端上适合第一次启动排错用。这一节先记住 console 的存在后面会反复用到。conf 目录是配置重地。MyCat2 相比 MyCat1 把一堆 XML 拆成了更少的 YAML 文件安装包默认带一份完整配置正常情况下直接启动就能连。我会在启动之前先把 conf 里的 mycat.yml 打开看一眼重点确认两个键服务端口和默认用户密码。不同版本默认值有差异按我的经验端口默认 8066用户 root密码 123456但以你安装包里的实际内容为准不要背参数要养成看现场的习惯。lib 目录几百 MB放的是运行所需依赖。如果下载安装包时网络中断解压时发现 lib 里某个 jar 是 0 字节或者名字带 .download 后缀那启动就会在 ClassNotFoundException 上报错。后面第 4 章我会专门展开这个坑这里先记住一个判断标准正常安装包的 lib 目录下应该有几百个 jar 文件如果只有几十个说明包有问题重新下载。2.3 Release 包、源码包、Docker 包基础安装包到底选哪个下载页面提供的资产一般有三类选错会直接拉长排错链路。源码包是 tar.gz 或 zip 的源码归档需要自己有 Maven 构建环境先编译再部署。适合要改 MyCat2 本身的团队不适合只想把中间件跑起来的人。Release 二进制包解压即用带完整 lib 和 conf这就是标题里说的基础安装包也是本文默认路径。容器镜像是另一条路线适合已经把 Docker 作为标准交付方式的团队但日志、数据卷、网络都要按容器思路处理排错路径和整包部署完全不同。选型上没有现成 Java 环境、也没有统一配置管理工具的团队直接用 Release 二进制包最省事。容器镜像适合对镜像仓库已经有习惯的团队但生产环境建议把 conf 目录挂载出来不然改配置只能进容器里动容器一重建配置就丢了。还有一层要额外考虑后端 MySQL 版本和 MyCat2 的兼容性。MySQL 8.0 的 caching_sha2_password 认证插件曾经坑过一批人。如果你的后端 MySQL 是 8.0.x记得确认 MyCat2 版本足够新否则数据源连接时会报认证插件不支持。装之前先想清楚你的后端 MySQL 版本这比纠结安装包本身大小更重要。选型这件事做扎实了后面配数据源能少走两小时弯路。3. 把 MyCat2 基础安装包跑起来从校验到启动的完整动作3.1 拿到安装包先校验完整性别等启动报错再后悔下载环节最容易出问题二进制安装包动辄一两百 MB中转网络一抖动就可能得到损坏文件。下载之后先做校验尤其要对比官方给的校验值md5sum mycat2-xxx-bin.tar.gz sha256sum mycat2-xxx-bin.tar.gz如果下载页面给出 SHA-256优先对比 sha256sum 的输出。MD5 只能排除传输损坏防不了换包。这一步看着多余但装过几十台机器的人都明白tar 解压到一半报 gzip: stdin: unexpected end of file比启动报错更让人烦躁。与其解压到一半停下来猜原因不如下载完先花十秒校验。解压动作本身也有讲究。我习惯先解压到 /opt再建一个不带版本号的软链这样后面升级的时候不用改一堆脚本引用tar -zxf mycat2-xxx-bin.tar.gz -C /opt ln -s /opt/mycat2-xxx /opt/mycat ls -l /opt/mycat以后想切版本只需要把软链指到新目录。配置文件可以单独备份不要和安装目录耦合得太死。我见过有人每次升级就把整个 conf 目录覆盖结果把生产配置冲掉了这种操作属于翻车概率最高的动作之一。解压完成后进入安装目录看一眼 lib 目录的大小和文件数。正常情况 lib 下应该有几百个 jar如果只有几十个或者存在 0 字节文件说明压缩包有问题直接重新下载不要继续。这一步做好能省掉第 4 章里 ClassNotFoundException 的排查时间。校验和解压这两个动作加起来不到五分钟换来的是后面启动和排错时不用怀疑安装包本身。3.2 启动脚本的四个子命令start、stop、restart、consoleMyCat2 的启动脚本是 bin 下的 mycat。第一次启动我强烈建议用 console 而不是 start原因很简单console 模式下 JVM 前台运行报错直接吐在终端不用去猜日志路径。cd /opt/mycat ./bin/mycat console看到类似下面这种输出说明 JVM 已经起来了Loading class com.mysql.jdbc.Driver ... MyCat Server startup successfully. port:8066如果终端一直不动或出现大量异常堆栈停下来看异常信息别等。处理完再启动。console 模式还有个附加价值它把日志级别直接呈现在终端上刚好用来验证 JVM 参数和配置文件有没有被正确加载。这一条命令能把第 4 章一半的坑提前暴露在眼前。确认没有问题之后再切回正式启动方式./bin/mycat start ./bin/mycat statusstatus 会告诉你当前进程是否存在。注意start 之后命令立即返回进程在后台运行。如果你马上执行 status 看到 not running不要慌多半是 JVM 启动需要几秒钟等两秒再查。这里有个细节容易让人误判后台启动模式下进程退出不等于失败要看日志才能确认是正常退出还是异常退出。停止和重启同理./bin/mycat restart ./bin/mycat stoprestart 这个命令在改动 conf 配置之后用的频率最高。值得提醒的是MyCat2 对配置文件的加载时机是启动阶段所以任何配置改动都必须 restart而不是等着热加载。个别参数支持运行时通过管理端口修改但那是进阶玩法基础安装部署阶段统一用 restart。养成「改完必 restart、restart 后必看日志」的习惯能少踩很多坑。3.3 启动后日志到底看哪个文件logs 目录的正确打开方式后台启动模式下日志不会出现在你的终端里。MyCat2 的日志默认落在 logs 目录文件名随版本略有差异常见的是 mycat.log 和 wrapper.log。排错顺序我一般是这样cd /opt/mycat/logs ls -lt | head tail -200f mycat.logls -lt 按时间倒序排列哪个文件刚刚被写过哪个就是当次启动的日志。看日志的时候重点抓两类关键字ERROR 和 Exception。如果整个文件只有 INFO 级别的内容而日志的最后一行停在一个普通的初始化步骤上那大概率是 JVM 还没退出只是启动卡住了这时要用 jstack 之类的工具去看线程状态而不是反复重启。启动成功的标志不是「日志文件生成了」而是出现了 server startup successfully 或等效关键字并且 status 命令返回 running。把这两件事同时确认了才算跑通。有个实用技巧是启动后立刻执行 netstat 看端口监听netstat -anp | grep 8066看到 LISTEN 状态就说明网络层就绪。日志和端口两个信号都亮安装包的启动环节才算真正完成。这一步做完你就从「下载了安装包」进阶到「安装包在我的机器上活着」。4. MyCat2 安装与启动常见的 5 个坑现象、原因、解决4.1 现象java.lang.UnsupportedClassVersionError启动即退出启动时终端直接甩出java.lang.UnsupportedClassVersionError: org/mycat/... has been compiled by a more recent version of the Java Runtime原因只有一个当前默认的 java 版本比安装包编译目标高太多常见场景是系统自带 openjdk 17而 MyCat2 按 JDK 1.8 编译。解决方式不是去装新版本 MyCat2而是把启动脚本用的 java 指回 JDK 8。操作顺序先看 which java 指向哪再看 JAVA_HOME 设没设。启动脚本一般会优先用 JAVA_HOME/bin/java但很多系统没设 JAVA_HOME于是脚本沿 PATH 找 java找到的就是错的。解决export JAVA_HOME/usr/local/jdk1.8.0_202 export PATH${JAVA_HOME}/bin:$PATH ./bin/mycat restart这个坑里最容易迷惑人的是java -version 明明显示 1.8但 mycat 启动还是报版本错误。出现这种情况请检查 mycat 脚本里是否有硬编码的 JAVA_HOME 路径或者脚本里面用了 jre 目录而非 jdk 目录。有些安装包模板会在脚本头部写死 JAVA_HOME/usr/jdk安装路径不同时就会踩中。这类问题看脚本前三行比看日志更快定位。4.2 现象端口被占用启动卡在 bind 阶段启动日志出现java.net.BindException: Address already in useMyCat2 默认要占 8066 端口如果你的测试机上还有另一个 MyCat 实例、或者别的服务恰好用了 8066就会撞上。解决方式有两种改 MyCat 的端口或者停掉占用端口的进程。先定位谁占了端口netstat -anp | grep 8066如果确认是残留的 Java 进程kill 掉再启动。如果是因为测试环境端口冲突频繁改配置更省心。MyCat2 的端口配置通常在 conf/bootstrap.yml 或者 mycat.yml 里搜 serverPort 或类似键名。改完之后 restart再用 netstat 确认监听端口已经变化。这个坑容易被忽略的是改完端口之后客户端连接也要跟着改连接串会从 8066 变成新端口。忘了改应用侧配置看起来像是连接失败实际是端口记混了。我建议把端口号写进你的部署文档而不是依赖记忆。多实例部署时端口规划提前做能避免一半的 bind 冲突。4.3 现象ClassNotFoundExceptionlib 目录少了 jar启动日志里出现java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver原因绝大多数是安装包下载不完整或者解压时遗漏了部分 jar。不要试图去网上下单个 jar 塞进 lib版本匹配问题会折磨你。正确做法是回到官方 release 地址重新下载解压后对比文件数量。如果多次重新下载都报同样的缺类那要看是不是你改动了 lib 目录比如为了「瘦身」删了几个看起来用不上的包。MyCat2 的基础安装包内部依赖关系没有文档给你列全任何手动删除 jar 都属于负优化。我见过最离谱的一次是同事为了省空间删了 lib 下所有 test 开头的 jar结果启动时缺了一个压缩工具类。回归基础包是最稳的恢复手段。这个坑的隐蔽之处在于报错信息里提到的类名和缺失的 jar 文件名往往对不上。你看到 ClassNotFoundException 时第一反应应该是「重新解压一份原包对比 lib 目录」而不是去搜这个类属于哪个 jar。把 lib 目录视为黑匣子不要试图理解里面每个 jar 的用途这是安装基础包应有的心态。4.4 现象进程起来了但 mysql 客户端连不上启动成功后执行mysql -h127.0.0.1 -P8066 -uroot -p123456提示 access denied 或 connect refused。这时候要拆成两层去看先看网络层能不能到端口再看认证层是否通过。connect refused 大部分情况是 MyCat 监听在 127.0.0.1 之外的其他地址上。检查 conf 里绑定的 host 配置如果绑的是 127.0.0.1 而客户端从别的机器连过来自然被拒。access denied 则是用户或密码不对MyCat2 默认 root/123456但不同版本默认值不同且如果之前改过 yml 里的 authentication 段旧密码会失效。排查顺序建议是 telnet 端口、确认监听地址、确认用户密码、检查防火墙。这四步里遇到最多的是防火墙测试机上 firewalld 或 iptables 默认就拦了 8066开了端口问题立刻消失firewall-cmd --add-port8066/tcp --permanent firewall-cmd --reload这个坑的教训是不要一上来就怀疑配置文件的认证逻辑先用 telnet 确认端口通不通。网络层不通时用户名密码再对也没用。连接问题按层次排查从底往上走效率最高。4.5 现象YAML 配置解析失败进程秒退改动 conf 下的 yml 文件后启动几秒就退出日志里出现org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping原因基本是 YAML 缩进和冒号空格写错了。MyCat2 对格式敏感度比较高key 和 value 之间必须有空格列表项缩进必须对齐。解决方式是把改动的部分回退逐行检查缩进。我自己的写法是所有嵌套层级用两个空格缩进不允许 Tab字符串不加引号除非里面有特殊字符注释不要写在行尾单独起一行。如果你用 IDE 改配置尽量打开 YAML 校验插件能在启动前就暴露问题。如果已经在生产环境改到一半记住保留改动前的备份。MyCat2 没有帮你做配置自动备份的机制改配置之前先 cp 一份 .bak这是成本最低的后悔药cp conf/mycat.yml conf/mycat.yml.bak以后每次改配置前都执行这一句养成肌肉记忆。YAML 解析失败这个问题90% 是手误剩下 10% 是编辑器把 Tab 和空格混用了。把编辑器的 tab 键设置成插入空格能直接消灭这一类问题。配置格式的坑最不值得浪费时间因为原因永远那么几个。5. 配通数据源和逻辑库让安装包从能启动到能干活5.1 最小可用的数据源配置把 yml 从能启动改成能连库装好只是第一步安装包跑起来不等于能连上你的后端 MySQL。这一节把它接到真实库上。打开 conf 下的 mycat.yml找到数据源相关的配置段。MyCat2 把物理连接放在数据源这一层一个数据源对应一个后端 MySQL 实例或者连接串。最小配置长这样datasource: mysql3306: url: jdbc:mysql://127.0.0.1:3306/db?useSSLfalseserverTimezoneAsia/Shanghai user: root password: 123456这段的意思定义一个名叫 mysql3306 的数据源指向本机 3306 上的 MySQL。url 里的 useSSLfalse 和 serverTimezone 是两类高频坑前者对应 MySQL 8.0 对 SSL 的默认值变化后者对应没有指定时区时的连接拒绝。配置改完执行 restart。这里有个概念值得区分数据源是物理连接描述逻辑库才是应用看到的那层。MyCat2 的逻辑库可以理解为一个虚拟 database应用连接 MyCat 后看到的 database 列表里包含的是逻辑库而不是物理库。两者之间靠分片规则和数据源路由联系。配置数据源时你要问自己的第一个问题不是「这个 yml 语法对不对」而是「这个数据源对应哪台物理 MySQL、账号有没有权限」。参数层面还有几个可以按需调整的连接池大小、超时时间、是否自动重连。基础安装时先用默认值不用一上来就调满。我见过有人一装完就把连接池拉到 500结果后端 MySQL 的连接数被打爆。物理库的承载能力决定了连接池参数的上限这个判断需要基于你的实际库配置而不是越大越好。5.2 用命令行确认连接mysql 客户端连上去到底看到什么配置改完重启 MyCat然后用 MySQL 客户端连上去看mysql -h127.0.0.1 -P8066 -uroot -p123456进入命令行后先看逻辑库show databases;如果能列出逻辑库列表说明 MyCat 侧的用户认证已经通过。如果看不到你预期的库最常见原因是逻辑库配置里没有把数据源关联进去或者关联了但名字对不上。这一步只验证链路通不通不验证分片效果。想验证一条 SQL 真正落到后端 MySQL可以在逻辑库执行use logic_db; select * from user_info limit 1;如果 MyCat 返回正常数据说明穿透连接已经打通。如果报错回到第 4 章排查数据源配置里的 url、账号、密码是否和实际 MySQL 一致。这里有个细节首次连接时 MyCat 会向后端 MySQL 发起连接如果后端 MySQL 的防火墙拦了 3306MyCat 日志里会报连接超时但 MyCat 本身并不会退出。命令行验证通过后建议顺手测一下写操作insert into user_info(id, name) values (1, test);只读查询通过不代表写路径正常分片中间件的写路由往往比读路由更复杂。测试一条插入能顺带验证全局序列号、分片键映射这些后续要用的机制也确认你对基础安装包的掌控力又进了一步。5.3 从单库到分片安装包自带的模板怎么改基础安装包通常带有一套默认分片模板或者全局序列号配置不要一上来就推到重来。我建议的第一条分片表这样建create table t_order ( id bigint primary key, user_id int, amount decimal(10,2) ) broadcast false dataNode dn1,dn2 shardingKey id;这种建表语法不是标准 MySQL它是 MyCat2 对 DDL 的扩展。MySQL 客户端把这条语句发给 MyCatMyCat 解析后在后端物理库建表并按 id 做分片路由。dataNode 指定了这条表的数据落在哪几个物理节点上shardingKey 指定了按哪个字段计算分片。注意 shardingKey 只支持单键分片如果你有联合唯一索引想按多列分片基础安装包默认策略就要额外写分片算法。我先不给自定义算法代码因为每个公司的表结构都不一样。正确的路径是先跑通单键分片再根据业务需要替换算法。安装包自带的模板是学习分片规则的最好起点比任何时候从零写都省力。分片键的选择要谨慎它决定了后续所有查询的分布方式。选错了数据会倾斜到单个节点分片失去意义。我见过有人把 status 字段当分片键结果 90% 的数据落在第一个分片其他分片几乎空闲。选分片键的原则是区分度高、查询条件里频繁出现、不会频繁更新。理解了这个原则你才算真正在用分片而不是在装样子。6. 验证安装的 3 个检查点以及把 MyCat2 进程交给 systemd6.1 三个检查点端口、日志、SQL 一行都不能少验证安装不是「启动成功就算完」我每次装完新环境都会按固定顺序过三个检查点。第一netstat 看 8066 端口处于 LISTEN 状态这代表网络层就绪。第二logs/mycat.log 里出现 startup 关键字且没有 ERROR 堆栈这代表进程层就绪。第三mysql 客户端执行 show databases 能返回逻辑库列表这代表业务层就绪。三个检查点全部通过安装包才算真正落地。6.2 进阶动作调 JVM 堆内存后再交给 systemd 托管安装包自带的启动脚本默认堆内存往往偏保守生产环境建议在 bin/mycat 脚本里调整 Xms/Xmx。改完启动脚本后最好把 MyCat2 注册为 systemd 服务让它在机器重启后自动拉起[Unit] DescriptionMyCat2 Database Middleware Afternetwork.target [Service] Typeforking ExecStart/opt/mycat/bin/mycat start ExecStop/opt/mycat/bin/mycat stop ExecReload/opt/mycat/bin/mycat restart Usermycat Restarton-failure [Install] WantedBymulti-user.target把这段存成 /etc/systemd/system/mycat.service然后 systemctl daemon-reload再用 systemctl enable mycat 设置开机自启。对后台常驻的中间件来说这一步能让重启后不再手动逐个拉起省掉不少运维琐事。JVM 参数调整方面我的经验是先用默认值跑起来观察 GC 日志和内存占用再逐步调整堆大小。不要一上来就追求大堆大堆不等于高性能频繁 Full GC 才是性能杀手。把 JVM 参数调整和 systemd 托管这两件事做完安装包就从「能跑」变成了「能稳定跑」。我个人的习惯是每装一台新机器都会顺手把启动脚本里的 JVM 参数和 systemd 单元文件备份到配置仓库里下次换机器直接复用。MyCat2 本身不难装难的是装完之后的配置资产能不能沉淀下来。这套流程帮你少踩几次我已经踩过的坑希望帮到你。本文还有配套的精品资源点击获取