Archlinux: Can't connect to local MySQL server through socket '/tmp/mysql.sock'
产生原因
1. 系统环境:archlinux
+Hyprland
2. 出现情景:使用pacman
安装mysql
# 更新源
sudo pacman -Syy
# 安装
sudo pacman -S mysql
# 初始化(注意初始用户名和密码)
sudo mysqld --initialize --user=mysql --basedir=/usr --datadir=/var/lib/mysql
# 启动服务
sudo systemctl start mysqld.service
sudo systemctl enable mysqld.service
# 登录
mysql -u root -p
# 修改密码
alter user 'root'@'localhost' identified by '123456';
解决措施
查询资料:这个
mysql.sock
应该是mysql的主机和客户机在同一host(物理服务器)上的时候,使用unix domain socket做为通讯协议的载体,它比tcp快。解决方式(1):使用
mysql -u root -h 127.0.0.1 -p
而非mysql -u root -h localhost -p
,或者直接使用-S
参数指定sock
文件位置。解决方式(2):
运行
mysql_config --socket
命令,它会输出mysql
用于连接的默认sock
文件位置(我的是/tmp/mysql.sock
)。配置
my.cnf
:通过
sudo find / -name my.cnf
找到对应的文件。编辑文件
/etc/mysql/my.cnf
(可能位置不一样)[mysqld] datadir=/var/lib/mysql # socket=/run/mysqld/mysqld.sock # 配置成上述sock文件地址 socket=/tmp/mysql.sock
按照网上找的资料教程到这里就已经解决问题了,但是可能是linux发行版不同,我的问题并未得到解决,依旧报同样的错误。
最终原因:由于
PrivateTmp=true
为目录名称中提到的服务启用了安全temp
系统功能,导致生成的sock
文件位置与上述配置仍不一致。起初是想通过
sudo find / -name mysql.sock
找一下sock
文件的位置,结果找到了/tmp/system-private-xxxxxx
文件夹里的./temp/mysql.sock
,这与我配置的位置只是多了一些前缀。$ sudo find / -name mysql.sock /tmp/systemd-private-a39c23720e4245c19eb02657e83e14a0-mysqld.service-5vYhrX/tmp/mysql.sock
询问
chatgpt
得知是由于服务文件中开启temp
安全设置引起的,通过grep -R PrivateTmp /etc/systemd/
找到mysql.service
$ grep -R PrivateTmp /etc/systemd/ /etc/systemd/system/multi-user.target.wants/mysqld.service:PrivateTmp=true /etc/systemd/system/dbus-org.bluez.service:PrivateTmp=true /etc/systemd/system/bluetooth.target.wants/bluetooth.service:PrivateTmp=true /etc/systemd/system/dbus-org.freedesktop.timesync1.service:PrivateTmp=yes /etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service:PrivateTmp=yes
修改找到的
/etc/systemd/system/multi-user.target.wants/mysqld.service
,设置PrivateTmp=false
关闭mysql
服务的该项安全配置。由于修改
service
文件,要通知systemd
重载此配置文件,而后可以选择重启,使用命令systemctl daemon-reload
使用
sudo rm -rf /tmp/*
删除临时文件后重启mysql
服务:sudo systemctl restart mysqld.service