在debian上定制mysql 8.0必须用dpkg-buildpackage打包,因make install违反fhs规范、缺失依赖声明且无服务管理配置,无法被apt管理;直接tar打包不可复现、不可分发。

直接说结论:在 Debian 上用源码打包定制版 MySQL 8.0,dpkg-buildpackage 是唯一可靠路径;用 make install 装到系统目录不是“打包”,也不可复现、不可分发、无法被 APT 管理。
为什么不能直接 make install 后 tar 打包
看似简单,但会踩三个硬坑:
-
make install默认写死路径(如/usr/local/mysql),不遵循 Debian FHS 规范(比如二进制该放/usr/bin,配置该放/etc/mysql,数据目录该是/var/lib/mysql) - 缺失依赖声明 —— 生成的 tar 包没
control文件,APT 不知道它要libssl1.1还是libssl3,安装时静默失败 - 服务管理失效 ——
systemd单元文件、logrotate 配置、默认 my.cnf 模板全得手动补,且和系统其他 MySQL 包冲突
必须用 debian/ 目录 + dpkg-buildpackage
Debian 官方 MySQL 源码包(mysql-server_8.0.x.dsc)自带完整 debian/ 目录,这才是定制基础。别自己从头写 rules —— 直接复用它:
- 先获取官方源码包:
wget http://archive.debian.org/debian/pool/main/m/mysql-server/mysql-server_8.0.35-1debian12.dsc(注意选对应 Debian 版本,如 bookworm) - 解包:
dpkg-source -x mysql-server_8.0.35-1debian12.dsc→ 得到带debian/子目录的源码树 - 修改前先看清楚:
debian/rules里调的是cmake,所有编译参数走DEB_CMAKE_EXTRA_FLAGS传入,不是改 CMakeLists.txt - 例如加调试符号并禁用 RocksDB:
echo 'DEB_CMAKE_EXTRA_FLAGS += -DWITH_DEBUG=ON -DPLUGIN_ROCKSDB=OFF' >> debian/rules
关键 patch 点和 build-dep 处理
定制常改这几处,但每改一个都影响构建链:
- 字符集默认值在
debian/rules里通过-DDEFAULT_CHARSET=utf8mb4控制,别去动sql/share/charsets/ - 若要换 SSL 后端(如用
openssl替yaSSL),必须确保build-deps包含libssl-dev,并在debian/control的Build-Depends:行显式添加 - Boost 路径由
debian/rules中的BOOST_DIR变量控制,默认指向源码内建的boost/子目录;若想用系统 Boost,得删掉源码里的boost/并加-DWITH_BOOST=/usr/include/boost - 运行
sudo apt build-dep mysql-server装全构建依赖,缺libncurses5-dev或zlib1g-dev会导致 cmake 配置阶段直接退出,错误信息藏在debian/build/CMakeFiles/CMakeOutput.log里
打包后验证 deb 是否可用
生成的 .deb 包不是扔过去就能装,得过两关:
- 检查控制字段:
dpkg-deb -I mysql-server_8.0.35-1debian12_amd64.deb | grep -E "(Version|Architecture|Depends)"→ 确认Depends:里有libssl3 (>= 3.0.0)这类真实依赖,不是空或错写成libssl1.1 - 本地安装测试:
sudo dpkg -i *.deb,立刻跟sudo apt-get -f install修依赖,再sudo systemctl start mysql;如果报Failed to start mysql.service: Unit mysql.service not found,说明debian/mysql-server.postinst没正确安装 systemd 单元 —— 回头查debian/install是否漏了debian/mysql-server.mysql.service => /lib/systemd/system/mysql.service
最易被忽略的是:每次改 debian/changelog 必须用 dch -i,不能手改。少一个空行、版本号没加 -1mybuild1 后缀,dpkg-buildpackage 就会拒绝构建,且错误提示极不友好 —— 它只报 “malformed changelog”,不指哪行。











