简介:面向需要搭建分布式数据库中间件的开发与运维人员,这份 Mycat2 基础安装包提供了开源数据库中间件 Mycat 第二代版本的完整运行骨架。包体共 51 个文件,压缩后仅 1.2MB,主要包含 Mycat 服务端的核心 jar 包、分片库表初始化 SQL、JSON/XML/properties 等配置、适配 Linux/Windows/macOS 等多个平台的守护进程动态库,以及启动脚本与基础目录结构,覆盖常见部署环境,解压后即可着手部署验证。目前已有 1054 人学习下载。通过学习包内配置与脚本,读者可以快速理解 Mycat2 的数据分片、读写分离、SQL 路由等核心机制,并据此搭建本地测试环境,为后续扩展数据节点、调整路由规则和排查启动异常提供可直接对照的蓝本。对需要快速评估或上手 Mycat2 的团队来说,这份安装包省去了逐项收集组件的步骤,适合作为本地学习与初始环境搭建的起点。
1. mycat2基础安装包:先想清楚它是解压包,不是一键安装包
如果在数据库交流群里有人丢过来一个文件叫 mycat2基础安装包,最常见的翻车现场是:解压、启动、然后拿着 Mycat 1.x 时代的 schema.xml 习惯去改配置,结果发现新版目录里根本没有这个文件。Mycat2 是一款用 Java 写的数据库中间件,部署在应用和 MySQL 之间,用逻辑库帮你做读写分离、分库分表和路由。它要解决的核心问题是让应用先稳定连上 8066 端口,再把后端物理库的变化挡在网关后面。这个安装包不是 RPM,不是双击安装的向导程序,而是带 bin、conf、lib 三件套的压缩包,适合正在做 MySQL 拆分、想统一数据库入口、或者接手维护 Mycat 老项目的工程师。动手前先分清版本和配置形态,能替你省下很大一段弯路。
2. mycat2基础安装包解压后:怎么挑到能跑的版本和最小启动命令
2.1 发行形态:压缩包、镜像和源码包,先别急着拆
先说结论:mycat2基础安装包最常见的形态是一个 zip 或 tar.gz 压缩包,解压后直接得到 Mycat 的运行目录。目录里通常有 bin、conf、lib、logs 四个关键部分,bin 下面放着 mycat 启动脚本,conf 下面放着 JSON 格式的配置文件,lib 下是一堆运行依赖的 jar 包,logs 在启动第一次以后才会有内容。还有一种形态是容器镜像,适合已经上了 Kubernetes 或者习惯用 Docker Compose 跑中间件的团队。这两种都能拿到完整的基础安装能力,区别只在于你打算把配置文件和日志放在哪里。
比较容易被忽略的是源码包。有的地方把 GitHub 上拉下来的代码也叫做安装包,但它并不是可以直接运行的基础安装包,需要先用 Maven 打包,再去处理依赖。对于只想先把 Mycat2 跑起来验证业务的人来说,源码包不是入口,反而会消耗大量时间在编译环境上。我一般会把源码包和二进制压缩包分开对待:源码是给二次开发用的,基础安装包就是拿来解压后直接启动的。
拿到压缩包以后,先不要急着执行启动脚本。先看一眼目录里有没有 README 或者版本说明文件,确认这个包的版本线是 2.x 还是 1.x。很多项目文档不更新,网上搜出来的教程还停留在 1.x 的 schema.xml、rule.xml 那一套,而 Mycat2 的配置已经换成了 JSON 体系。用错了体系,后面每一步都会踩坑。
文件形态常见如下,具体目录名可能因为 release 版本略有差异,但职责基本一致:
| 目录/文件 | 作用 | 需要关注的时机 |
|---|---|---|
| bin/mycat | 启动、停止、重启脚本 | 部署时确认有执行权限 |
| conf/server.json | Mycat 自己的 IP 和端口绑定 | 首次部署必须改 |
| conf/datasource.json | 后端 MySQL 连接池 | 新增数据库时改 |
| conf/schema.json | 逻辑库和表的路由关系 | 做分库分表时改 |
| lib/ | 依赖 jar 包 | 升级时整体替换 |
这里还有一个很容易误操作的细节:有些安装包解压后自带 sample 或 example 目录,里面放着示例配置。不要试图把示例配置直接拷贝到 conf 目录,也不要因为示例里字段多就盲目照着改。示例配置通常对应特定版本的功能开关,和真实环境往往差着数据源、密码、还有各种连接参数。正确的做法是先保留一份原封不动的 conf 备份,再在它基础上改动。
2.2 启动前必须对齐的运行环境:JDK、JAVA_HOME、权限和可用端口
Mycat2 是 Java 应用,运行环境第一件事就是 JDK。常见要求是 JDK 8 或 JDK 11 的 64 位版本,具体看安装包构建时用的字节码版本。检查方式很简单,在解压目录下执行 java -version,确认能正常输出版本号。如果系统里有多个 JDK,还要确认 JAVA_HOME 指向正确,因为 mycat 启动脚本一般会优先读取 JAVA_HOME,而不是去 PATH 里猜。
一个很隐蔽的问题是目录路径里有空格。比如把安装包放在 Windows 的 Program Files 下,或者 Linux 上通过某些网盘同步出来的目录带空格,启动脚本解析路径时会把参数拆断,导致 JVM 找不到主类。安装路径最好保持纯英文、无特殊字符,这是很多中间件启动时最容易忽略的前提条件。另外,bin/mycat 需要有执行权限,如果解压工具的 umask 设置不对,会出现 Permission denied,这属于秒级确认但很影响心态的问题。
端口方面,Mycat2 默认有两个端口:8066 是给应用连接的数据端口,9066 是管理端口。用 8066 连接时,客户端会以为自己在连一个 MySQL 实例,实际上连接被 Mycat2 接管。启动之前先执行 ss -lntp,看看这两个端口有没有被别的进程占用。常见情况是 8066 被另一个 MySQL 实例、或者被某个监控探针占用,启动脚本不会直接报端口错误,但日志里会有 bind 失败的堆栈。
另外,基础安装包里通常不附带 mysql 命令行客户端。你想验证 Mycat2 能不能转发 SQL,需要本机有一个 mysql 客户端,或者从应用机器上用现成的连接池测试。这个依赖不在安装包里,但属于跑通最小闭环的必要工具,提前准备好。
2.3 最小启动命令与验证:bin/mycat、console 和日志
第一次运行安装包,我强烈建议以前台方式启动,而不是直接后台化。后台化以后,启动错误可能只出现在日志文件里,而日志文件可能因为权限、路径问题根本没有生成,等你回头看时进程已经没了,排查难度凭空增加。常见做法是先在 bin 目录下执行 ./mycat console,让日志直接打到终端,看到启动过程稳定以后再改用后台方式。
# 进入解压后的 mycat2基础安装包目录 cd /opt/mycat2 # 确认 JDK 可用,且 JAVA_HOME 指向正确 export JAVA_HOME=/usr/lib/jvm/jdk8 export PATH=$JAVA_HOME/bin:$PATH java -version # 前台启动,第一次跑不建议用 start ./bin/mycat console # 另开一个终端检查端口和进程 ss -lntp | grep -E '(:8066|:9066)' ps -ef | grep mycat | grep -v grep这段命令里的 export JAVA_HOME 是临时环境变量,只对当前终端会话生效。如果你确认某个 JDK 路径是固定可用的,更好的做法是把它写进 /etc/profile 或者 systemd 单元文件,避免每次手动设置。console 子命令在大部分安装包中负责前台运行,start 子命令负责把进程放到后台。第一次调试用 console,能直接把异常打到终端,少一层日志判断。
确认进程在跑以后,再去看日志文件。logs 目录下一般会有多个 log 文件,有的记录启动过程,有的记录 SQL 执行和路由信息。查看日志时不要只 tail 一个固定文件名,因为不同版本的安装包对日志文件的命名不一致,有的叫 mycat.log,有的叫 wrapper.log,有的按日期切分。可以按修改时间取最新的那个:
ls -lt /opt/mycat2/logs/ | head -3 tail -n 200 "$(ls -t /opt/mycat2/logs/*.log | head -1)"启动日志里如果出现 BindException,说明端口被占用;出现 UnsupportedClassVersionError,说明 JDK 版本不匹配;出现 ClassNotFoundException,常见原因是 lib 目录不完整或者升级时只覆盖了主 jar 包。看到这些错误先别急着换包,把对应原因逐项排查,比反复重装更有用。
还有一个小技巧:安装包里如果带了 wrapper 配置,通常可以调整 JVM 内存参数。默认配置可能把最大堆设得比较大,在只有 2G 内存的测试机上启动会直接卡死。安装基础包后先看一眼 wrapper 相关配置里的 -Xmx,把内存调小,测试环境没必要给中间件开满堆内存。
3. 把 JSON 配置写对:mycat2 从安装包到逻辑库的第一步
3.1 Mycat2 用 JSON 代替 schema.xml,改装的是逻辑库和物理库的映射
Mycat 1.x 时代看家的是 schema.xml、rule.xml、server.xml 三个 XML,很多老工程师闭着眼都会改。到了 Mycat2,安装包默认配置变成了 JSON 文件,server.json、datasource.json、schema.json、user.json 各自承担不同职责。这不是简单换个后缀的问题,而是配置思想的调整:1.x 把数据源、数据节点、逻辑库都揉在 XML 里,Mycat2 把它们拆成了独立的配置层级。
一份常见的 Mycat2 配置体系包含四层:数据源是最底层,指向真实的 MySQL 实例;数据节点负责把数据源和逻辑库关联起来;逻辑库对应用暴露,应用不直接感知物理库;用户层负责谁能连、能连哪些逻辑库。这个层级关系理解清楚以后,所有配置文件的字段就都能对应到位置上,不至于看完一个文件还要去猜另一个文件里为什么少写了一个名字。
安装包里自带的 conf 目录通常已经有一份模板,字段可能比最小示例多,比如预留了读写分离、分片规则等高级选项。我的建议是:先把模板复制一份留底,然后将模板里的数据源地址改成自己测试库的地址,把用户名密码改成实际值,先不要碰其他高级字段。等最小访问链路通顺了,再回过头去研究分片和读写分离。
3.2 最小配置示例:数据源、逻辑库、用户三个文件一次写对
下面给出一份最小可运行配置的通用写法。不同 release 的字段名可能有一两个字差异,但层级关系基本一致。先看数据源配置,它描述 Mycat2 怎么连后端 MySQL:
{ "datasource": { "ds_tpch": { "databaseName": "tpch", "url": "jdbc:mysql://127.0.0.1:3306/tpch?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai", "driverClassName": "com.mysql.cj.jdbc.Driver", "username": "mycat", "password": "mycat123", "type": "mysql", "maxActive": 20, "minIdle": 5 } } }这里的关键参数是 url,它决定 Mycat2 通过 JDBC 去连哪个物理库。databaseName 是逻辑上的库名,在 Mycat2 路由过程中会用来匹配 SQL 里的 database 关键字。username 和 password 对应后端 MySQL 的实际账号,不是应用连 Mycat2 时用的账号,这是一个非常容易绕晕的概念。maxActive 和 minIdle 控制连接池水位,测试环境不需要太大,20 和 5 足够。
接下来是逻辑库和用户配置。逻辑库是给应用看的名字,物理库在数据源里已经指定,逻辑库要做的是把名字对上:
{ "schemas": { "logic_tpch": { "defaultDataNode": "dn_01" } }, "dataNodes": { "dn_01": { "targetDataSource": "ds_tpch" } } }这段配置把逻辑库 logic_tpch 指向数据节点 dn_01,dn_01 再指向数据源 ds_tpch。这样应用连接 Mycat2 时执行 USE logic_tpch,Mycat2 就知道应该把请求发给后端 tpch 这个物理库。如果你用的是更简单的安装包,schema 和 dataNode 可能在同一个 schema.json 里,但路径关系不变。
用户配置决定谁能连上来:
{ "users": { "root": { "password": "123456", "schemas": ["logic_tpch"] } } }root 只是一个逻辑用户名,和后端 MySQL 的 root 没有直接关系。它只负责 Mycat2 这一层身份的认证,真正登录物理库时用的还是 datasource.json 里的账号。schemas 数组用来限制该用户能看见哪些逻辑库,按需填写的字段。
我会在写完三个文件后做一次自检:应用连接 Mycat2 时用的是 users 里的身份,Mycat2 转发 SQL 时用的是 datasource 里的身份,逻辑库到物理库的映射由 schema 与 dataNode 串联。三层都对齐了,剩下的只是启动和调参。
3.3 配置完成后怎么让安装包真正加载配置
改完 JSON 后一定要重启 Mycat2,这和改完 Linux 配置要重启服务是一个道理。Mycat2 在启动阶段加载配置,但某些版本会把配置落入内置元数据存储,直接改文件不一定立即生效。重启是相对可靠的方法,同时也方便观察配置文件语法错误。
cd /opt/mycat2 ./bin/mycat stop sleep 3 ./bin/mycat start sleep 5 # 查看启动日志确认加载成功 ls -lt logs/ | head -3 tail -n 200 "$(ls -t logs/*.log | head -1)"我之所以会在 start 后面加 sleep,是因为 Mycat2 启动过程不是瞬间完成,JVM 起来以后要初始化 Netty、加载数据源、建立连接池,都需要时间。如果脚本执行完立刻查端口,很可能误判为启动失败。等待几秒再检查,得到的结果才真实。
配置加载成功后再用 mysql 客户端验证入口。注意这里的 8066 是 Mycat2 的端口,不是 MySQL 的 3306:
mysql -h127.0.0.1 -P8066 -uroot -p123456 -e "SHOW DATABASES;"看到 logic_tpch 出现在数据库列表里,说明你的配置层级没有断。如果连接报错 Access denied,先检查 user.json 里的用户名密码;如果能连上但没有这个逻辑库,再去检查 schema 和 dataNode 的映射是否写反了。
4. 把安装包连成服务:systemd 托管、端口检查和真实 SQL 验证
4.1 为什么不能只靠 ./bin/mycat start 活着
很多初次部署的人会在终端里执行 ./bin/mycat start,看到端口起来就走了。这样做有两个问题:一是当终端会话关闭,或者 SSH 连接中断,进程可能被 SIGHUP 信号带走,虽然不一定会挂,但管理方式太脆弱;二是进程没有纳入系统服务管理,开机不会自启,崩溃后也不会自动拉起。数据库中间件是基础设施,不是临时工具,应该和 nginx、MySQL 一样用 systemd 管理。
把 Mycat2 安装包接入 systemd,核心是写一个 service 文件,指向 bin/mycat 的 start 和 stop 命令。这样可以通过 systemctl status 观察状态,通过 journalctl 看日志,还能设置错误自动重启。
4.2 用 systemd 实现开机自启和崩溃拉起
先创建运行用户,再把安装包目录归属权限改好。数据库中间件不建议直接用 root 运行,因为一旦 SQL 路由有漏洞,或者日志文件被异常写入,影响面会扩大到系统层。
[Unit] Description=Mycat2 Database Middleware After=network-online.target mysqld.service Wants=network-online.target [Service] Type=forking User=mycat Group=mycat Environment=JAVA_HOME=/usr/lib/jvm/jdk8 Environment=MYCAT_HOME=/opt/mycat2 ExecStart=/opt/mycat2/bin/mycat start ExecStop=/opt/mycat2/bin/mycat stop PIDFile=/opt/mycat2/logs/mycat.pid Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target这个 service 文件里,Type=forking 表示启动命令会自己切换成后台进程,systemd 通过 PIDFile 找到主进程 PID。ExecStart 和 ExecStop 分别对应 mycat 脚本的 start 与 stop。Restart=on-failure 表示只有异常退出时才会自动拉起,正常 stop 不会反复启动。JAVA_HOME 必须写进 Environment,因为 systemd 环境不会读取 /etc/profile,这一步漏了会导致 service 启动失败。
写入文件后执行:
sudo useradd -r -s /sbin/nologin mycat sudo chown -R mycat:mycat /opt/mycat2 sudo systemctl daemon-reload sudo systemctl enable --now mycat2 systemctl status mycat2 --no-pager注意 chown 之前要先确认 mycat 用户存在,否则会报错。enable --now 把开机自启和立即启动一次合并完成,省去单独 start。status 输出里只要看到 active (running),说明 systemd 这一层已经接管成功。
如果 service 启动失败,先用 journalctl -u mycat2 查看日志,而不是直接去 logs 目录翻文件。systemd 会把启动脚本的标准输出和标准错误也收集起来,这里的信息往往比应用日志更直接。
4.3 端口 8066 和 9066 都分别干吗的
端口验证是判断安装包是否真正提供服务的最快方式。8066 是数据端口,应用连接的入口,SQL 都从这里进出;9066 是管理端口,用来查看运行状态、加载配置等运维操作。两者默认都是 TCP 端口,对外网不要直接暴露。
ss -lntp | grep -E '(:8066|:9066)'正常情况下,这两行输出都会存在,且进程名是 java。如果 8066 在但 9066 不在,说明管理端口没有绑定成功,需要去 server.json 里检查 ip 配置。如果两个端口都不在,优先看 systemd 状态和应用日志。
管理端口连上以后,不同版本支持的管理命令有差异。常见做法是用 mysql 客户端连接 9066,再执行诸如 SHOW DATABASES 一类命令,查看 Mycat2 对逻辑库的认知。具体命令以安装包内 README 为准,但端口职责是固定的,这可以用来判断问题发生在数据层还是管理层。
4.4 从应用视角跑通真实 SQL,验证路由没有黑匣子
端口起来只是一个开始,真正验证安装包配置是否可用的,是让一组 SQL 从 Mycat 入口进去,在后端 MySQL 里真的落库。下面是一组简单测试,覆盖建表、插入、查询三个基本动作:
SHOW DATABASES; USE logic_tpch; CREATE TABLE travel_order ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, amount DECIMAL(10,2) NOT NULL DEFAULT 0, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB; INSERT INTO travel_order (user_id, amount) VALUES (101, 99.50); SELECT id, user_id, amount FROM travel_order ORDER BY id DESC LIMIT 5;执行建表语句时,Mycat2 会把 CREATE TABLE 解析到逻辑库对应的数据节点,然后由数据源通过 JDBC 转发给后端 MySQL。也就是说,应用通过 8066 建的表,应该真实出现在后端 tpch 库中,而不是只存在于 Mycat 的元数据里。
测试完成后回到后端 MySQL 确认一遍:
SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE table_name = 'travel_order'; SELECT COUNT(*) FROM travel_order;这里能看到刚才建立在逻辑库里的表,说明整个链路是通的。如果后端查不到表,优先检查 datasource.json 里的 databaseName 和 url 是否指向了同一个物理库。很多时候前端能连上逻辑库,但 SQL 被路由到了一个不存在的库,就是因为 databaseName 填错了。
这个验证过程,我建议写成一个固定可重复执行的 SQL 脚本,每次改完配置或者升级安装包后跑一遍。路由中间件最怕升级以后静默出错,应用连上但数据写到了错误的地方,等业务反馈时往往已经晚了。
5. mycat2 基础安装包的首启动高频踩坑:现象、原因、解决
5.1 启动后 3 秒进程消失,日志里只有 Fragment,没有堆栈
现象:执行 ./bin/mycat start 后终端提示成功,但 ps 看不到进程,检查日志发现内容很少,或者只有一行虚拟机参数异常,没有完整的 Java 异常堆栈。
原因:最常见是 JAVA_HOME 没配,或者配到了 32 位 JDK。Mycat2 的启动脚本依赖 JAVA_HOME 定位 java 可执行文件,如果变量为空,脚本可能调用了系统默认的老旧 JDK;如果 JDK 是 32 位而安装包里的 jar 是按 64 位构建的,启动到一半会直接失败。另一种原因是 wrapper 配置里 -Xmx 设置超过可用内存,JVM 无法分配堆空间。
解决:先执行 ./bin/mycat console 前台启动,把报错完整露出来。再执行 java -version 和 echo $JAVA_HOME,确认版本位数。如果问题出在内存,去 wrapper 配置里把 -Xmx 调低,比如改成 -Xmx512m,然后重新启动。这条路径排查下来,绝大多数进程消失问题都能定位。
5.2 应用连 8066 报 Access denied,但本地 MySQL 客户端能连
现象:用账号密码通过 8066 连 Mycat2 报 Access denied,把同一个账号拿到 3306 去连 MySQL 却完全正常。
原因:这是两层认证的界限没分清楚。用户通过 8066 连的是 Mycat2,认证逻辑由 user.json 控制;Mycat2 转发 SQL 到 MySQL,认证由 datasource.json 控制。出现 Access denied,先看是 Mycat 层拒绝还是在 MySQL 层拒绝。如果 MySQL 层拒绝,多半是 datasource.json 里的账号权限不足,或者 MySQL 8 默认的 caching_sha2_password 认证插件和驱动不兼容。
解决:先用 Mycat 层账号登录 9066 管理端口,确认是否能建立会话;再直接到后端 MySQL 执行 SHOW GRANTS,查看 datasource 账号的授权范围。如果授权的库和 datasource 里 databaseName 不一致,需要补授权。如果 MySQL 8 插件导致驱动报错,可以创建 mysql_native_password 账号,或者在连接串里显式指定允许插件。这类问题往往不是配置格式错,而是账号体系错位。
5.3 配置改了不生效,删掉旧表还继续出现在逻辑库里
现象:修改 schema.json 或 datasource.json,重启 Mycat2,甚至重启服务器,应用侧看到的逻辑库和表结构还是旧的。
原因:Mycat2 启动时会把配置加载到内置元数据存储,某些版本的元数据缓存在内存或本地内嵌数据库中,修改文件后如果没有触发重新加载,或者没有重新发布配置,旧元数据仍然生效。重启进程在部分情况下也不够,因为它会把上次持久化的元数据重新加载回来。
解决:确认安装包文档里约定的配置发布方式,通常是连接 9066 管理端口执行 reload 相关命令,而不是手动改文件后直接 restart。操作顺序应该是:备份 conf 目录,修改 JSON,执行 reload,再看日志确认加载成功。如果管理命令不可用,考虑删除元数据存储目录后再重启,但删除前必须备份配置。最稳妥的办法是重新解压一份新的安装包,把 conf 按模板重写一遍,避免本地元数据干扰。
5.4 端口被占用,8066 被别的进程抢先绑定
现象:日志显示 BindException 或 Address already in use,但 ss 看端口时又只剩一个进程占用,确认不是 Mycat 自己的重复进程。
原因:最常见的是本机另一个 MySQL 实例把端口设为 8066,或者监控 agent 恰好同名端口。Mycat2 默认端口和常见 MySQL 默认端口 3306 不一样,本不冲突,但如果之前有人改过 MySQL 配置,把 3306 改成 8066,就会撞上。
解决:执行 lsof -i:8066 或者 ss -lntp | grep 8066 找到占用进程,确认业务归属后停掉它或改 Mycat 端口。改 Mycat 端口的位置在 server.json,把 port 和 managerPort 调整到业务规划范围。改完后重新加载配置并验证。生产环境建议把端口号固定写入 CMDB,避免后续机器复用时再次冲突。
5.5 JDK 版本与 jar 包字节码不匹配,启动抛 UnsupportedClassVersionError
现象:启动日志出现 UnsupportedClassVersionError,或者提示 class file has wrong version XX.0,应该用 xx 版本。
原因:安装包构建时使用了更高版本的 JDK,而本地 JVM 版本较低,运行时无法识别新版字节码。比如安装包用 JDK 11 编译,本地却只有 JDK 8,JVM 会直接拒绝加载。这类信息在启动瞬间出现,很多人误以为 jar 包损坏。
解决:先看错误信息里的 major.minor version 数字,再对照 JDK 版本映射确认缺口。接着下载对应版本的 JDK,更新 JAVA_HOME 到新路径。更新完以后不要只开新终端测试,要确认 systemd 单元里 Environment 的 JAVA_HOME 也同步修改,否则服务方式启动还是老 JDK。这个问题的根在于环境版本管理和中间件版本没有联动,我一般会在安装目录下放一个 env.sh 统一维护 JDK 路径。
6. 在安装包之外补一手:校验、备份和一条验证命令
接手 Mycat2 这类中间件以后,我吃过最大的亏是安装包裸奔。裸奔的意思是:没有校验文件、没有配置备份、没有一条可重复的验证命令。等到线上流量异常时,连配置是什么时候被谁改的都不知道。所以我现在不管内网还是外网下载安装包,都要先做三件小事。
第一,校验。下载完成后立刻计算 SHA256,保存校验值。如果安装包来源是内网镜像,镜像侧也有校验值,两边对比一致再解压。校验这一步能筛掉很多来源不可靠的包,也能在团队内部追责时留下依据。
第二,备份。解压出 bin、lib、conf 以后,先整体做一次基线备份。之后每次修改 conf,按日期打一份快照,比如 conf_20250101。中间件配置不像业务代码,没有 Git 管理流程,一旦改坏很难回滚。手动快照是成本最低的后悔药。
第三,写一条冒烟验证命令。不要每次验证都靠人工敲 SQL,我把建表、插入、查询缩成一个脚本文件:
#!/usr/bin/env bash set -euo pipefail PORT=8066 USER=root PASS=123456 LOGIC_DB=logic_tpch if ! ss -lntp | grep -q ":$PORT"; then echo "port $PORT is not listening" exit 1 fi mysql -h127.0.0.1 -P"$PORT" -u"$USER" -p"$PASS" \ -e "SELECT 1; USE $LOGIC_DB; SELECT COUNT(*) FROM travel_order;"脚本里先检查端口,再通过 8066 入口执行基础 SQL,只要端口没监听或者 SQL 失败,立即返回非零状态。把它放到 /etc/mycat2/smoke.sh,配合 cron 或 systemd timer 定时执行,能及时发现服务假死和配置损坏。
我现在的习惯是每次升级安装包之前跑一遍旧版本的冒烟脚本,升级之后立刻再跑一遍,两次输出一致才把流量切过去。这个习惯救过我一次:某次升级后数据端口能连上,但路由表没加载,应用全部读写失败,冒烟脚本在切换前就暴露了问题。中间件安装包只是开始,真正让方案可靠的是安装包之外这套校验、备份和验证流程。希望每个在数据库拆分路上折腾的工程师,都能先把这条底线搭起来,再放开手做分库分表和读写分离。希望帮到你。
本文还有配套的精品资源,点击获取