0

I've been occasionally reviewing an unsolved mystery on a Solaris 10 setup we have been running, and I noticed something in the error message that might yield a clue to help me solve the mystery.

The error message is when connecting to MySQL on a UNIX Domain Socket.

I have a specific question here, which is about the error code at the end.

See these three error messages:

  • mysql -S /tmp/missing.sock outputs
    Can't connect to local MySQL server through socket '/tmp/missing.sock' (2)

  • mysql -S /dev/null outputs
    Can't connect to local MySQL server through socket '/dev/null' (95)

  • The rare and intermittent error I am trying to resolve is
    Can't connect to local MySQL server through socket '/tmp/mysql.sock' (146)

That number at the end: Is this a UNIX Domain Socket error code? If so, is there a place I can look up the meaning of that code?

As I said, this is a specific question. Other helpful input should be posted to the other question.

Community
  • 1
  • 1
700 Software
  • 85,281
  • 83
  • 234
  • 341
  • Those error codes come from MySQL. – marekful Dec 06 '13 at 15:16
  • The numbers in parentheses are almost certainly system error numbers, normally reported via `errno`, found via `#include ` though the numbers are usually (on Solaris) in `/usr/include/sys/errno.h` (but can be in other places, especially on Linux and Mac OS X). You could write a program `#include #include int main(void) { puts(strerror(2)); puts(strerror(95)); puts(strerror(146)); return 0; }` to see the 3 errors. 2 is probably ENOENT, no such file or directory; 95 may be ENOTSOCK (not a socket); 146 might be ENOTSUPP (operation not supported). – Jonathan Leffler Dec 06 '13 at 15:38
  • @Marcell, Based on Jonathan's answer, your comment is not entirely correct. The codes come **through** MySQL, seemingly **from** Solaris. – 700 Software Dec 06 '13 at 15:41

1 Answers1

1

The numbers in parentheses are almost certainly system error numbers, normally reported via errno, the definitions for which are found via #include <errno.h> though on Solaris the numbers are usually in /usr/include/sys/errno.h (but can be in other places, especially on Linux and Mac OS X). You could write a simple program to see the 3 errors.

#include <stdio.h>
#include <string.h>

int main(void)
{
    puts(strerror(2));
    puts(strerror(95));
    puts(strerror(146));
    return 0;
}

Conjecture: 2 is probably ENOENT, no such file or directory; 95 may be ENOTSOCK (not a socket); 146 might be ENOTSUPP (operation not supported).

George Bailey confirms:

On my system, the answer was in /usr/include/sys/errno.h:

  • 2=ENOENT
  • 95=ENOTSOCK
  • 146=ECONNREFUSED

Note that error numbers up to the mid-twenties tend to be consistent across systems as the error codes existed in 7th Edition Unix. Higher numbers diverge. For example, on Mac OS X 10.9:

  • 2 (ENOENT): No such file or directory
  • 95 (EMULTIHOP): Reserved
  • errno: no message for errno = 146
  • ENOTSOCK (38): Socket operation on non-socket
  • ECONNREFUSED (61): Connection refused

On SuSE (SLES 10 SP2 — antique, but these numbers don't change much):

  • 2 (ENOENT): No such file or directory
  • 95 (EOPNOTSUPP): Operation not supported on transport endpoint
  • errno: no message for errno = 146
  • ENOTSOCK (88): Socket operation on non-socket
  • ECONNREFUSED (111): Connection refused

These answers were obtained via a program errno that reports on error numbers and names. It has to be compiled for each different system.


Note that there is a consistent MySQL-provided component to the messages:

Can't connect to local MySQL server through socket '/dev/null' (95)

roughly as if the format string for the printf() statement was:

"Can't connect to local MySQL server through socket '%s' (%s)\n"

The name of the 'socket' file is being provided — very helpful — and (educated guess) the system error number, collected at some point from errno. However, errno is volatile — almost any library function may set it to a non-zero value — so you need to preserve a specific value (copy it) before doing much in the way of error reporting work, such as reading message files to get the correct translation of the format string.

Community
  • 1
  • 1
Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278