Let me start by saying the majority of environments never experience problems of MySQL crashing. I have seen production environments up for years. On my own server I have seen 575 days of MySQL uptime and the problem was hardware, not MySQL.
However it does occur, and the reasons may be obscure.
Confirming mysqld has crashed
To the unsuspecting, MySQL may indeed be crashing and you never know about it. The reason is because most MySQL installations have two running processes, these are mysqld and mysqld_safe.
ps -ef | grep mysqld root 28822 1 0 Feb22 ? 00:00:00 /bin/sh bin/mysqld_safe mysql 28910 28822 0 Feb22 ? 00:30:08 /opt/mysql51/bin/mysqld --basedir=/opt/mysql51 --datadir=/opt/mysql51/data --user=mysql --log-error=/opt/mysql51/log/error.log --pid-file=/opt/mysql51/data/dc1.onegreendog.com.pid
One of the functions of mysqld_safe is to restart mysqld if it fails. Unless you review your mysql error log and for low volume systems you will never know. Hint Have you checked your MySQL error log today?
You can determine quickly via SQL your instance uptime.
mysql> SHOW GLOBAL STATUS LIKE '%uptime%'; +---------------+---------+ | Variable_name | Value | +---------------+---------+ | Uptime | 1033722 | +---------------+---------+ 1 row in set (0.00 sec)
This is the number of seconds since start time. While not easily readable for humans, this is more user friendly display. (NOTE: Works for 5.1+ only)
mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP() - variable_value) AS server_start FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE variable_name='Uptime'; +---------------------+ | server_start | +---------------------+ | 2010-02-22 15:22:13 | +---------------------+ 1 row in set (0.07 sec)
Debugging a mysqld core file
When correctly configured, mysqld will generate a core file (See How to crash mysqld intentionally for background information on required settings).
Your first check is to determine if the mysqld binary used has debugging information and symbols stripped. You need this information not stripped for identifying symbol names.
$ file bin/mysqld bin/mysqld: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), for GNU/Linux 2.4.0, not stripped
You can use gdb and with a backtrace command (bt) you can see a stack trace of calls. This won’t help the average DBA without C or MySQL internal knowledge greatly, however it’s essential information to get to the bottom of the problem.
In the following example I’m going to use Bug #38508 to intentionally crash my test instance.
mysql> drop table if exists t1,t2; mysql> create table t1(a bigint); mysql> create table t2(b tinyint); mysql> insert into t2 values (null); mysql> prepare stmt from "select 1 from t1 join t2 on a xor b where b > 1 and a =1"; mysql> execute stmt; mysql> execute stmt; ERROR 2013 (HY000): Lost connection to MySQL server during query
Lost connection is the first sign of a problem. We check the error log to confirm.
$ tail data/`hostname`.err 100306 14:51:49 - mysqld got signal 11 ; This could be because you hit a bug. It is also possible that this binary or one of the libraries it was linked against is corrupt, improperly built, or misconfigured. This error can also be caused by malfunctioning hardware. We will try our best to scrape up some info that will hopefully help diagnose the problem, but since we have already crashed, something is definitely wrong and this may fail. key_buffer_size=8384512 read_buffer_size=131072 max_used_connections=1 max_threads=151 threads_connected=1 It is possible that mysqld could use up to key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 338301 K bytes of memory Hope that's ok; if not, decrease some variables in the equation. thd: 0x521f160 Attempting backtrace. You can use the following information to find out where mysqld died. If you see no messages after this, something went terribly wrong... stack_bottom = 0x401b6100 thread_stack 0x40000 /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(my_print_stacktrace+0x2e)[0x8abfbe] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(handle_segfault+0x322)[0x5df252] /lib64/libpthread.so.0[0x35fb00de80] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_ZN9Item_cond10fix_fieldsEP3THDPP4Item+0x7f)[0x5654ff] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_ZN9Item_cond10fix_fieldsEP3THDPP4Item+0xb8)[0x565538] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_Z11setup_condsP3THDP10TABLE_LISTS2_PP4Item+0xf6)[0x621f96] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_ZN4JOIN7prepareEPPP4ItemP10TABLE_LISTjS1_jP8st_orderS7_S1_S7_P13st_select_lexP18st_select_lex_unit+0x2db)[0x645f3b] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_Z12mysql_selectP3THDPPP4ItemP10TABLE_LISTjR4ListIS1_ES2_jP8st_orderSB_S2_SB_yP13select_resultP18st_select_lex_unitP13st_select_lex+0x7a4)[0x654d24] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_Z13handle_selectP3THDP6st_lexP13select_resultm+0x16c)[0x659f9c] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld[0x5ec92a] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_Z21mysql_execute_commandP3THD+0x602)[0x5efb22] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_ZN18Prepared_statement7executeEP6Stringb+0x3bd)[0x66587d] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_ZN18Prepared_statement12execute_loopEP6StringbPhS2_+0x7c)[0x66874c] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_Z22mysql_sql_stmt_executeP3THD+0xa7)[0x668c27] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_Z21mysql_execute_commandP3THD+0x1123)[0x5f0643] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_Z11mysql_parseP3THDPKcjPS2_+0x357)[0x5f5047] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_Z16dispatch_command19enum_server_commandP3THDPcj+0xe93)[0x5f5ee3] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(_Z10do_commandP3THD+0xe6)[0x5f67a6] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld(handle_one_connection+0x246)[0x5e9146] /lib64/libpthread.so.0[0x35fb006307] /lib64/libc.so.6(clone+0x6d)[0x35fa4d1ded] Trying to get some variables. Some pointers may be invalid and cause the dump to abort... thd->query at 0x5249320 = select 1 from t1 join t2 on a xor b where b > 1 and a =1 thd->thread_id=1 thd->killed=NOT_KILLED The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains information that should help you find out what is causing the crash. Writing a core file 100306 14:51:49 mysqld_safe Number of processes running now: 0 100306 14:51:49 mysqld_safe mysqld restarted 100306 14:51:49 [Note] Plugin 'FEDERATED' is disabled. 100306 14:51:50 InnoDB: Started; log sequence number 0 44233 100306 14:51:50 [Note] Event Scheduler: Loaded 0 events 100306 14:51:50 [Note] /home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld: ready for connections. Version: '5.1.38' socket: '/tmp/mysql.sock.3999' port: 3999 MySQL Community Server (GPL)
Confirming we got the “Writing a core file” line, we can find and use this.
$ find . -name "core*" ./data/core.23290
$ gdb bin/mysqld data/core.23290 GNU gdb Red Hat Linux (6.5-37.el5_2.2rh) Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu"...Using host libthread_db library "/lib64/libthread_db.so.1". Reading symbols from /lib64/libpthread.so.0...done. Loaded symbols for /lib64/libpthread.so.0 Reading symbols from /lib64/libdl.so.2...done. Loaded symbols for /lib64/libdl.so.2 Reading symbols from /lib64/libcrypt.so.1...done. Loaded symbols for /lib64/libcrypt.so.1 Reading symbols from /lib64/libnsl.so.1...done. Loaded symbols for /lib64/libnsl.so.1 Reading symbols from /lib64/libm.so.6...done. Loaded symbols for /lib64/libm.so.6 Reading symbols from /lib64/libc.so.6...done. Loaded symbols for /lib64/libc.so.6 Reading symbols from /lib64/ld-linux-x86-64.so.2...done. Loaded symbols for /lib64/ld-linux-x86-64.so.2 Reading symbols from /lib64/libgcc_s.so.1...done. Loaded symbols for /lib64/libgcc_s.so.1 Core was generated by `/home/rbradfor/mysql/mysql-5.1.38-linux-x86_64-glibc23/bin/mysqld --defaults-fi'. Program terminated with signal 11, Segmentation fault. #0 0x00000035fb00b142 in pthread_kill () from /lib64/libpthread.so.0 (gdb) bt #0 0x00000035fb00b142 in pthread_kill () from /lib64/libpthread.so.0 #1 0x00000000005df285 in handle_segfault (sig=11) at mysqld.cc:2552 #2#3 0x00000000005654ff in Item_cond::fix_fields (this=0x5249dd0, thd=0x521f160, ref= ) at item_cmpfunc.cc:3900 #4 0x0000000000565538 in Item_cond::fix_fields (this=0x52435b8, thd=0x521f160, ref= ) at item_cmpfunc.cc:3912 #5 0x0000000000621f96 in setup_conds (thd=0x521f160, tables= , leaves=0x52494d0, conds=0x5244e38) at sql_base.cc:7988 #6 0x0000000000645f3b in JOIN::prepare (this=0x5243770, rref_pointer_array=0x5248a90, tables_init= , wild_num= , conds_init= , og_num= , order_init=0x0, group_init=0x0, having_init=0x0, proc_param_init=0x0, select_lex_arg=0x52488c0, unit_arg=0x5248498) at sql_select.cc:412 #7 0x0000000000654d24 in mysql_select (thd=0x521f160, rref_pointer_array=0x5c3fd0, tables=0x4, wild_num=0, fields=@0x52489c8, conds=0x52435b8, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=0, result=0x52688a0, unit=0x5248498, select_lex=0x52488c0) at sql_select.cc:2377 #8 0x0000000000659f9c in handle_select (thd=0x521f160, lex=0x52483f8, result=0x52688a0, setup_tables_done_option=0) at sql_select.cc:268 #9 0x00000000005ec92a in execute_sqlcom_select (thd=0x521f160, all_tables=0x52494d0) at sql_parse.cc:5011 #10 0x00000000005efb22 in mysql_execute_command (thd=0x521f160) at sql_parse.cc:2206 #11 0x000000000066587d in Prepared_statement::execute (this=0x5245d60, expanded_query= , open_cursor=false) at sql_prepare.cc:3579 #12 0x000000000066874c in Prepared_statement::execute_loop (this=0x5245d60, expanded_query=0x401b43c0, open_cursor=false, packet= , packet_end= ) at sql_prepare.cc:3253 #13 0x0000000000668c27 in mysql_sql_stmt_execute (thd= ) at sql_prepare.cc:2524 #14 0x00000000005f0643 in mysql_execute_command (thd=0x521f160) at sql_parse.cc:2215 #15 0x00000000005f5047 in mysql_parse (thd=0x521f160, inBuf=0x5243520 "execute stmt", length=12, found_semicolon=0x401b6060) at sql_parse.cc:5931 #16 0x00000000005f5ee3 in dispatch_command (command=COM_QUERY, thd=0x521f160, packet=0x525fde1 "execute stmt", packet_length= ) at sql_parse.cc:1213 #17 0x00000000005f67a6 in do_command (thd=0x521f160) at sql_parse.cc:854 #18 0x00000000005e9146 in handle_one_connection (arg=dwarf2_read_address: Corrupted DWARF expression. ) at sql_connect.cc:1127 #19 0x00000035fb006307 in start_thread () from /lib64/libpthread.so.0 #20 0x00000035fa4d1ded in clone () from /lib64/libc.so.6 (gdb) quit
You can use gdb to obtain additional information based on the type of information available.
Now what?
Is the problem a bug? Is it data corruption? Is it hardware related?
Gathering the information is the first step in informing you of more detail that will enable you to search, discuss and seek professional advice to address your problem.
References
- MySQL Internals – Debugging a MySQL Server
- What to Do If MySQL Keeps Crashing
- Debugging mysqld under gdb
- Hunting the core – An old by good intro article to cores and MySQL