产生原因

1. 系统环境:archlinux+Hyprland

2. 出现情景:使用pacman安装mysql

# 更新源
sudo pacman -Syy

# 安装
sudo pacman -Si 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';


解决措施
  1. 查询资料:这个mysql.sock应该是mysql的主机和客户机在同一host(物理服务器)上的时候,使用unix domain socket做为通讯协议的载体,它比tcp快。

  2. 解决方式(1):使用mysql -u root -h 127.0.0.1 -p而非mysql -u root -h localhost -p,或者直接使用-S参数指定sock文件位置。

  3. 解决方式(2):

    1. 运行mysql_config --socket 命令,它会输出mysql用于连接的默认sock文件位置(我的是/tmp/mysql.sock)。

    2. 配置my.cnf:

      1. 通过sudo find / -name my.cnf找到对应的文件。

      2. 编辑文件/etc/mysql/my.cnf (可能位置不一样)

        [mysqld]
        datadir=/var/lib/mysql
        # socket=/run/mysqld/mysqld.sock
        # 配置成上述sock文件地址
        socket=/tmp/mysql.sock
    3. 按照网上找的资料教程到这里就已经解决问题了,但是可能是linux发行版不同,我的问题并未得到解决,依旧报同样的错误。

    4. 最终原因:由于PrivateTmp=true为目录名称中提到的服务启用了安全temp系统功能,导致生成的sock文件位置与上述配置仍不一致。

      1. 起初是想通过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
      2. 询问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
      3. 修改找到的/etc/systemd/system/multi-user.target.wants/mysqld.service,设置PrivateTmp=false 关闭mysql服务的该项安全配置。

      4. 由于修改service文件,要通知systemd重载此配置文件,而后可以选择重启,使用命令systemctl daemon-reload

      5. 使用sudo rm -rf /tmp/*删除临时文件后重启mysql服务:sudo systemctl restart mysqld.service

文章作者: 梦鱼
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dream sea
error linux sql
喜欢就支持一下吧