mysql / mariadb 에서 signal 11로 db가 down 되면 운이 좋으면 지난 번 글의 tmp query 와 같이 원인을 파악하기 쉬운 경우도 있지만
대부분 원인파악이 힘들게 로그가 떨어집니다.
이번 글에서는 에러로그만으로는 원인을 찾기가 힘들 때 gdb를 이용하여 디버깅해서 원인을 찾아보겠습니다.
-1. db error log
Thread pointer: 0x7f5993f16008 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 = 0x7f5af40861d8 thread_stack 0x48400 /TEST/mysql/bin/mysqld(my_print_stacktrace+0x2e)[0xc0e47e] /TEST/mysql/bin/mysqld(handle_fatal_signal+0x4bf)[0x769e9f] /lib64/libpthread.so.0[0x3a14e0f7e0] /TEST/mysql/bin/mysqld(_Z13rr_unlock_rowP13st_join_table+0xb)[0x5da02b] /TEST/mysql/bin/mysqld[0x5f2004] /TEST/mysql/bin/mysqld(_Z10sub_selectP4JOINP13st_join_tableb+0x138)[0x5f22e8] /TEST/mysql/bin/mysqld[0x5f93ed] /TEST/mysql/bin/mysqld(_ZN4JOIN10exec_innerEv+0xe5e)[0x60a75e]. . . .
=> ERROR 관련하여 스택이 나오지만 관련 함수를 보려면 어떤 파일을 참조해야하는지 등이 나오지 않음
-2. my.cnf 설정 추가
[mysqld]
stack-trace
core-file
=> my.cnf 에 위 설정을 추가하면 db의 datadir 영역에 core dump 가 떨어짐
* 코어덤프 파일의 사이즈가 생각보다 클 수 있으니 주의
-.3 gdb backtrace
# gdb /TEST/mysql/bin/mysqld core.12935
=> 위에서 떨어진 코어덤프 파일을 gdb 디버깅툴로 실행
(gdb) bt full #0 0x0000003a14e0c97c in pthread_kill () from /lib64/libpthread.so.0 No symbol table info available. #1 0x0000000000769dcc in handle_fatal_signal (sig=11) at /home/buildbot/buildbot/build/sql/signal_handler.cc:296 curr_time = 1545139731 tm = {tm_sec = 51, tm_min = 28, tm_hour = 22, tm_mday = 18, tm_mon = 11, tm_year = 118, tm_wday = 2, tm_yday = 351, tm_isdst = 0, tm_gmtoff = 32400, tm_zone = 0x7f0633c3b070 "KST"} thd = 0x7f04f4f17008 print_invalid_query_pointer = false #2 <signal handler called> No symbol table info available. #3 rr_unlock_row (tab=0x7f04d7138cc0) at /home/buildbot/buildbot/build/sql/sql_select.cc:10509 No locals. #4 0x00000000005f2004 in evaluate_join_record (join=0x7f04d70620a8, join_tab=0x7f04d7138cc0, error=0) at /home/buildbot/buildbot/build/sql/sql_select.cc:18591 shortcut_for_distinct = false found_records = 0 select_cond = 0x7f04d7139468 #5 0x00000000005f22e8 in sub_select (join=0x7f04d70620a8, join_tab=0x7f04d7138cc0, end_of_records=<value optimized out>) at /home/buildbot/buildbot/build/sql/sql_select.cc:18333 error = 0 rc = <value optimized out> info = 0x7f04d7138d80 skip_over = <value optimized out> . . .
=> error 스택이 참조가능한 파일과 라인과 함께 출력되어 원인파악이 더 용이함