必须先终止残留进程并清空/var/lib/mysql目录,否则MySQL无法启动;需用ps aux查mysqld/mariadb进程并kill,再用lsof或netstat确认3306端口空闲,最后rm -rf /var/lib/mysql确保初始化干净。

检查并终止残留的 MySQL 或 MariaDB 进程
安装失败常不是因为缺依赖,而是旧进程锁着端口或数据目录。不关掉它们,新服务根本起不来。
先查有没有 mysqld 或 mariadb 在跑:
-
ps aux | grep -E 'mysqld|mariadb'—— 看输出里是否有mysqld或mariadb进程(注意排除grep自身那行) - 若有,记下 PID,执行
sudo kill -9 PID强制终止;或者更稳妥地用sudo systemctl stop mysqld/sudo systemctl stop mariadb
再确认 3306 是否空闲:
-
sudo lsof -i :3306(若没装 lsof,用sudo netstat -tuln | grep :3306) - 如果返回非空结果,说明端口被占——继续查 PID 并 kill,别跳过这步
卸载冲突的数据库包(尤其是 mariadb-libs)
RPM 系统(CentOS/RHEL/Fedora)里,mariadb-libs 和 mysql-community-libs 提供同名符号但 ABI 不兼容,包管理器会直接拒装,报错类似:
file /usr/lib64/libmysqlclient.so.21 from install of mysql-community-client conflicts with file from package mariadb-libs
这不是配置问题,是硬冲突。必须卸载其中一个:
- CentOS/RHEL:运行
sudo yum remove mariadb-libs(注意:这不会删你的数据库文件,但可能影响依赖它的其他软件,比如某些 PHP 扩展,后续需重装) - Ubuntu/Debian:查
libmariadb3或mariadb-client,执行sudo apt remove libmariadb3 mariadb-client - 卸载后务必清缓存:
yum clean all或apt clean && apt update
清理残留服务注册(Windows 和 systemd 场景)
Windows 上报 The service already exists!,或 Linux 上 systemctl start mysqld 报 “unit not found”,大概率是旧服务名还挂在系统里。
Windows 解法(管理员 CMD):
- 先停旧服务:
net stop MySQL(或net stop MySQL57,依实际服务名而定) - 删注册:
sc delete MySQL(成功提示[SC] DeleteService SUCCESS) - 重装时显式指定服务名和配置:
mysqld --install MySQL80 --defaults-file="C:\my80.cnf"
Linux systemd 场景:
- 旧服务文件可能残留在
/etc/systemd/system/mysqld.service或/usr/lib/systemd/system/mysqld.service - 删掉后执行
sudo systemctl daemon-reload,否则systemctl enable仍会加载旧定义 - 别只删二进制或改配置,不 reload unit 文件,systemd 仍按旧逻辑启动
初始化前必须清空 /var/lib/mysql
安装成功但 systemctl start mysqld 失败,日志里出现 Can't open the mysql.plugin table 或 Failed to find valid data directory,基本可断定是上次初始化中断留下的半成品目录。
不要手动 touch 文件、chown 目录、或 chmod 蒙混过关:
- 先停服务:
sudo systemctl stop mysqld - 删整个数据目录:
sudo rm -rf /var/lib/mysql(确保它不存在,而不是“清空”) - 再启动:
sudo systemctl start mysqld—— 正常情况下会自动触发mysqld --initialize - 若仍失败,手动初始化:
sudo mysqld --initialize --user=mysql --datadir=/var/lib/mysql,临时密码在/var/log/mysqld.log里(搜temporary password)
这个目录一旦有损坏的 ibdata1 或未完成的 redo log,MySQL 就拒绝启动,强行修复极易丢数据。宁可重来,不赌侥幸。


















