乐趣区

关于mysql:MySQL中的pid与socket是什么

前言:

不晓得你有没有留神过,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 变量可配置套接字文件门路及名称,默认值为 /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 零碎用户放开。

总结:

本篇文章介绍了 MySQL 中的 pid 及 socket 文件的具体配置及作用。其实这两个参数还是比拟好保护的,一开始配置好不要去动它就好了,若遇到重启报错的状况,依据谬误日志慢慢来排查,仔细的操作,总会找到问题的。

退出移动版