本文转载自微信公众号“MySQL技术”,作者MySQL技术。转载本文请联系MySQL技术公众号。前言:不知道大家有没有注意到,在MySQL启动的时候,需要配置pid和socket文件路径。偶尔会因为找不到pid文件而导致启动失败,那么pid和socket文件是干什么用的呢?一起来看看这篇文章吧。1.pid-文件介绍MySQL中的pid文件记录了当前mysqld进程的pid,pid就是ProcessID。pid文件路径和文件名可以通过pid-file参数配置。如果不指定该变量,pid文件默认名称为host_name.pid,存储路径默认放在MySQL数据目录下。建议指定pid文件名和路径,pid目录权限要放给mysql系统用户。具体配置参考如下:#my.cnf配置文件[mysqld]pid-file=/data/mysql/tmp/mysqld.pid#查看mysqld进程[root@localhost~]#ps-ef|grepmysqldroot867010Jun09?00:00:00/bin/sh/usr/local/mysql/bin/mysqld_safe--datadir=/data/mysql/data--pid-file=/data/mysql/tmp/mysqld.pidmysql935386700Jun09?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.pid9353可以看到pid文件的内容只有一行,记录了mysqld的进程ID。mysqld进程启动后,会通过create_pid_file函数创建一个新的pid文件,通过getpid()获取当前进程ID并将进程ID写入pid文件。进程运行后,会在pid文件上加一个文件锁。只有获得pid文件写权限的进程才能正常启动,将自己的PID写入文件。同一程序的其他冗余进程会自动退出。所以pid文件的作用就是防止进程的多副本被启动。有时你可能会遇到由于pid文件问题导致的启动失败。您可能遇到过这些类型的错误:无法启动服务器:无法创建PID文件:没有这样的文件或目录错误!找不到MySQL服务器PID文件错误!serverquitwithoutupdatePIDfile以上pid相关错误的解决方法其实都是类似的。首先查看错误日志,找到具体的错误,然后检查配置文件,确保pid文件的目录路径正确有效。如果权限有空间,可以查看mysqld进程是否存在。如果存在,您可以手动将其杀死。如果有残留的pid文件,可以先删除。一切检查完毕后,再次重启,一般都会成功。2、socket文件介绍Socket是Unix的套接字文件。在类Unix平台上,客户端连接MySQL服务器有两种方式,即TCP/IP和套接字文件。Unix套接字文件连接比TCP/IP更快,但只能用于连接同一台计算机上的服务器。套接字文件路径和名称可以通过设置套接字变量来配置,默认值为/tmp/mysql.sock(对于某些分发格式,目录可能不同)。参考配置如下:#my.cnf配置文件[mysqld]socket=/data/mysql/tmp/mysql.sock[client]socket=/data/mysql/tmp/mysql.sock#查看socket文件中的对应目录root@localhosttmp]#ls-lhtotal8.0Ksrwxrwxrwx1mysqlmysql0Jun1015:19mysql.sock-rw------1mysqlmysql6Jun1015:19mysql.sock.lock#通过-S命令指定socket登录[root@localhost~]#mysql-uroot-pxxxx-S/data/mysql/tmp/mysql.sockmysql:[警告]在命令行界面上使用密码可能不安全。欢迎使用MySQL监视器。命令发送;或\g。您的MySQL连接idis12服务器版本:8.0.22MySQL社区服务器-GPLC版权所有(c)2000、2020、Oracle和/或它的poracle或Oracle附属公司是重新注册的。Allrights或其附属公司。其他名称可能是其各自所有者的商标。输入'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>status------------mysqlVer8.0.22forLinuxonx86_64(MySQLCommunityServer-GPL)Connectionid:12Currentdatabase:Currentuser:root@localhostSSL:NotinuseCurrentpager:stdoutUsingoutfile:''Usingdelimiter:;Serverversion:8.0.22MySQLCommunityServer-GPLProtocolversion:10Connection:LocalhostviaUNIXsocketServercharacterset:utf8mb4Dbcharacterset:utf8mb4Clientcharacterset:utf8mb4Conn.characterset:utf8mb4UNIXsocket:/data/mysql/tmp/mysql.sockBinarydataas:HexadecimalUptime:1hour27min31secThreads:3Questions:27Slowqueries:0Opens:135Flushtables:3Opentables:56Queriespersecondavg:0.005查看上面的连接状态,可以看到本地可以通过socket方式连接MySQL。在本地登录时,如果my.cnf配置文件的[client]部分没有指定socket文件路径,mysql会默认搜索/tmp/mysql.sock,所以如果生成的socket文件不在默认mysqld服务启动时的路径,登录时可能会报错(ERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock')。其实[mysqld]部分和[client]部分都配置了特定的路径来避免这个问题,也可以在tmp路径下建立软连接,如:ln-s/data/mysql/tmp/mysql.sock/tmp/mysql.sock。同样,socket文件目录的权限也要释放给mysql系统用户。摘要:本文介绍了MySQL中pid和socket文件的具体配置和作用。其实这两个参数都比较容易维护。只需在开始时配置它们,不要触摸它们。如果重启时遇到错误,根据错误日志慢慢查看,仔细操作,总会找到问题所在的。
