解决Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) ";
环境linux,windows也可以通用,配置文件在mysql文件夹my.ini下,没有的话自己创建一个;
报错:
root:~# mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
要解决这个问题,首先了解mysql的几种连接方式:
想看详细,见下文总结
https://blog.csdn.net/qinglingLS/article/details/96864122
解决方案:
先启动mysqld服务器,
defaults-file是你的配置文件地址,默认/etc/my.cnf
/data1/mysql_root/base/mysql5.7/bin/mysqld_safe --defaults-file=/data/3506/my-large.cnf
查看下运行情况:
ps -ef |grep mysql
我的电脑上有4 个mysql实例,他们却并不冲突,
mysqld跑起来了,
其中,它们的sock地址:
--socket=/data/3506/mysql.sock
--socket=/data/3406/mysql.sock
--socket=/var/lib/mysqlmysql.sock
端口:
port可以在defaults-file配置文件里设定,下面有一个.cnf
的文件示例
3506
3406
第三个没写出来的默认是3306
配置文件也有多个:
--defaults-file=/data/3506/my-large.cnf
--defaults-file=/data/3406/my-large.cnf
没写出来的那个在默认的/etc/my.cnf
登陆方式:sock连接
mysql -S /data/3406/mysql.sock
mysql -S /data/3506/mysql.sock
mysql -S /var/lib/mysqlmysql.sock
端口连接登录
mysql -uroot -proot -h127.0.0.1 -P3406
mysql -uroot -proot -h127.0.0.1 -P3506
mysql -uroot -proot -h127.0.0.1 -P3306
出现can’t connect ‘/tmp/mysql.sock '(2)无法连接的原因是启动的mysqld服务器和client要连接的服务器的sock地址不一致,
所以,按照上面的方式,保证他们一一对应,再给出权限:
chown mysql.mysql /sock文件报错地址
chmod -R 777 /sock文件保存地址
就解决了问题,
其实这说不上是bug,应该可以算是用户不会配置。。。
简单说一下原因:
1.sock连接,当你安装mysql的时候,配置了一个my.cnf文件(默认是在/etc/my.cnf
下),打开看一下,内容大同小异,
里面有client和mysqld的区别,
这里client就是mysql运行用户,平时用命令
mysql -uroot -proot -h127.0.0.1 -P3306就是在启动client
mysqld是mysql的服务器
[root@TENCENT64 ~]# cat /etc/my.cnf
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3406
socket = /data/3406/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
user = mysql
port = 3406
socket = /data/3406/mysql.sock
datadir = /data/3406/data
basedir = /data1/mysql_root/base/mysql5.7
pid-file = /data/3406/mysql.pid
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
skip-grant-tables
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
[mysql_safe]
log-error=/data/3406/mysql_log3406.err
pid-file=/data/3406/mysqld.pid
我们重点要看的是:
socket = /data/3406/mysql.sock
一般是定义在/tmp/mysql.sock
下的,它会带给我们一种感觉,好像是socket连接。
实际上,在mysqld启动的时候,也就是你运行了下面命令
service start mysqld
之后,linux启动mysqld也就是mysql服务器,创建了一个“接口”,这个接口很安全,只跟本机localhost连接,它很小气,连127.0.0.1都不给连,
连接的时候,用命令:
这里,/var/lib/mysql/mysql.sock是我的my.cnf里面设定的地址。
mysql -S /data/3406/mysql.sock
现在你知道了,mysql.sock在mysqld运行的时候创建,在mysqld关闭的时候被删除、根本就在本地运行,没有上网。
而mysql -uroot -proot -h127.0.0.1 -P3306
则不一样,是通过网络端口连接的,
你可以登录后用一句show grants
看出两种方式的区别。
mysqld的一个启动脚本如下:
运行这个脚本来启动服务:/mysqld_op 的保存路径/mysqld_op start
运行这个脚本来关闭服务:/mysqld_op 的保存路径/mysqld_op stop
mysqld_op文件:
#!/bin/sh
#init
port=3406
mysql_user="root"
mysql_pwd="root"
CmdPath="/data1/mysql_root/base/mysql5.7/bin"
mysql_sock="/data/${port}/mysql.sock"
#startup func
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "Starting MYsql...\n"
/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my-large.cnf 2>&1 >/dev/null &
else
printf "mysql is running!\n"
exit
fi
}
#stop function
function_stop_mysql()
{
if [ ! -e "$mysql_sock"];then
printf "MYsql is stopped...\n"
exit
else
printf "mysql is stopping!\n"
${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
fi
}
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
*)
printf "Usage: /data/${port}/mysql {start|stop}\n"
esac
我的文件目录:
mysql是启动脚本,和mysql.sh一样,就是上面的脚本mysqld_op文件
改叫mysqld_op是为了和linux安装mysql后默认的/bin/mysql启动文件做区分。mysqld_op就是个bash脚本。
my-large.cnf
就是配置文件,
mysql.sock
就是连接socket,自动创建的,
data保存数据。