macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题
如果你通过
sudo port install
命令正常安装了 MySQL,再通过sudo port load
命令启动了 MySQL Server,此刻却发现使用 Navicat 之类的 GUI 软件无法连接,始终返回无法连接到 127.0.0.1 服务器。这是一个小坑,因为他默认使用了 Sock 套接字连接方式。
1. 直接使用套接字
如果你并不在意客户端如何连接 MySQL,你可以直接使用套接字的方式。这里以 Navicat 为例:
很简单,在 Navicat 的高级选项中勾选 使用套接字文件,填写:/opt/local/var/run/mysql57/mysqld.sock
路径即可(版本不同请将中间的 57
修改为你所安装的版本)
当然,你 仍然 需要回到顶部的常规页中 输入密码
为什么是这个路径?
首先我们来看看安装成功后的提示:
On activation if no
/opt/local/etc/mysql57/my.cnf
file exists one will be created
which loads/opt/local/etc/mysql57/macports-default.cnf
.
If a/opt/local/etc/mysql57/my.cnf
file exists MacPorts does not
touch it and any changes you make to/opt/local/etc/mysql57/my.cnf
will be preserved (e.g., during port upgrades, deactivations or activations).
/opt/local/etc/mysql57/my.cnf
is a good place to customize your mysql57 installation.
翻译:
在激活时如果不存在
/opt/local/etc/mysql57/my.cnf
文件,将创建一个加载/opt/local/etc/mysql57/macports-default.cnf
文件的默认文件(也就是默认的my.cnf
)。
MacPorts 不会修改已存在的/opt/local/etc/mysql57/my.cnf
文件。你对/opt/local/etc/mysql57/my.cnf
修改的任何配置都会被保留(即便是使用port
命令更新 MySQL、停用或激活)。
总的来说,通过/opt/local/etc/mysql57/my.cnf
进行配置就行啦。
在安装后未做任何配置的情况下,my.cnf
文件里仅有一句 包含(加载) macports-default.cnf
的语句:
# 注意此处的 !include 并非是不包含(不加载)的意思
!include /opt/local/etc/mysql57/macports-default.cnf
我们再看看 macports-default.cnf
文件:
[mysqld]
# skip-networking so multiple mysql server ports can be loaded without each competing for port 3306.
# skip-networking 用于加载多个 mysql 服务器端口,防止每个服务器都去使用 3306(这里指避免端口冲突)
skip-networking
回到路径问题,在没有做其它配置的情况下,因为 macports-default.cnf
中默认使用了套接字,即 skip-networking
,然后在安装阶段会根据版本创建一个 mysql[Version]
的文件夹在 /opt/local/var/run
下,例如 /opt/local/var/run/mysql57
而 mysqld
进程,即 MySQL Server 启动后会在该目录下写入一个 mysqld.sock.lock
文件
当然还有 mysqld.sock
,不过通过 Finder 是看不到的。所以这里连接这个 mysqld.sock
文件就行了。
因为套接字适用于本机连接,如果数据库不需要局域网或外网访问,直接使用套接字也是一个不错的方式。
2. 使用传统 TCP/IP 连接
传统 TCP/IP 也就是 IP:Port 的方式了,即默认的 127.0.0.1:3306
通过上方使用套接字连接,我们了解到其实 my.cnf
文件是对 macports-default.cnf
文件的覆写(因为 !include
写在最顶部)
所以解决方法非常简单,只需要在 my.cnf
中加入下方配置即可:
# Use default MacPorts settings
!include /opt/local/etc/mysql57/macports-default.cnf[mysqld]
# 覆盖原有配置
skip-networking = OFF
# 自定义端口,如不配置将使用默认 3306
port = 3306
保存后 unload
再 load
MySQL 服务即可
3. 初始化数据库以及启动异常处理
如果你通过 port
重新安装过 MySQL,且手动删除过下方这三个目录里的 mysql[Version]
相关文件夹,你可能会遇到一些问题而需要重新初始化数据库
/opt/local/var/db
/opt/local/var/log
/opt/local/var/run
老生常谈的问题,数据无价,注意备份!备份!备份!
此处仍然以 MySQL 5.7 版本举例,在确保备份以及可以重新初始化 的情况下,首先停止 MySQL 服务:
sudo port unload mysql57-server
然后删除这些目录:
/opt/local/var/db/mysql57
/opt/local/var/db/mysql57-files
/opt/local/var/db/mysql57-keyring
/opt/local/var/log/mysql57
/opt/local/var/run/mysql57
开始初始化工作,其中部分目录需要手动创建,这些目录如果不存在会导致启动失败(当然还需要将所有者赋予 _mysql
):
sudo mkdir /opt/local/var/db/mysql57-files
sudo chown _mysql:_mysql /opt/local/var/db/mysql57-files
sudo mkdir /opt/local/var/db/mysql57-keyring
sudo chown _mysql:_mysql /opt/local/var/db/mysql57-keyring
sudo mkdir /opt/local/var/run/mysql57
sudo chown _mysql:_mysql /opt/local/var/run/mysql57
这里建议 my.cnf
参考如下配置,其功能是打开慢查询日志写入功能以及错误日志的路径指定:
# Use default MacPorts settings
!include /opt/local/etc/mysql57/macports-default.cnf[mysqld]
skip-networking = OFF
port = 3306# Slow query config
slow_query_log = ON
slow_query_log_file = /opt/local/var/log/mysql57/slow.log
long_query_time = 1
log_error_verbosity = 2# Error log
log_error = /opt/local/var/log/mysql57/mysqld.log
如果不配置日志相关路径,则错误日志等文件将会写入到同数据 /opt/local/var/db/mysql57
目录下
所以这里我们还需要手动创建一下日志目录:
sudo mkdir /opt/local/var/log/mysql57
sudo chown _mysql:_mysql /opt/local/var/log/mysql57
目录准备完成后就可以初始化数据库了:
sudo /opt/local/lib/mysql57/bin/mysqld --initialize --user=_mysql
sudo port load mysql57-server
如果版本一致,应该只有这么一句提示:
---> Loading startupitem 'mysql57-server' for mysql57-server
如果你参考了我上方的 my.cnf
配置,那么 获取初始化密码 的命令也是一样的:
sudo cat /opt/local/var/log/mysql57/mysqld.log
最后使用 mysql
命令连接数据库后修改密码即可:
mysql -uroot -p
# 回车后粘贴上方获取的密码连接到数据库
在 MySQL 命令行中执行:
# 将 123456 修改为你需要设置的密码
set password = password('123456');# 如需开放来源连接请执行下方两句,否则无需执行
use mysql;
update user set host='%' where user='root';
好了,“导航猫”也能跟以前一样连接了