我在运行的Solaris 10设置上偶尔reviewing an unsolved mystery,我注意到错误消息中的某些内容可能会帮助我解决这个谜团。
错误消息是在UNIX域套接字上连接到MySQL时。
我在这里有一个具体的问题,即the error code at the end。
请参阅以下三条错误消息:
mysql -S /tmp/missing.sock
输出
Can't connect to local MySQL server through socket '/tmp/missing.sock' (2)
mysql -S /dev/null
输出
Can't connect to local MySQL server through socket '/dev/null' (95)
我试图解决的罕见和间歇性错误是
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (146)
最后的那个数字:这是一个UNIX域套接字错误代码吗?如果是这样,我有没有可以查找该代码含义的地方?
正如我所说,这是一个具体问题。其他有用的输入应发布到the other question。
答案 0 :(得分:1)
括号中的数字几乎肯定是系统错误号,通常通过errno
报告,其定义可通过#include <errno.h>
找到,但在Solaris上,数字通常在/usr/include/sys/errno.h
(但是可以在其他地方,特别是在Linux和Mac OS X上)。您可以编写一个简单的程序来查看3个错误。
#include <stdio.h>
#include <string.h>
int main(void)
{
puts(strerror(2));
puts(strerror(95));
puts(strerror(146));
return 0;
}
猜想: 2可能是ENOENT,没有这样的文件或目录; 95可以是ENOTSOCK(不是套接字); 146可能是ENOTSUPP(不支持操作)。
在我的系统上,答案在
/usr/include/sys/errno.h
:
- 2 = ENOENT
- 95 = ENOTSOCK
- 146 = ECONNREFUSED
请注意,由于第7版Unix中存在错误代码,因此在二十五岁左右的错误编号往往在系统之间保持一致。更高的数字有所不同。例如,在Mac OS X 10.9上:
On SuSE(SLES 10 SP2 - 古董,但这些数字变化不大):
这些答案是通过报告错误编号和名称的程序errno
获得的。必须为每个不同的系统编译它。
请注意,消息中提供了一致的MySQL提供的组件:
Can't connect to local MySQL server through socket '/dev/null' (95)
大致好像printf()
语句的格式字符串是:
"Can't connect to local MySQL server through socket '%s' (%s)\n"
正在提供“套接字”文件的名称 - 非常有用 - 并且(有教诲地猜测)系统错误编号,从errno
的某个时刻收集。但是,errno
是易失性的 - 几乎任何库函数都可以将其设置为非零值 - 因此您需要在执行错误报告工作之前保留特定值(复制它),例如读取消息文件,以获得格式字符串的正确翻译。