macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题
如果你通过
sudo port install
命令正常安装了 MySQL,再通过sudo 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';
好了,“导航猫”也能跟以前一样连接了