my.cnf 中的 MySQL Socket 配置问题

my.cnf 中的 MySQL Socket 配置问题

我遇到了一个问题,导致我的应用程序中的“数据库时间”非常长。

数据库是 Percona MySQL 5.5.35。

应用程序运行完美,可以很好地从数据库读取/写入数据。问题是我的数据库响应时间非常长,这绝对不是执行查询所花的时间,查询都很简单,而且经过了缓存。

例如,我的响应时间有时会长达数秒,而其他时候,响应时间只需几毫秒。设置了慢查询日志,没有查询很慢,它们都是简单的微小数据插入和约 80% 的读取,整个数据库只有 20MB,这是一个互联网论坛。

New Relic 应用程序图表显示数据库连接时间大幅增加

我确信问题出在套接字上,因为我无法在 my.cnf 的 mysqld 部分中指定套接字。如果我这样做,我会在重新启动数据库时收到一条错误消息:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

例如,这是 my.cnf 的实际工作副本,其中删除了不相关的部分:

[mysql]

# CLIENT #
port                           = 3306
socket                         = /var/lib/mysql/mysql.sock


[mysqld]

# General #
default-storage-engine         = InnoDB

# Database replication #
server-id=1895149
log-bin=mysql-bin
log-error=mysql-bin.err
binlog_do_db=reefbase1

# MyISAM #
key-buffer-size                = 32M
myisam-recover                 = FORCE,BACKUP

请注意,mysqld 部分没有指定端口和套接字?

如果我将其更改为:

[mysql]

# CLIENT #
port                           = 3306
socket                         = /var/lib/mysql/mysql.sock


[mysqld]

port                           = 3306
socket                         = /var/lib/mysql/mysql.sock

# General #
default-storage-engine         = InnoDB

# Database replication #
server-id=1895149
log-bin=mysql-bin
log-error=mysql-bin.err
binlog_do_db=reefbase1

# MyISAM #
key-buffer-size                = 32M
myisam-recover                 = FORCE,BACKUP

这就是我一次又一次看到的情况,当设置 my.cnf 时,我的服务器无法启动,并出现“无法连接”错误。

如有任何建议,我将非常感激。

答案1

这里要记住的第一点是,如果客户端配置为使用 localhost,许多 mysql 客户端(包括 php)将默认使用 unix 套接字样式通信。如果您的服务器未正确设置此套接字,则客户端可能会尝试连接到套接字并失败。

其余内容是从我们在评论中的讨论中总结出来的。

无论如何,由于您的服务器未配置为创建套接字,并且客户端指向的位置对于 Ubuntu 系统来说并不常见,我认为您应该首先尝试将其更改为指向 pid 和套接字文件的标准 Debian/Ubuntu 位置。 即/var/run/mysqld/mysqld.sock,或最近的/run/mysqld/mysqld.sock

从理论上来说,其他位置应该可以工作,但我猜测在权限或其他方面有些东西还没有完全写好。

答案2

我的问题略有不同,但搜索时出现了这个问题。通过 TCP 而不是套接字连接解决了我的问题。它也帮助了其他人。

即在您的客户端部分输入:

host=127.0.0.1

和/或

protocol=tcp

相关内容