![my.cnf 中的 MySQL Socket 配置问题](https://linux22.com/image/629179/my.cnf%20%E4%B8%AD%E7%9A%84%20MySQL%20Socket%20%E9%85%8D%E7%BD%AE%E9%97%AE%E9%A2%98.png)
我遇到了一个问题,导致我的应用程序中的“数据库时间”非常长。
数据库是 Percona MySQL 5.5.35。
应用程序运行完美,可以很好地从数据库读取/写入数据。问题是我的数据库响应时间非常长,这绝对不是执行查询所花的时间,查询都很简单,而且经过了缓存。
例如,我的响应时间有时会长达数秒,而其他时候,响应时间只需几毫秒。设置了慢查询日志,没有查询很慢,它们都是简单的微小数据插入和约 80% 的读取,整个数据库只有 20MB,这是一个互联网论坛。
我确信问题出在套接字上,因为我无法在 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