For the past few weeks off and on, as part of Proven Scaling‘s project to improve the MySQL server, I’ve been helping Joel Seligstein to really dig into the MySQL source code and add some features, in preparation for a much bigger feature coming up (more on that at a future date). He has now finished three smaller projects that have been on Proven Scaling’s and my own to-do list for quite some time: SET CONNECTION STATUS status, KILL connection_id WITH QUERY query_id, and SHOW ... FOR CONNECTION connection_id.1
This patch adds a new SET CONNECTION STATUS status command, which allows each session to set a status which will be shown in a new Status column in SHOW FULL PROCESSLIST.
This allows a administrators to gain a bit more insight into complex multi-tier architectures, by having essentially a comment for each database connection. In SET CONNECTION STATUS, the status argument may be a complex expression, so CONCAT() and other string manipulations may be used. The current connection status may be retrieved with CONNECTION_STATUS(). Some things which I could imagine putting in the connection status are:
- in pool — See at a glance which connections are idle in the connection pool, and which are checked out.
- GET /foo.php — Easily see what request each connection is responsible for.
- apache pid 672 — Allow you to easily correlate activity on a given server with activity on MySQL, without having to use netstat and friends to track things down.
Of course, there are many more creative people than me to figure out things to do with this useful feature!
KILL thread_id WITH QUERY query_id
In order to make this command useful, the query_id first had to be exposed in SHOW FULL PROCESSLIST. When WITH QUERY query_id is specified in a KILL command, KILL checks that the connection is still executing the query_id you’ve specified (and locks to ensure that it does not start a new query) before killing it. This solves a well-known race condition between SHOW PROCESSLIST and KILL, where the connection may have moved on to a potentially dangerous query to kill, such as a non-transactional UPDATE.
SHOW ... FOR CONNECTION connection_id
This patch extends the SHOW VARIABLES and SHOW STATUS commands with a FOR CONNECTION connection_id clause, which allows a user with either the same credentials as the connection, or with the SUPER privilege to view the connection’s status and variables.
All of these features will be great for debugging production systems, where it can be difficult or impossible to get any insight into what is happening at any given moment in time.
Thanks, Joel, for the hard work!
1 All three patches are against 5.0.26.
“SHOW â€¦ FOR CONNECTION connection_id”
Great stuff Jeremy and Joel. I’ll file bug requests at MySQL for this batch shortly.
With the SET CONNECTION STATUS command, it might be interesting to have an accompanying KILL WHERE STATUS ‘x’ command. Just a thought.