2018. 7. 23. 11:35ㆍMySQL
Core was generated by `./WorldServer'.
Program terminated with signal SIGABRT, Aborted.
#0 0x00007fb229058428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
[Current thread is 1 (Thread 0x7fb070548700 (LWP 15201))]
(gdb) bt
#0 0x00007fb229058428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1 0x00007fb22905a02a in __GI_abort () at abort.c:89
#2 0x00007fb22909a7ea in __libc_message (do_abort=do_abort@entry=2, fmt=fmt@entry=0x7fb2291b3ed8 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175
#3 0x00007fb2290a337a in malloc_printerr (ar_ptr=<optimized out>, ptr=<optimized out>, str=0x7fb2291b4008 "double free or corruption (!prev)", action=3) at malloc.c:5006
#4 _int_free (av=<optimized out>, p=<optimized out>, have_lock=0) at malloc.c:3867
#5 0x00007fb2290a753c in __GI___libc_free (mem=<optimized out>) at malloc.c:2968
#6 0x00007fb229f03e16 in ?? () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20
#7 0x00007fb229ed71da in ?? () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20
#8 0x00007fb229eddba1 in ?? () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20
#9 0x00007fb229ed0f96 in mysql_ping () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20
#10 0x0000000000520789 in MYSQLUtility::Ping(st_mysql*) ()
#11 0x0000000000613d18 in CWorldDBTask::IsNeedReconnect() ()
#12 0x0000000000519cba in CDBTaskBase::DBProc() ()
#13 0x00007fb2299c4c80 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#14 0x00007fb229c956ba in start_thread (arg=0x7fb070548700) at pthread_create.c:333
#15 0x00007fb22912a41d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
dump에서 mysql_ping()을 보내다 죽는 상황 발생
mysql에서 MYSQL_OPT_RECONNECT 옵션이 설정되어 있는 경우, mysql_ping() 함수를 사용하여 DB서버와 connect가 되어있는지 체크하고 그 결과를 리턴하게 되는데, 이 때 연결이 안되어 있다면 자동으로 Reconnect 해준다.
그러나 이 때, TIME OUT로 mysql connect 변수가 close 되면, 해당 변수를 참조하면 Segmentation Fault를 일으키기 때문에 mysql_ping()의 반환값이 연결이 끊어진 상태일 때면, mysql_real_query()등의 함수 사용에서 mysql connect 변수를 사용하지 않도록 조치를 취해야 한다.
참조 : http://rammuking.tistory.com/entry/MYSQLOPTRECONNECT-mysqloptions
mysql_options()
mysql_options()는 mysql_init() 다음, mysql_connect() 또는 mysql_real_connect() 이전에 호출 해야 함
MYSQL_OPT_RECONNECT (인수 타입: my_bool*)
연결을 잃어버렸다고 판단됬을 때, 자동으로 서버에 다시 연결하는 것을 활성화 또는 비활성화 시킨다.
디폴트는 자동 연결을 비활성화 하는 것이다. 이 옵션은 재 연결 동작을 명확하게 설정할 때 사용할 수 있다.
MYSQL_OPT_CONNECT_TIMEOUT (인수 타입: unsigned int*)
연결 타임 아웃 (초)
MYSQL_OPT_WRITE_TIMEOUT (인수 타입: unsigned int*)
서버에 기록하는 타임 아웃(현재까지는 윈도우에 TCP/IP 연결에 대해서만 사용이 가능)
MYSQL_OPT_READ_TIMEOUT (인수 타입: unsigned int*)
읽기 타임 아웃 (TCP/IP 연결에서만 사용 가능하고, MySQL 5.1.12 이전 버전에서는 윈도우만 사용 할 수 있음).
이 옵션은 TCP/IP Close_Wiat_Timeout 값이 10분이 되기 전에 끊어진 연결을 검색하고자 할 때 사용할 수 있다.
MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_READ_TIMEOUT => 3개는 mysql fail over 됐을때, 방어 하기 위함
TIME OUT으로 mysql 커넥트 변수가 close되면, 해당 변수를 참조하면 Segmentation Fault를 일으키기 때문에 mysql_ping(...)의 반환값이 연결이 끊어진 상태일 때이면 mysql_real_query(...)등의 함수 사용에서 mysql 커넥트 변수를 참조하지 않도록 조치를 취해야 한다.
'MySQL' 카테고리의 다른 글
MySQL Connection Error : SSL (0) | 2018.08.22 |
---|---|
mysql explain 설명 (0) | 2017.01.20 |