When is a MySQL error not a MySQL error

I came across this error recently: Mysql2::Error: Can't connect to MySQL server on 'some-db-server.example.com' (113)

A quick search on the Internet, resulted in various Q & A sites hinting at a connectivity/routing issue to/from the MySQL server.

Whilst this was probably enough information for me to fix, if the problem exists on a 3rd party's infrastructure you want to provide a bit more information.

The first port of call was to see if the error code 113 appears in the MySQL reference. You can imagine my surprise when I couldn't find 113 anywhere in this chapter.

Luckily there is help available from MySQL in the form of a utility called perror that allows you to look up MySQL error codes.

By typing perror along with error code, you'll get the following:

$ perror 113
OS error code 113:  No route to host

So the reason we can't find this error in either the Client or Server sections of the MySQL reference manual is that it's an operating system error.

The operating system in question is Linux, so we know we're looking for C error number codes (errno.h). If you've got access to the kernel source you can find it in /usr/src/linux-source-<VERSION>/include/uapi/asm-generic/errno.h if you don't have the source installed you can see it see a definition of 113 GitHub:

#define    EHOSTUNREACH    113    /* No route to host */

So armed with this information, I could contact the 3rd party and ask them to check routing and firewall rules between us and the database server.