mysql_options()

2018. 7. 23. 11:35MySQL

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