不晓得你有没有留神过,MySQL 启动时须要配置 pid 及 socket 文件门路。偶然还会呈现因 pid 文件找不到而启动失败的景象,那么 pid 与 socket 文件到底是干什么用的呢?咱们一起来看下本篇文章。
1.pid-file 介绍
MySQL 中的 pid 文件记录的是以后 mysqld 过程的 pid,pid 亦即 Process ID。能够通过 pid-file 参数来配置 pid 文件门路及文件名,如果未指定此变量,则 pid 文件默认名为 host_name.pid,寄存的门路默认放在 MySQL 的数据目录。
倡议指定 pid 文件名及门路,pid 目录权限要对 mysql 零碎用户放开,具体配置可参考如下:
my.cnf 配置文件
[mysqld]
pid-file = /data/mysql/tmp/mysqld.pid
查看 mysqld 过程
[root@localhost ~]# ps -ef|grep mysqld
root 8670 1 0 Jun09 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe –datadir=/data/mysql/data –pid-file=/data/mysql/tmp/mysqld.pid
mysql 9353 8670 0 Jun09 ? 00:01:23 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql/data –plugin-dir=/usr/local/mysql/lib/plugin –user=mysql –log-error=/data/mysql/logs/error.log –pid-file=/data/mysql/tmp/mysqld.pid –socket=/data/mysql/tmp/mysql.sock
查看 pid 文件内容
[root@localhost ~]# cat /data/mysql/tmp/mysqld.pid
9353
能够看到 pid 文件内容只有一行,记录了 mysqld 过程的 ID。mysqld 过程启动后会通过 create_pid_file 函数新建 pid 文件,通过 getpid() 获取以后过程号并将过程 ID 写入 pid 文件。过程运行后会给 pid 文件加一个文件锁,只有取得 pid 文件写入权限的过程能力失常启动并把本身的 PID 写入该文件中,其它同一个程序的多余过程则主动退出。因而 pid 文件的作用是避免启动多个过程正本。
有时候可能会遇到因 pid 文件问题而启动失败的状况,这几类报错你可能遇到过:
Can‘t start server: can‘t create PID file: No such file or directory
ERROR! MySQL server PID file could not be found
ERROR! The server quit without updating PID file
下面几类 pid 相干报错解决办法其实都是相似的,首先要看下 error log 找到具体报错,而后查看配置文件,确保 pid 文件目录门路正确且有权限有空间,之后能够看下 mysqld 过程是否存在,若存在可手动 kill 掉,若有残留的 pid 文件也能够先删掉,所有排查就绪后,再次重新启动,个别即可胜利。
2.socket 文件介绍
socket 即 Unix 套接字文件,在类 unix 平台,客户端连贯 MySQL 服务端的形式有两种,别离是 TCP/IP 形式与 socket 套接字文件形式。Unix 套接字文件连贯的速度比 TCP/IP 快,然而只能连贯到同一台计算机上的服务器应用。
通过设置 socket 变量可配置套接字文件门路及名称,默认值为 www.sangpi.com /tmp/mysql.sock (对于某些发行格局,目录可能有所不同)。参考配置如下:
my.cnf 配置文件
[mysqld]
socket = /data/mysql/tmp/mysql.sock
[client]
socket = /data/mysql/tmp/mysql.sock
查看对应目录下的 socket 文件
root@localhost tmp]# ls -lh
total 8.0K
srwxrwxrwx 1 mysql mysql 0 Jun 10 15:19 mysql.sock
-rw——- 1 mysql mysql 6 Jun 10 15:19 mysql.sock.lock
通过 -S 命令指定 socket 登录
[root@localhost ~]# mysql -uroot -pxxxx -S /data/mysql/tmp/mysql.sock
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.22 MySQL Community Server – GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql> status
mysql Ver 8.0.22 for Linux on x86_64 (MySQL Community Server – GPL)
Connection id: 12
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ”
Using delimiter: ;
Server version: 8.0.22 MySQL Community Server – GPL
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /data/mysql/tmp/mysql.sock
Binary data as: Hexadecimal
Uptime: 1 hour 27 min 31 sec
Threads: 3 Questions: 27 Slow queries: 0 Opens: 135 Flush tables: 3 Open tables: 56 Queries per second avg: 0.005
查看上述连贯状态可知,MySQL 在本地能够通过 socket 形式连贯。在本地登录时,如果 my.cnf 游戏配置文件中的 [client] 局部没有指定 socket 文件门路,mysql 默认会去寻找 /tmp/mysql.sock,所以如果 mysqld 服务启动的时候,生成的 socket 文件不是默认门路的话,登陆可能会报错(ERROR 2002 (HY000): Can’t connect to local MySQL server through socket‘/tmp/mysql.sock’)。其实 [mysqld] 局部及 [client] 局部都配置具体门路可防止此问题,也能够在 tmp 门路下建设软连贯,如:ln -s /data/mysql/tmp/mysql.sock /tmp/mysql.sock。同样的,socket 文件目录权限要对 mysql 零碎用户放开。