天天看点

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 系统用户放开,具体配置可参考如下:

  1. # my.cnf 配置文件

  2. [mysqld]

  3. pid-file = /data/mysql/tmp/mysqld.pid

  4. # 查看mysqld进程

  5. [root@localhost ~]# ps -ef|grep mysqld

  6. 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

  7. 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

  8. # 查看pid文件内容

  9. [root@localhost ~]# cat /data/mysql/tmp/mysqld.pid

  10. 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 (对于某些发行格式,目录可能有所不同)。参考配置如下:

  1. # my.cnf 配置文件

  2. [mysqld]

  3. socket = /data/mysql/tmp/mysql.sock

  4. [client]

  5. socket = /data/mysql/tmp/mysql.sock

  6. # 查看对应目录下的socket文件

  7. root@localhost tmp]# ls -lh

  8. total 8.0K

  9. srwxrwxrwx 1 mysql mysql 0 Jun 10 15:19 mysql.sock

  10. -rw------- 1 mysql mysql 6 Jun 10 15:19 mysql.sock.lock

  11. # 通过 -S 命令指定socket登录

  12. [root@localhost ~]# mysql -uroot -pxxxx -S /data/mysql/tmp/mysql.sock

  13. mysql: [Warning] Using a password on the command line interface can be insecure.

  14. Welcome to the MySQL monitor. Commands end with ; or \g.

  15. Your MySQL connection id is 12

  16. Server version: 8.0.22 MySQL Community Server - GPL

  17. Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

  18. Oracle is a registered trademark of Oracle Corporation and/or its

  19. affiliates. Other names may be trademarks of their respective

  20. owners.

  21. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

  22. mysql> status

  23. --------------

  24. mysql Ver 8.0.22 for Linux on x86_64 (MySQL Community Server - GPL)

  25. Connection id: 12

  26. Current database:

  27. Current user: root@localhost

  28. SSL: Not in use

  29. Current pager: stdout

  30. Using outfile: ''

  31. Using delimiter: ;

  32. Server version: 8.0.22 MySQL Community Server - GPL

  33. Protocol version: 10

  34. Connection: Localhost via UNIX socket

  35. Server characterset: utf8mb4

  36. Db characterset: utf8mb4

  37. Client characterset: utf8mb4

  38. Conn. characterset: utf8mb4

  39. UNIX socket: /data/mysql/tmp/mysql.sock

  40. Binary data as: Hexadecimal

  41. Uptime: 1 hour 27 min 31 sec

  42. Threads: 3 Questions: 27 Slow queries: 0 Opens: 135 Flush tables: 3 Open tables: 56 Queries per second avg: 0.005