[질문] mySQL - lost connection to MySQL server during query

익명 사용자의 이미지

다음은 제가 다른 곳에서 질문한 내용을 이곳에 옮긴 것입니다.

그리고 lost connection to MySQL server during query 에러가 난 이후에
segmentation fault가 발생합니다. 그래서 gdb로 확인해 본 결과가 다음
과 같았습니다.

Core was generated by `./GameServer'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libresolv.so.2...done.
Loaded symbols for /lib/libresolv.so.2
Reading symbols from /lib/libpthread.so.0...done.
rw_common () write Success.

warning unable to set global thread event mask
[New Thread 1024 (LWP 7037)]
Error while reading shared library symbols
attach_thread No such process.
Reading symbols from /lib/libm.so.6...done.
Loaded symbols for /lib/libm.so.6
Reading symbols
from /usr/local/mysql/lib/mysql/libmysqlclient.so.10...done.
Loaded symbols for /usr/local/mysql/lib/mysql/libmysqlclient.so.10
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /usr/lib/libz.so.1...done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /lib/libcrypt.so.1...done.
Loaded symbols for /lib/libcrypt.so.1
Reading symbols from /lib/libnsl.so.1...done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/libnss_files.so.2...done.
Loaded symbols for /lib/libnss_files.so.2
#0 0x400aec82 in __sigsuspend (set=0xbe5ff9fc)
at ../sysdeps/unix/sysv/linux/sigsuspend.c45
45 ../sysdeps/unix/sysv/linux/sigsuspend.c No such file or
directory.
(gdb) where
#0 0x400aec82 in __sigsuspend (set=0xbe5ff9fc)
at ../sysdeps/unix/sysv/linux/sigsuspend.c45
#1 0x4003aa55 in __pthread_wait_for_restart_signal
(self=0xbe5ffc00) at pthread.c898
#2 0x40036d89 in pthread_cond_wait (cond=0x805c024,
mutex=0x805c00c) at restart.h34
#3 0x8050d60 in NPHandleRequestsLoop (thread_params=0x80d5038) at
NPHandlerThread.c139
#4 0x40038a20 in pthread_start_thread (arg=0xbe5ffc00) at
manager.c274

정확하게 이것만으로는 어디서 에러가 나는지 확인하기 힘들지만 suspend
되어있던 thread가 깨어나면서 잘못된 번지를 참조하는 것 같은데 맞는지
모르겠습니다. 아시는 분이 계시다면 확인해 주시기 바랍니다. ^^;

다음은 lost connectin ... 에러에 대한 질문을 옮겨온 것입니다.

---------------------------------------------------------------------
-------------

쓰레드로 다중 처리 한다는 말씀이시죠 ?

그렇다면 아래 connect 부분을

위로 뺴셔서 consistent connection 방법을 이용하시는게 좋을것 같습니
다.

그리고 그냥 아래 소스의 문제라고 보이는 부분은

connect 하는 부분에 mysql_init 함수의 유무와

close 하는 부분에 문제가 있어 보입니다.

그리고 쓰레드 처리시 각각의 쿼리와 그에 대한 리턴값에 대해

무결성 처리를 해주어야 합니다.

Max Connection 에 맞춰 배열로 하든 malloc 으로 하든간에요..

MYSQL 도 필요하다면 다중 처리 하시고 아니라면 글로벌로 뺴서

하셔야 합니다.

그리고 락은 쿼리 할떄와 리턴값을 받은후 풀어 줘야 하구요..

쓰레드로 하실때 주의 할께 많은데 흠.. 일일이 나열하기가 그렇군요..

mysql 영문 매뉴얼을 잘 읽어 보시기 바랍니다.

또 게임에서 쓸꺼라면 반드시 InnoDB 를 쓰실것을 권합니다.

InnoDB가 뭔지 모르신다면 반드시 영문 매뉴얼을 보세요 !

그럼.

-- 호민영 님이 쓰신 글
>> 개발 환경은 Linux 이며 mySQL 버전은 3.23.38입니다.
>> thread를 사용하구요.
>>
>> 저는 mySQL을 잘 모르는지라... 이 곳 게시판을 참고해서 몇 개의 변수
를 찾아보았습니다. 그랬더니.. max_connections 는 100
max_connect_errors는 10, 이렇게 되어있었습니다. 관리자분의 말에 의하
면 그 값이 디폴트라고 합니다.
>>
>> 제가 보고 있는 코드는 게임서버에 관련된 코드입니다. login /
save / logout시에 DB에 접근하게 됩니다. 테스트를 위해서 클라이언트로
부터 패킷이 도착할때마다 save동작을 하도록 해봤습니다. 물론, 이렇게
만들어서는 안되겠지만 테스터가 저 하나인 상황에서 여러 유저가 보내는
패킷량과 대충 비슷하게 맞춰보기 위해서 이렇게 만들었습니다. 음 역시
아니나 다를까 위와같은 메세지가 나오더군요. 뭐가 문제일까요?
>>
>> 첨에는 mySQL의 동작 속도보다 빨라서가 아닐까하는 막연한 추측을 통
해 쓰레드를 busy-waiting 시켜보았습니다. 그런데도 에러가 나더군요. 그
래서 이번엔 락도 같이 걸어 보았습니다. 역시 안되더군요...
>>
>> thread가 DB에 접근하는 기본구조는 다음과 같습니다.
>>
>> while (true)
>> {
>> if (current time > last saved time + 30) // milli seconds
>> {
>> lock (db);
>> connect (db);
>> save (db);
>> disconnect (db);
>> unlock (db);
>> }
>> else
>> log - busy waiting...
>> }
>>
>> 대충 이렇게 구현되어 있습니다. 코드상으로는 아무런 문제도 없는 것
같은데... 이 곳 게시판에서 검색도 해보고 글도 읽어보았지만 저는 C코드
만 볼 줄 알아서 무슨 소리인지 잘 이해가 가지 않더군요. ^^; 좀 자세히
설명해 주셨으면 합니다. 별의별 짓을 다 해봐도 이해가 가지 않네요...
>> busy-waiting시켜서 좀 시간이 지난 다음에 접근하면 될 것 같았는데
요...
>>
>> 그럼 즐거운 크리스마스 잘 보내시구요... ^^;

익명 사용자의 이미지

정확한것인지 아닌지 모르겠지만...

connection이 끈긴 사항에서...
쿼리를 던진후 에러 체크를 하지 않고..
MY_RES형의 변수 포인터를 참조 하지 않았나 싶네여..

이때 분명히 리턴값은 NULL이 발생하는데..
mysql_fetch_row()을 사용해서 결과값을 출력하려면
segmantaion fault가 발생합니다..

저도 한때 그래가지고..
몇번 reconnection을 해보고..
안되면 프로세스 종료를 시켰지요...

도움이 되셨으면 합니다..

gdb결과물 보니 라이브러리쪽에서 SIGSEGV(이게 맞는지 모르겠지만.)
발생한거 같네여..

이상 허접 대답이었슴댜아..

PS) 추가로 lost connection...하는 에러는..
select쿼리등 과 같은것을 넘겼는데..
끝났을때 뿌려주는 메세지입니다.
즉..

MYRES *result = mysql_restor_use(query)// 이함수가 맞는지 기억이 가물
가물 ^^*

if(!result)
{
// 이부분이 들어가있는지 확인해보세여..
// 이부분이 빠지고 다음으로 넘어가면 세그뜹니다 ^^
}

MYSQL row = mysql_fetch_row(result);
sprintf(buf,"%s",row[0])
// 위에 체크를 안하고 이런식으로 가면 바로 퍽이지요 ^^*

익명 사용자의 이미지

저의 짧은 소견을 달아 보겠습니다.

가능성 1
멀티스래드를 사용 할시에 동일 resource의 사용에 주의를
해야 합니다.
왜냐하면 시스템의 ioctl을 사용할 시에 하나의 task에서
크리티컬 영역에 진입중 스케줄 아웃이되고, 다른 task에서
다시 동일 리소스에 재진입을 시도하면 os가 wait를 시키거나
fault를 발생시키거나 둘중에 하나를 하겠죠.
재가알기로는 pthread_~계열의 함수는 후자에 속하는 것 같습니다.
이 상황은 os에 따라서도 결과가 달리 나옵니다.
예를 들면 hp-ux는 pthread~(cms(?) lib)에서 동일 stream에
io(read/write)를 발생시키면 100% SIGSEGV를 발생시킵니다.
그러나 SUN(or IBM RS6000) OS의 경우에는 조금 나은편에 속합니다.
그렇기 때문에 이런일을 수행할시에는 semapore나 mutex를 사용하여
동시에 동일 resource에 접근하는 것을 근원적으로 차단시켜야 합니다.

추정의 이유
1. 일단 mysql에서 db handle시에 mutex를 사용했다는 이야기가 없음.
2. 스레드마다 mysql을 초기화 했다는 이야기가 없음.
때문에 1개의 mysql desc을 사용해서 여러 스래드가 공유하면서
thread간에 control을 하지 않는다고 보여짐. mysql은 기본적으로
sql statement를 socket에 기록하고 그 결과를 read합니다.
위의 사항이 사실이라면 프로그램 설계자는 다시한번 설계상의
문제를 되집어보기 바랍니다.

가능성 2
앞의 다른분이 기술한 것처럼 mysql의 결과들을 무시하고 다음 작업을
수행한 경우입니다. 이 경우는 초보자들이 많이 하는 실수이지요.
주로 초보자들은 한 두번의 test로 모든 것이 안전하다고 믿는 경향이
있으므로 흔히 당하지요!. 하지만 위의 질의자는 초보의 단계는
지난듯 합니다만, 실수가 있을지.....,

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.