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


我在使用mysqll客戶端連接我的mysql服務器的時候,出現了上述的問題。我的操作系統是ubuntu,安裝版本是對應的64位服務器。我的服務器的啟動方式是sudo service mysql start.

我對服務器的改動僅限於新增了一個mysql的配置文件,配置文件的位置在/etc/my.cnf。配置文件如下(不要在意設置的具體值):

[mysqld]
# GENERAL
datadir                              = /var/lib/mysql
socket                               = /var/lib/mysql/mysql.sock
pid_file                             = /var/lib/mysql/mysql.pid
user                                 = mysql
port                                 = p3306
default_storage_engine               = InnoDB
#INNODB
innodb_buffer_pool_size              = 2G
innodb_log_file_size                 = 300M
# LOGGING
log_error                            = /var/lib/mysql/mysql-error.log
slow_query_log_file                  = /var/lib/mysql/mysql-slow.log
# OTHER
tmp_table_size                       = 32M
max_heap_table_size                  = 32M
#query_cache_type                     = 0
#query_cache_size                     = 0
max_connections                      = 200
thread_cache_size                    = 50
table_open_cache                     = 300
open_files_limit                     = 65535 
[client]
socket                               = /var/lib/mysql/mysql.sock
port                                 = 3306

首先我要說明一點,使用mysql客戶端不能連接到mysql服務端,是因為mysql連接的時候,使用了這個配置文件的client部分,也就是

[client]

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

而服務端的socket文件的位置不在這里,自然會出現問題。我查看/var/lib/mysql文件夾,都不存在mysql.sock文件。

那么服務端的socket文件保存在哪里呢?

答案是/var/run/mysqld文件夾,這里有一個mysqld.sock文件. 這個文件的位置是由/etc/my.cnf->/etc/mysql.cnf里面配置的文件/etc/mysql/mysql.conf.d/mysqld.cnf指定的。

查看mysqld.cnf文件夾,還可以如下配置:

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
log-error	= /var/log/mysql/error.log

可以查看對應文件夾,發現上述配置都生效了。我們查看mysql官網,可以看到如下警告語句:

Note

On Unix platforms, MySQL ignores configuration files that are world-writable. This is intentional as a security measure.

你檢查一下你的/etc/my.cnf文件,然后改成/etc/mysql/mysql.cnf相同的訪問屬性,發現,仍然出現相同的問題。

你又會驚奇地發現,官網上面有如下說明:

On Unix and Unix-like systems, MySQL programs read startup options from the files shown in the following table, in the specified order (files listed first are read first, files read later take precedence).

你會覺得這里是/etc/mysql/mysql.conf.d/mysqld.cnf配置文件替換了/etc/my.cnf中的值。然后你選擇刪除/etc/my.cnf中關於client的配置,你發現不報上述錯誤了。當你進去之后,使用show gloabal variables命令,發現根本沒有生效。

那么這個又是為什么?

然后你可以進行如下操作:在/etc/mysql/mysql.cnf中添加一句port = 3306,修改后,如下:

port = 3306
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

然后你調用sudo service mysql start命令,會發現如下錯誤:

Job for mysql.service failed because the control process exited with error code.
See "systemctl status mysql.service" and "journalctl -xe" for details.

然后你調用systemctl status mysql.service命令,得到如下錯誤:

4月 14 00:11:35 sun-Lenovo-IdeaPad-Y480 mysql-systemd-start[25400]: my_print_defaults: [ERROR] Fatal error in defaults handling. Program abort
4月 14 00:11:35 sun-Lenovo-IdeaPad-Y480 mysqld[25439]: mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf a
4月 14 00:11:35 sun-Lenovo-IdeaPad-Y480 mysqld[25439]: mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
4月 14 00:11:35 sun-Lenovo-IdeaPad-Y480 systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE
4月 14 00:11:35 sun-Lenovo-IdeaPad-Y480 systemd[1]: mysql.service: Failed with result 'exit-code'.
4月 14 00:11:35 sun-Lenovo-IdeaPad-Y480 systemd[1]: Failed to start MySQL Community Server.

然后你移除/etc/mysql/mysql.cnf中的port = 3306,改為在/etc/my.cnf中只添加這一行。

port = 3306

你發現調用sudo service mysql start沒有報錯。按照上述的表現來看,mysql應該根本就不會讀取/etc/my.cnf,所以你之前添加的這個文件,只是對mysql客戶端鏈接產生了影響。

如果你想在使用sudo service mysql start方式啟動時的服務端參數,最簡單的方法是將原先的/etc/mysql/mysql.conf.d/mysqld.cnf備份一下,然后直接修改這個文件的值。修改之后,可能會遇到其他問題,再想辦法解決了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM