无法通过套接字自制程序连接到本地 MySQL 服务器

我最近尝试用自制程序(brew install mysql)安装 MySQL,当我尝试运行它时,我得到以下错误:

ERROR 2002(HY000) : 无法通过 socket’/tmp/MySQL.sock’(2)连接到本地 MySQL 服务器

没有 /tmp/mysql.sock也没有 /var/lib/mysql.sock

我已经搜索过了,没有找到任何 mysql.sock文件。

我该怎么补救?

206576 次浏览

尝试使用“127.0.0.1”而不是“ localhost”进行连接。

看起来您的 mysql 服务器没有启动。我通常运行 stop 命令,然后重新启动它:

mysqld stop
mysql.server start

同样的错误,这对我很有用。

当你让服务器通过

mysql.server start

您应该看到 /tmp/mysql.sock中的套接字。然而,系统似乎期望它在 /var/mysql/mysql.sock。要解决这个问题,您必须在 /var/mysql中创建一个符号链接:

sudo mkdir /var/mysql

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

这为我解决了这个问题。现在我的 phpMyAdmin 与 本地主机 还有 127.0.0.1工作愉快。

这要归功于 亨利

我得到了相同的错误,这是什么帮助我:

$ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
$launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
$mysql -uroot
mysql>
  1. 如果您能够看到“ mysql 停止”当您运行以下命令;

    brew services list
    
  2. 如果你能用下面的命令启动 mysql;

    mysql server start
    

这意味着; mysql 可以手动启动,但是在操作系统启动时不会自动启动。向服务添加 mysql 可以解决这个问题。为此,可以运行以下命令;

brew services start mysql

之后,您可以重新启动您的操作系统,并尝试连接到 mysql,以查看它是否自动启动。我做了相同的和停止接收以下错误;

ERROR2002(HY000) : 无法通过套接字连接到本地 MySQL 服务器 ’/tmp/mysql.sock’(2)

希望这个能帮上忙。

你需要运行 mysql_install_db-最简单的方法是如果你在安装目录:

$ cd /usr/local/Cellar/mysql/<version>/
$ mysql_install_db

或者,您可以像下面这样向 mysql_install_db提供一个 basedir参数:

$ mysql_install_db --basedir="$(brew --prefix mysql)"

我在 Mac 上遇到了同样的问题,并通过以下教程解决了它

Https://mariadb.com/resources/blog/installing-mariadb-10116-mac-os-x-homebrew

但是在继续之前,不要忘记删除或卸载旧版本。

命令:

brew uninstall mariadb


xcode-select --install


ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" - See more at: https://mariadb.com/resources/blog/installing-mariadb-10116-mac-os-x-homebrew#sthash.XQoxRoJp.dpuf


brew doctor


brew update


brew info mariadb


brew install mariadb


mysql_install_db


mysql.server start

为了补充这些答案,在我的例子中,我没有本地 mySQL 服务器,它运行在一个 docker 容器中。因此套接字文件不存在,也不能被“ mysql”客户端访问。

Sock 文件由 mysqld 创建,mysql 使用这个文件与它进行通信。 但是,如果 mySql 服务器不在本地运行,则不需要 sock 文件。

通过指定主机名/ip,不需要 sock 文件。

mysql --host=127.0.0.1 --port=3306 --user=xyz --password=xyz

只是为了完成这个线程。 因此 MAMP (PRO)经常被使用

这条路是

/Applications/MAMP/tmp/mysql/mysql.sock

由于我花了相当多的时间试图解决这个问题,并且在查找这个错误时总是返回到这个页面,所以我将把我的解决方案留在这里,希望有人能节省我已经浪费的时间。虽然在我的例子中,我使用的是 mariadb 而不是 MySql,但是您仍然可以根据自己的需要调整这个解决方案。

我的问题

是相同的,但是我的设置有点不同(Mariadb 而不是 mysql) :

安装了自制 Mariadb

$ brew install mariadb

启动了守护进程

$ brew services start mariadb

尝试连接,并得到上述错误

$ mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

我的解决办法

找出 mysql使用哪些 my.cnf文件(如本 评论所示) :

$ mysql --verbose --help | grep my.cnf
/usr/local/etc/my.cnf ~/.my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,

检查 Unix 套接字文件的运行位置(几乎与 给你描述的一样) :

$ netstat -ln | grep mariadb
.... /usr/local/mariadb/data/mariadb.sock

(你可能需要使用 grep mysql而不是 Mariadb)

将找到的套接字文件添加到 ~/.my.cnf(如果需要,创建该文件)(假设从上面运行 mysql --verbose ...-命令时列出了 ~/.my.cnf) :

[client]
socket = /usr/local/mariadb/data/mariadb.sock

重启你的 Mariadb:

$ brew services restart mariadb

在这之后,我可以运行 mysql 并得到:

$ mysql -uroot
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

因此,我使用超级用户权限运行该命令,输入密码后得到:

$ sudo mysql -uroot
MariaDB [(none)]>

备注:

  1. 我不太确定哪些组需要添加套接字,首先我有它[ client-server ] ,但后来我认为[ client ]应该足够了。所以我改了它,它还能用。

  2. 当运行 mariadb_config | grep socket时,我得到: --socket [/tmp/mysql.sock] 这有点令人困惑,因为看起来 /usr/local/mariadb/data/mariadb.sock是实际的位置(至少在我的机器上)

  3. 我想知道我可以在哪里配置的 /usr/local/mariadb/data/mariadb.sock实际上是 /tmp/mysql.sock,所以我可以使用默认设置,而不是必须编辑我的 .my.cnf(但我太累了,现在弄清楚...)

  4. 在提出这个问题之前,我还做了一些其他答案中提到的事情。

在安装 macos mojave 之后,必须在 /usr/local/var/mysql下擦除 mysql 文件夹,然后通过 brew install mysql重新安装,否则许可相关的东西会出现在所有的地方。

文件 /tmp/mysql.sock可能是一个命名管道,因为它在一个临时文件夹中。命名管道是一个永远不会被永久存储的特殊文件。

如果我们制作两个程序,并且希望一个程序向另一个程序发送消息,我们可以创建一个文本文件。我们让一个程序在文本文件中写入内容,另一个程序读取另一个程序写入的内容。这就是管道,除了它不会将文件写入我们的计算机硬盘,IE 不会永久存储文件(就像我们创建并保存文件时所做的那样)

插座和管道是完全一样的。区别在于 Socket 通常是通过网络在计算机之间使用的。Socket 向另一台计算机发送信息,或从另一台计算机接收信息。Pipes 和 Socket 都使用一个临时文件来共享,这样它们就可以“通信”了。

在这种情况下,很难分辨出哪一个 MySql 正在使用,不过这并不重要。

命令 mysql.server start应该让‘ server’(程序)运行它的无限循环,这个无限循环将创建特殊文件并等待更改(listen表示写入)。

之后,一个常见的问题可能是 MySql 程序没有在您的计算机上创建文件的权限,因此您可能必须给它 root 特权

sudo mysql.server start

警告,这将清除您的数据库,如果您希望保留它们,请进行备份

我在另一个 mysql (8.0)安装中留下了一些没有删除的目录。

我通过以下方法解决了这个问题:

首先卸载 mysql

brew uninstall mysql@5.6

删除未删除的文件夹/文件

rm -rf /usr/local/var/mysql
rm /usr/local/etc/my.cnf

重新安装 mysql 并链接它

brew install mysql@5.6
brew link --force mysql@5.6

启用并启动服务

brew services start mysql@5.6

我通过初始化数据库然后启动它,在系统首选项窗格中手动启动 mysql。这解决了我的问题。

重新启动后,我无法连接到本地的 Mariadb,搜索也带我到这个页面,我想与你分享我的解决方案。

我注意到/usr/local/etc/中的目录 my.cnf.d 不见了。

这是一个已知的错误与自制,是描述和解决这里

修复的快速方法: mkdir/usr/local/etc/my.cnf.d

在运行 < strong > mysql _ security _ install 并输入新密码时,我得到了:


错误: 无法通过套接字连接到本地 MySQL 服务器 ’/tmp/mysql.sock’(2)


我注意到,当尝试从 这个答案以下:

netstat -ln | grep mysql

它没有返回任何东西,我认为这意味着没有一个。袜子文件。

因此,我将以下内容添加到我的 < strong > my.cnf 文件(在 < strong >/etc/my.cnf 或者在我的案例中,< strong >/usr/local/etc/my.cnf )。

下面:

[mysqld]
socket=/tmp/mysql.sock

下面:

[client]
socket=/tmp/mysql.sock

这是基于 这篇文章的。

然后再次停止/启动 mysql 并重试 < strong > mysql _ security _ install ,它最终允许我输入新的 root 密码并继续其他设置首选项。

在我的案例中,罪魁祸首是在日志文件中找到的:

$ tail /usr/local/var/mysql/<hostname>.lan.err
2019-09-19  7:32:21 0 [ERROR] InnoDB: redo log file './ib_logfile0' exists. Creating system tablespace with existing redo log files is not recommended. Please delete all redo log files before creating new system tablespace.
2019-09-19  7:32:21 0 [ERROR] InnoDB: Database creation was aborted with error Generic error. You may need to delete the ibdata1 file before trying to start up again.

所以我重命名了 ib_logfile0来消除这个错误(之后我必须对 ib_logfile1做同样的事情)。

mv /usr/local/var/mysql/ib_logfile0 /usr/local/var/mysql/ib_logfile0_bak
mv /usr/local/var/mysql/ib_logfile1 /usr/local/var/mysql/ib_logfile1_bak
brew services restart mariadb

我也有同样的问题。在尝试了所有这些方法都没有成功之后,我做了以下几件事:

tail -f the-mysql-or-maria-db-error-file.err

在另一个控制台:

brew services restart mariadb

我发现了以下错误:

”MAC HOMEBREW 崩溃恢复失败 它的,例如,内存不足错误) ,并重新启动,或删除 tc 日志 然后用“

因此,我将 tc.log扩展更改为 tc.log.txt并重新启动 mariadb

brew services restart mariadb

搞定!

这对我有用:

brew upgrade mysql

对我来说,我很久以前就安装了 mariadb,然后又安装了 mysql@5.7

当我执行 mysql -uroot时,我得到了错误: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

阅读答案:

  • 我卸载了 mariadb
  • 删除文件夹 /usr/local/var/mysql
  • 运行指令 mysqld --initialize

然后我就能做 mysql -uroot -p

如果“ mysqld”正在运行,您的数据可能已损坏:

mysqld

通读数据墙,检查 mysqld 是否报告数据库已损坏。腐败可以以许多不直观的方式表现出来:

  • mysql -uroot返回“ ERROR 2002(HY000) : 无法通过 socket’/tmp/MySQL.sock’(2)连接到本地 MySQL 服务器”。
  • mysql.server start返回“错误! 服务器退出而没有更新 PID”。
  • Sequel Pro 和 MySQL Workbench 回应说,它们无法在本地主机或127.0.0.1上连接到 MySQL。

要恢复数据,打开 my.cnf 并在 [mysqld]部分中添加以下代码行:

innodb_force_recovery=1

重启 mysqld:

$ brew services restart mysql@5.6

现在您可以连接到它,但是它处于有限的只读模式。

如果您正在使用 InnoDB,请运行以下命令导出所有数据:

$ mysqldump -u root -p --all-databases --add-drop-database --add-drop-table > data-recovery.sql

该文件是在您的 ~ dir 中创建的。这可能需要一些时间。

完成后,从 my.cnf 中删除 innodb_force_recovery=1,然后在普通模式下重新启动 mysql:

$ brew services restart mysql@5.6

删除所有数据库。我用 Sequel Pro 做的。在执行此操作之前,请确保 data-Recovery y.sql 看起来正常。还要特别注意备份 /usr/local/var/mysql

然后使用以下方法恢复数据库、表和数据:

$ mysql -uroot < ~/data-recovery.sql

这可能是一个漫长的导入/恢复过程。一旦完成,就可以开始了!

感谢到 https://severalnines.com/database-blog/my-mysql-database-corrupted-what-do-i-do-now的恢复说明。链接有更多关于 MyISAM 恢复的说明。

[ LINUX]

虽然答案可能只是针对 MacOS,但是在 Linux 中我们可能会面临同样的错误。

我在 Linux 中也遇到了同样的问题,我运行了以下命令:

sudo /etc/init.d/mysql.server start

我能够运行 MySQL 服务器

裁判 https://gist.github.com/vinodpandey/1a4b5b8228f9a000ca236820185fc3bc

如果没有完成“ postinstall” 我只需要用:

sudo chown -R $(whoami) /usr/local/*

然后通过以下方式完成后期安装:

brew postinstall mysql@5.7

下一步只需启动 mysql@5.7服务。

我在蒙特雷上用过。

我还遇到了这个问题... ... 它似乎是由于我的开发计算机上多个 mysql 安装的一些剩余工件造成的。每次我尝试启动或重新启动 mysql 服务时,它都会崩溃。最终,通过处理 err 文件帮助我解决了我的问题。

设置:

  • M1 Macbook Pro 运行 OS 12(Monterey)
  • 自制安装 mysql@5.7

在故障排除的不同时间点,我尝试卸载我家酿列表中的所有 mysql,删除 /opt/homebrew/var/mysql,重新安装 mysql@5.7,但都没有用。我也试过重启我的机器。

我可以通过检查 err(例如,MyComputerName.local.err)日志来验证当服务启动失败时发生了什么,当我试图通过 Homebrew 启动/重新启动服务时,它正在向 /opt/homebrew/var/mysql/吐出这个日志。一开始,我看到这样的东西,指出了配置的问题:

mysqld: Table 'mysql.plugin' doesn't exist
TIMESTAMPZ 0 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
TIMESTAMPZ 0 [ERROR] unknown variable 'mysqlx-bind-address=127.0.0.1'
TIMESTAMPZ 0 [ERROR] Aborting

我删除了 /opt/homebrew/etc中的 my.cnfmy.cnf.default,并试图再次启动服务。然后,故障改为:

TIMESTAMPZ 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
TIMESTAMPZ 0 [ERROR] Fatal error: Failed to initialize ACL/grant/time zones structures or failed to remove temporary table files.
TIMESTAMPZ 0 [ERROR] Aborting

这时,我注意到 /opt/homebrew/var/homebrew/locks/中有几个 mysql 锁文件(mysql.formula.lockmysql.formula@5.7.lockmysql.formula@8.0.lock) ; 我删除了这些文件,以及 /opt/homebrew/var/homebrew/linked中的任何 mysql 文件。

在那之后,我可以毫无问题地启动 mysql。

我只是遇到了这个问题,我做了一些技巧,但对我来说,它没有工作。如果你使用 macOS,这是我所做的。我们从卸载 mysql 开始,然后重新安装它。

brew uninstall mysql
brew install mysql

注意: 您必须安装自制程序