MySQL 多版本共存时 mysqld
启动失败或端口被占
常见现象是执行
mysqld --initialize或
systemctl start mysqld报错:
Can't start server: Bind on TCP/IP port. Got error: 98: Address already in use,或直接卡在启动状态。本质是多个 MySQL 实例(比如 Homebrew 安装的 8.0 和手动编译的 5.7)默认都试图监听
3306端口,且共享同一套 socket 路径(如
/tmp/mysql.sock)。
解决核心是「隔离」:每个实例必须有独立的
port、
socket、
datadir、
pid-file。不能只改端口,否则客户端连接时仍可能因 socket 路径冲突而失败。 确认当前占用端口的进程:
lsof -i :3306或
netstat -tulpn | grep :3306为新实例指定完整配置路径:
mysqld --defaults-file=/usr/local/etc/my-57.cnf,而非依赖全局
/etc/my.cnf
my-57.cnf中至少显式声明:
[mysqld] port = 3307 socket = /tmp/mysql57.sock datadir = /usr/local/var/mysql57 pid-file = /usr/local/var/mysql57/mysqld.pid
不同版本 MySQL 的 mysql
客户端连接错库或认证失败
典型表现是运行
mysql -u root -p后连上的是旧版本实例,或者提示
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded。这是因为客户端未指定 socket 或 host,且高版本(8.0+)默认使用
caching_sha2_password插件,而低版本客户端不支持。
关键不是升级客户端,而是精准控制连接目标:
用-S指定 socket 文件:
mysql -S /tmp/mysql57.sock -u root -p用
-h 127.0.0.1 -P 3307强制走 TCP,避免 Unix socket 自动路由到默认实例 若必须用旧客户端连 8.0+ 实例,建用户时指定插件:
CREATE USER 'dev'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass';不要依赖
which mysql判断版本——检查
mysql --version和
mysql -e "SELECT VERSION();"是否一致
Homebrew + 手动编译 MySQL 共存时 mysql_install_db
报错找不到 mysqld
Homebrew 的 MySQL 8.0+ 已弃用
mysql_install_db,改用
mysqld --initialize;而某些老教程或脚本仍在调用前者,导致报错
command not found或
Can't find mysqld。更隐蔽的问题是:Homebrew 安装的二进制在
/opt/homebrew/opt/mysql/bin/(Apple Silicon)或
/usr/local/opt/mysql/bin/(Intel),而手动编译的往往在
/usr/local/mysql/bin/,PATH 冲突会导致命令解析错位。
操作前先理清路径归属:
查 Homebrew 版本路径:brew --prefix mysql→ 得到类似
/opt/homebrew/opt/mysql,其
bin下才是真实可执行文件 手动编译版务必用绝对路径调用:
/usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data初始化后立即修改
my.cnf中的
basedir,指向对应安装目录,否则服务启动时会找不到插件或字符集文件
Mac 上 MySQL 服务启停混乱:brew services
和 launchd
冲突
执行
brew services start mysql后发现
ps aux | grep mysqld出现两个进程,或
brew services stop mysql无法真正杀掉进程。这是因为 Homebrew 服务管理器和系统级
launchdplist 文件(如
/Library/LaunchDaemons/homebrew.mxcl.mysql.plist)可能同时注册了同名服务,或残留旧 plist 未清理。
彻底清理步骤:
停止所有相关服务:brew services stop mysql,再手动 kill 掉残留
mysqld进程 删除旧 plist:
sudo rm /Library/LaunchDaemons/homebrew.mxcl.mysql.plist(如果存在) 重载 Homebrew 服务定义:
brew services cleanup,然后
brew services start mysql验证是否唯一:
launchctl list | grep mysql应只返回一行,且
ps aux | grep mysqld进程的
COMMAND列应显示来自 Homebrew 路径 实际部署中,最易被忽略的是
datadir权限和 SELinux/AppArmor 限制——即使配置全对,
mysqld也可能因无法写入数据目录而静默退出。启动失败时优先检查错误日志路径(由
log-error配置项指定),而不是只盯终端输出。
