二进制包是Debian 12上绕过MariaDB冲突的唯一选择,因其不走dpkg数据库、不写系统库路径,彻底避开libmysqlclient.so.21等符号链接被mariadb-libs“锁死”的依赖冲突。

为什么二进制包是Debian 12上绕过MariaDB冲突的唯一选择
Debian 12默认预装mariadb-client和mariadb-server,它们会占用libmysqlclient.so.21符号链接路径。一旦你用apt install mysql-server,就会触发依赖冲突,报错cannot open shared object file: libmysqlclient.so.21——这不是配置问题,是底层库被MariaDB“锁死”了。二进制包不走dpkg数据库,不写/usr/lib/x86_64-linux-gnu/,彻底避开这个坑。
卸载MariaDB必须清理的三个关键包
只运行apt purge mariadb-server mariadb-client远远不够。残留的mariadb-libs仍会干扰mysqld启动。必须手动确认并清除:
-
dpkg -l | grep -E 'mariadb|mysql'列出所有相关包 - 对每个输出项执行
dpkg -P --force-depends <包名>(注意是-P,不是-r) - 特别检查
libmariadb3、mariadb-common、mariadb-client-core-11是否清空 - 最后运行
find /usr -name "libmysqlclient.so*" 2>/dev/null,确保无残留
初始化失败的四个常见原因与修复
mysqld --initialize静默失败?多半卡在权限或路径上。重点排查:
-
--datadir指定的路径必须为空目录,不能有ibdata1或auto.cnf残留文件 - 运行用户必须是
mysql(useradd -r -s /bin/false mysql),且chown -R mysql:mysql /usr/local/mysql要递归到子目录 - 缺失
libaio1或libnuma1:用ldd /usr/local/mysql/bin/mysqld | grep "not found"直观看缺什么 - glibc版本不匹配:Debian 12自带glibc 2.36,但某些MySQL 8.0二进制包标称
glibc2.12或glibc2.17,只要≥系统版本就可用;若提示GLIBC_2.x not found,说明包太老,换glibc2.34或更高版本的包
my.cnf里必须显式声明的三个路径
二进制包不读/etc/mysql/my.cnf,也不自动推导路径。漏写任一,systemctl start mysqld必报Failed to start mysqld.service。配置段[mysqld]中这三项必须存在且绝对路径正确:
-
basedir = /usr/local/mysql(不能带版本号后缀,不能是软链接路径) -
datadir = /usr/local/mysql/data(必须与--initialize命令中参数完全一致) -
socket = /tmp/mysql.sock(路径需真实存在,且mysql用户有读写权;不要用/var/run/mysqld/mysqld.sock,那个是apt安装专用)
复杂点在于:这些路径一旦写死,后续迁移数据或调整目录结构时,mysqld不会报错,只会静默使用默认路径(如/var/lib/mysql),导致你查日志也找不到线索。务必在my.cnf里加注释标明来源。


















