无法通过套接字连接到本地 MySQL 服务器

Mar*_*tin 2 mysql

我试图通过运行以下命令来调整正在运行的 mysql-server 的性能:

mysqld_safe --key_buffer_size=64M --table_cache=256 --sort_buffer_size=4M --read_buffer_size=1M &
Run Code Online (Sandbox Code Playgroud)

在此之后,我无法从运行 mysql 的服务器连接 mysql。我收到此错误:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
Run Code Online (Sandbox Code Playgroud)

但是,幸运的是我仍然可以远程连接到 mysql。所以我所有的网络服务器仍然可以访问 mysql 并且运行没有任何问题。因此,尽管我不想尝试重新启动 mysql 服务器,因为这可能会将一切搞砸。

现在我知道 mysqld_safe 正在启动 mysql-server,并且由于 mysql 服务器已经在运行,我猜这是两个 mysql 服务器运行并侦听同一个端口的某种问题。

有没有办法在不重新启动初始mysql服务器的情况下解决这个问题?

更新:这就是ps xa | grep "mysql"说:

11672 ?        S      0:00 /bin/sh /usr/bin/mysqld_safe
11780 ?        Sl   175:04 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
11781 ?        S      0:00 logger -t mysqld -p daemon.error
12432 pts/0    R+     0:00 grep mysql
Run Code Online (Sandbox Code Playgroud)

更新 2:现在尝试重新启动。停止工作正常,但启动失败。令我惊讶的是,mysql-server 仍然没有问题地运行,所以我真的不知道它停止了什么。

更新 3:我很确定这是现在的问题:当我第一次启动 mysql 时,它把它的 processid 写入 /var/run/mysqld/mysqld.pid 并将套接字写入 /var/run/mysqld/mysqld.sock .

然后当我运行 mysqld_safe 命令时,它删除了这些文件。现在我无法停止 mysql-server,因为 stop 命令需要这些文件。有什么方法可以恢复这些文件吗?我猜 pid 文件只是一个带有进程 ID 的文件?我不想仅仅终止该进程,因为对该服务器的写入非常多,并且终止 mysql 通常以损坏的数据库结束。

Dmi*_*kov 5

检查bind-address您的my.cnf. 它应该是0.0.0.0为了允许本地和远程连接。

检查ps xa | grep mysql运行了多少个实例。

编辑
显然:

Unix 上的 MySQL 客户端可以通过两种不同的方式连接到 mysqld 服务器:通过使用 Unix 套接字文件通过文件系统中的文件(默认为 /tmp/mysql.sock)进行连接,或使用 TCP/IP 连接通过端口号。Unix 套接字文件连接比 TCP/IP 快,但只能在连接到同一台计算机上的服务器时使用。如果不指定主机名或指定特殊主机名 localhost,则使用 Unix 套接字文件。

检查这里的一些有用的技巧。

Edit2
的可能原因之一Can't connect to local MySQL server,这似乎是这里的问题:

有人删除了 mysqld 使用的 Unix 套接字文件(默认为 /tmp/mysql.sock)。例如,您可能有一个从 /tmp 目录中删除旧文件的 cron 作业。您始终可以运行 mysqladmin version 来检查 mysqladmin 尝试使用的 Unix 套接字文件是否确实存在。在这种情况下的修复是更改 cron 作业以不删除 mysql.sock 或将套接字文件放在其他地方。请参阅第 B.5.4.5 节,“如何保护或更改 MySQL Unix 套接字文件”。

Martin,请确保您socket = /var/run/mysqld/mysqld.sock在 my.cnf 中有,我相信 mysqld restart 会解决您的问题,它应该重新创建 mysqld.sock 并且您应该能够在本地连接。