在 macOS 上使用 Homebrew 的多个 MySQL 版本出现错误 - 无法通过套接字连接到本地 MySQL 服务器

在 macOS 上使用 Homebrew 的多个 MySQL 版本出现错误 - 无法通过套接字连接到本地 MySQL 服务器

我正在尝试使用 Homebrew 设置多个 MySQL 版本。我已经在使用 MySQL 8.*,它运行良好。但是,由于今天的一些旧项目要求,我安装了另一个版本的 MySQL (5.7)。现在当我切换到[电子邮件保护],它给了我以下错误。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

请查看以下详细信息

两个版本的 MySQL 均使用以下方式安装自制

MySQL 8.*(最新)位置
/usr/local/Cellar/mysql/8.0.33/*
MySQL 5.7 位置
/usr/local/Cellar/[email protected]/5.7.42/*

他们的符号链接位于/usr/local/opt/*

我已经修改了[电子邮件保护]如下。

原来的
...
<plist version="1.0">
<dict>
    ...
    <array>
        <string>/usr/local/opt/[email protected]/bin/mysqld_safe</string>
        <string>--datadir=/usr/local/var/mysql</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WorkingDirectory</key>
    <string>/usr/local/var/mysql</string>
</dict>
</plist>
修改的
...
<plist version="1.0">
<dict>
    ...
    <array>
        <string>/usr/local/opt/[email protected]/bin/mysqld_safe</string>
        <string>--datadir=/usr/local/var/mysql57</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WorkingDirectory</key>
    <string>/usr/local/var/mysql57</string>
</dict>
</plist>

为了在版本之间切换,我设置了一个别名~/.zhsrc

# MySQL Version Switching
mysqlv() {
    brew services stop mysql
    brew services stop [email protected]
    brew unlink mysql [email protected]
    brew link --force --overwrite $1
    brew services start $1
}

alias mysql57="mysqlv [email protected]"
alias mysql80="mysqlv mysql"
export PATH="/usr/local/opt/[email protected]/bin:$PATH"

后来我设定密码为了使用以下查询将用户设置为无。

SET PASSWORD FOR root@localhost='';

现在,当我运行别名时mysql57,它会切换并链接 MySQL 版本,但是当我尝试登录时mysql -uroot会出现以下错误。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket 

有人能帮我解决这个问题,以便我可以切换并使用任何版本的 MySQL

答案1

我认为这个问题与两个 mysqld 实例似乎都配置为使用相同的套接字文件有关/tmp/mysql.sock。如果在其中一个实例停止时未正确删除套接字文件,则可能会在启动另一个实例时导致问题。

有不同的选项可以解决这个问题:

  • 使用 TCP 连接 mysqld 服务器,而不是使用套接字
  • 使用 Docker 容器作为 mysql 服务器实例。如果你正在进行 Web 开发,我强烈建议你看一下ddev这使得设置不同版本的 mysqld 变得非常容易。
  • 通过修改至少一个实例的 mysqld 配置来为实例配置不同的套接字文件:
[mysqld]
socket=/tmp/mysql2.sock

相关内容