Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (111)

本文介绍在CentOS7上解决因交换内存不足导致的MySQL启动问题,通过创建和启用Swap文件增加交换空间,调整系统性能参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决方案: 在CentOS 7上添加缓存Swap

问题描述:当我想在CentOS上运行mysql时,突然遇到错误如Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
在这里插入图片描述
上文图片截图来源于:https://www.digitalocean.com/community/questions/mysql-server-keeps-stopping-unexpectedly

在这里插入图片描述
表面原因是mysql没有启动,于是运行命令:service mysql start,提示我没有找到该组件
在这里插入图片描述
于是我们再抱着侥幸心理运行这个命令试一下:systemctl status mysqld.serrvice
在这里插入图片描述
在这里插入图片描述
结论:遇到这种问题,表面问题是服务器启动不了,本质是交换内存(Swap)不足

下面我们就在CentOS上来解决这个问题吧

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 我们可以通过使用swapon通用交换实用程序来查看系统是否具有任何已配置的交换。使用该-s标志,swapon将在我们的存储设备上显示交换使用情况和可用性的摘要:
swapon -s

如果该命令没有返回任何内容,则摘要为空并且不存在交换文件。
在这里插入图片描述

另一种检查交换空间的方法是使用该free实用程序,它向我们显示系统的总体内存使用情况。我们可以通过键入以下内容来查看当前内存和交换使用情况(以兆字节为单位):

free -m
             total       used       free     shared    buffers     cached
Mem:          3953        315       3637          8         11        107
-/+ buffers/cache:        196       3756
Swap:            0          0       4095

在这里插入图片描述

如您所见,系统中的总交换空间为0.这与我们所看到的相符swapon。

  1. 检查可用存储空间
    为交换分配空间的典型方法是使用专用于该任务的单独分区。但是,由于硬件或软件限制,并不总是可以改变分区方案。幸运的是,我们可以轻松创建驻留在现有分区上的交换文件。

在我们这样做之前,我们应该了解当前的驱动器使用情况。我们可以输入以下信息来获取此信息

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        59G  1.5G   55G   3% /
devtmpfs        2.0G     0  2.0G   0% /dev
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           2.0G  8.3M  2.0G   1% /run
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup

在这里插入图片描述
注意:该-h标志只是告诉您dh以人性化的阅读格式输出驱动器信息。例如,不是在分区中输出原始数量的内存块,而是df -h告诉我们M(兆字节)或G(千兆字节)的空间使用情况和可用性。

  1. 创建交换文件
    现在我们知道了可用的存储空间,我们可以在文件系统中创建交换文件。我们将创建一个swapfile在root(/)目录中调用的文件,但如果您愿意,可以将文件命名为其他文件。该文件必须为我们的交换文件分配我们想要的空间量。

创建交换文件的最快速最简单的方法是使用fallocate。此命令立即创建预分配大小的文件。我们可以输入以下内容创建一个4G的文件:

sudo fallocate -l 4G /swapfile

在这里插入图片描述

输入密码以授权sudo权限后,几乎可以立即创建交换文件,并且会将提示返回给您。我们可以使用以下方法验证是否为swap保留了正确的空间量ls:

ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Oct 30 11:00 /swapfile

在这里插入图片描述

如您所见,我们的交换文件是在留出正确数量的空间的情况下创建的。

  1. 启用交换文件
    现在,我们的文件已创建,但我们的系统不知道这应该用于交换。我们需要告诉我们的系统将此文件格式化为swap,然后启用它。

在我们这样做之前,我们应该调整我们的交换文件的权限,以便除root帐户之外的任何人都无法读取它。允许其他用户读取或写入此文件将是一个巨大的安全风险。我们可以使用以下命令锁定权限chmod:

sudo chmod 600 /swapfile

在这里插入图片描述

这将仅限制root帐户的读取和写入权限。我们可以ls -lh再次使用来验证交换文件是否具有正确的权限:

ls -lh /swapfile
-rw------- 1 root root 4.0G Oct 30 11:00 /swapfile

在这里插入图片描述

既然我们的交换文件更安全,我们可以通过输入以下内容告诉我们的系统设置交换空间以供使用:

sudo mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=b99230bb-21af-47bc-8c37-de41129c39bf

在这里插入图片描述
我们的交换文件现在可以用作交换空间。我们可以通过键入来开始使用它:

sudo swapon /swapfile

要验证程序是否成功,我们可以检查我们的系统是否现在报告交换空间:

swapon -s
Filename                Type        Size    Used    Priority
/swapfile               file        4194300 0     -1

在这里插入图片描述
在这里插入图片描述

此输出确认我们有一个新的交换文件。我们可以free再次使用该实用程序来证实我们的发现:

free -m
             total       used       free     shared    buffers     cached
Mem:          3953        315       3637          8         11        107
-/+ buffers/cache:        196       3756
Swap:         4095          0       4095

在这里插入图片描述
我们的交换已成功设置,我们的操作系统将根据需要开始使用它。

使交换文件永久化
我们的交换文件目前已启用,但是当我们重新启动时,服务器将不会自动启用该文件以供使用。我们可以通过修改fstab文件来更改它,该文件是管理文件系统和分区的表。

sudo在文本编辑器中使用权限编辑文件:

sudo nano /etc/fstab

在文件的底部,您需要添加一行来告诉操作系统自动使用您创建的交换文件:

/swapfile   swap    swap    sw  0   0

添加完行后,可以保存并关闭文件。服务器将在每次启动时检查此文件,以便从现在开始准备好使用交换文件。

调整您的交换设置(可选)
您可以配置一些选项,这些选项会在处理交换时对系统的性能产生影响。在大多数情况下,这些配置是可选的,您所做的更改将取决于您的应用程序需求和个人偏好。

Swappiness
该swappiness参数确定系统将数据从内存交换到交换空间的频率。这是介于0和100之间的值,表示将触发交换使用的内存使用百分比。

值接近于零时,除非绝对必要,否则系统不会将数据交换到驱动器。请记住,与交换文件的交互是“昂贵的”,因为它们比与内存的交互慢得多,并且读写速度的这种差异可能导致应用程序性能的显着降低。告诉系统不要依赖交换,通常会使您的系统更快。

接近100的值将尝试将更多数据放入交换中以努力保持更多内存空闲。根据应用程序的内存配置文件或服务器的使用情况,在某些情况下,这可能是更好的选择。

我们可以通过读取swappiness配置文件来查看当前的swappiness值:

cat /proc/sys/vm/swappiness

30
CentOS 7默认为30的swappiness设置,这对于大多数台式机和本地服务器来说是一个公平的中间立场。对于VPS系统,我们可能希望将其移近0。

我们可以使用该sysctl命令将swappiness设置为不同的值。例如,要将swappiness设置为10,我们可以键入:

sudo sysctl vm.swappiness=10

vm.swappiness = 10
此设置将持续到下次重新启动。要在重新启动之间保持设置,我们可以将输出的行添加到sysctl配置文件中:

sudo nano /etc/sysctl.conf
将您的swappiness设置添加到文件的底部:

vm.swappiness = 10
添加完行后,可以保存并关闭文件。服务器现在将自动将swappiness设置为您在每次启动时声明的值。

缓存压力
您可能想要修改的另一个相关值是vfs_cache_pressure。此设置会影响特殊文件系统元数据条目的存储。不断读取和刷新此信息通常非常昂贵,因此将其存储在缓存中的时间更长,这对于系统的性能非常有用。

您可以通过proc再次查询文件系统来查看此缓存压力的当前值:

cat /proc/sys/vm/vfs_cache_pressure

100
由于当前配置,我们的系统从缓存中删除inode信息的速度太快。我们可以通过使用sysctl以下方式将其设置为更保守的设置,如50;

sudo sysctl vm.vfs_cache_pressure=50

vm.vfs_cache_pressure = 50
同样,这仅适用于我们当前的会话。我们可以通过将其添加到配置文件来改变它,就像我们使用swappiness设置一样:


sudo nano /etc/sysctl.conf

在底部,添加指定新值的行:

vm.vfs_cache_pressure = 50

在这里插入图片描述
添加完行后,可以保存并关闭文件。服务器现在将自动将缓存压力设置为您在每次启动时声明的值。

原文网址:https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-centos-7#check-available-storage-space

然后再次登陆mysql发现,又回到最初的起点:
那么这个问题就是表面问题了,只需要启动mysql服务就好了
代码如下

systemctl start mysqld.service #启动mysql服务
systemctl status myqld.service #查看服务状态

在这里插入图片描述

<think>好的,我现在需要解决用户在Linux中遇到的MySQL连接问题,错误信息是“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”。首先,我得理清可能的原因,然后逐步排查。 用户提到了几个引用,其中引用[1]、[2]、[3]都描述了相同的错误,引用[4]提到修改my.cnf文件来指定socket路径。看来常见的原因包括MySQL服务未启动、socket文件路径错误或权限问题,或者配置文件中的设置不正确。 首先,我应该检查MySQL服务是否运行。如果服务没启动,自然无法连接。用户可以通过systemctl status mysql或者service mysql status来查看状态。如果服务未运行,启动它可能解决问题。如果启动失败,可能需要查看日志,比如/var/log/mysql/error.log,找找启动失败的原因,比如端口占用、配置错误等。 其次,确认socket文件是否存在。默认路径是/var/lib/mysql/mysql.sock,如果不存在,可能是因为MySQL没有正确安装,或者配置文件中指定的路径不同。用户可以使用find或locate命令搜索mysql.sock的位置。如果路径不一致,可能需要调整客户端配置,比如在/etc/my.cnf或~/.my.cnf中指定正确的socket路径,如引用[4]中的例子所示。此外,检查是否有权限问题,确保mysql用户有权限访问socket文件和所在目录。 另外,有时用户可能误用了localhost连接,这会强制使用socket连接,而如果MySQL配置的是网络端口,可能需要使用127.0.0.1代替localhost,这时会走TCP/IP连接而不是socket。可以建议用户尝试mysql -h 127.0.0.1 -u 用户名 -p,看看是否能连接,这样可以绕过socket的问题,确认是否是socket配置的问题。 还有可能是磁盘空间不足,导致MySQL无法创建socket文件或写入数据。用df -h检查磁盘使用情况,特别是/var/lib/mysql所在的分区。 如果配置文件被修改过,比如引用[4]中的情况,用户需要确认[client]、[mysqld]等部分中的socket路径是否一致,并且重启服务使配置生效。如果修改了socket路径,所有客户端工具都需要知道新的路径,否则会报错。 权限方面,/var/lib/mysql目录和mysql.sock文件的权限是否正确?通常应该是mysql用户和组,权限为660或755。如果权限不对,可以用chown和chmod调整。 最后,如果以上步骤都无效,可能需要重新安装MySQL或者恢复备份的配置文件,或者寻求更深入的日志分析。 在回答时,需要分步骤说明,引导用户逐一排查,确保每个可能的点都覆盖到,并给出具体的命令和操作建议,同时提醒用户注意备份配置文件,避免操作失误。需要结合用户提供的引用内容,尤其是引用[4]中的配置方法,指导用户正确修改配置文件,并重启服务。这样用户能系统地解决问题,而不仅仅是尝试一种方法。</think>### 逐步解决方案 以下是解决Linux中MySQL无法通过socket连接的详细步骤: --- #### **步骤1:检查MySQL服务状态** 首先确认MySQL服务是否正在运行: ```bash systemctl status mysql # 或 service mysql status ``` - **若未运行**:尝试启动服务 ```bash systemctl start mysql # 或 service mysql start ``` - **若启动失败**:查看日志定位问题(日志路径通常为`/var/log/mysql/error.log`)[^2][^3]。 --- #### **步骤2:确认socket文件是否存在** 检查默认socket文件路径`/var/lib/mysql/mysql.sock`: ```bash ls -l /var/lib/mysql/mysql.sock ``` - **若文件不存在**: 1. 确认MySQL配置文件`/etc/my.cnf`或`/etc/mysql/my.cnf`中是否指定了其他路径[^4]。 2. 使用`find`搜索文件位置: ```bash find / -name mysql.sock 2>/dev/null ``` 3. 若路径不一致,需同步客户端和服务的socket配置(见步骤4)。 --- #### **步骤3:尝试TCP/IP连接** 临时绕过socket连接,使用TCP/IP验证服务是否可用: ```bash mysql -h 127.0.0.1 -u 用户名 -p ``` - **若连接成功**:说明问题仅与socket配置相关。 - **若连接失败**:需排查服务是否监听端口(默认3306): ```bash netstat -tuln | grep 3306 ``` --- #### **步骤4:修改配置文件** 编辑MySQL配置文件(通常为`/etc/my.cnf`): ```bash vim /etc/my.cnf ``` 添加以下内容确保socket路径一致: ```ini [mysqld] socket=/var/lib/mysql/mysql.sock # 服务端socket路径 [client] socket=/var/lib/mysql/mysql.sock # 客户端socket路径 ``` 保存后重启服务: ```bash systemctl restart mysql ``` --- #### **步骤5:检查文件权限** 确保MySQL用户拥有socket文件及目录权限: ```bash chown -R mysql:mysql /var/lib/mysql chmod 755 /var/lib/mysql chmod 660 /var/lib/mysql/mysql.sock ``` --- #### **步骤6:处理磁盘空间不足** 检查磁盘剩余空间: ```bash df -h /var/lib/mysql ``` - 若空间不足,清理日志或迁移数据目录。 --- #### **步骤7:重装MySQL(终极方案)** 若以上步骤无效,备份数据后重装: ```bash apt purge mysql-server # Debian/Ubuntu yum remove mysql-server # CentOS/RHEL rm -rf /var/lib/mysql # 谨慎操作! apt install mysql-server ``` --- ### 关键操作示意图 ``` 服务状态 → Socket文件 → 配置同步 → 权限修复 → 磁盘检查 ``` ### 相关问题 1. 如何查看MySQL错误日志的具体路径? 2. 如何修改MySQL的默认数据存储目录? 3. 为什么使用`127.0.0.1`可以连接而`localhost`失败? --- 通过上述步骤,可覆盖90%以上的socket连接问题。若仍报错,请提供具体日志信息进一步分析[^1][^4]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Philtell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值