MySQL을 올바르게 죽이는 방법?


28

CPanel이 설치된 CentOS 64 비트가 있으며 다음을 사용합니다.

service mysql stop

그것은 단지 똑딱 거리는 시간을 계속하고 멈추지 않는 것처럼 보입니다. 로그에는 많은 내용이 게시됩니다.

130303 17:42:38 [Warning] /usr/sbin/mysqld: Forcing close of thread

에서 err.log파일, 나는이 많이 참조 :

[Warning] /usr/sbin/mysqld: Forcing close of thread

예전에는 그렇습니다. 왜 그렇게하고 고치는 방법을 알고 있습니까?

지금은해야 killall -9 mysql하는데 더 좋은 방법이 있습니까?

서버도 매우 활동적입니다.

이것이 구성 문제입니까? memroy 설정이 너무 높습니까?

[mysqld]
default-storage-engine=MyISAM
local-infile=0
symbolic-links=0
skip-networking
max_connections = 500
max_user_connections = 20
key_buffer = 512M
myisam_sort_buffer_size = 64M
join_buffer_size = 64M
read_buffer_size = 12M
sort_buffer_size = 12M
read_rnd_buffer_size = 12M
table_cache = 2048
thread_cache_size = 16K
wait_timeout = 30
connect_timeout = 15
tmp_table_size = 64M
max_heap_table_size = 64M
max_allowed_packet = 64M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 64M
query_cache_type = 1
low_priority_updates=1
concurrent_insert=ALWAYS
log-error=/var/log/mysql/error.log
tmpdir=/home/mysqltmp
myisam_repair_threads=4
[mysqld_safe]
open_files_limit = 8192
log-error=/var/log/mysql/error.log

[mysqldump]
quick
max_allowed_packet = 512M

[myisamchk]
key_buffer = 64M
sort_buffer = 64M
read_buffer = 16M
write_buffer = 16M

답변:


37

mysql을 종료하는 가장 매끄러운 방법은 단순히 실행하는 것입니다.

mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown

이유는 다음과 같습니다.

mysql 서비스 파일 ( /etc/init.d/mysql)은 소켓 파일의 존재에 의존합니다. 역사적으로 MySQL 4.0으로 돌아가서 소켓 파일이 때때로 사라지는 경우가 있습니다. 이로 인해 표준 service mysql stop이 작동하지 못하게됩니다.

말하기에 충분하지 않습니다

mysqladmin -uroot -p -h127.0.0.1 shutdown

mysqld를 라우팅 할 것이다 때문에오고있는 사용자로 root@127.0.0.1root@localhostTCP / IP를 명시 적으로 사용할 수없는 경우. 기본적으로 mysqld는 최소 저항 경로를 선택 하고 소켓 파일 root@127.0.0.1root@localhost통해 연결 합니다. 그러나 소켓 파일이 없으면 root@localhost연결되지 않습니다.

mysqladminMySQL 문서 조차도 다음과 같이 말합니다.

Unix 소켓 파일을 사용하여 로컬 서버에 연결할 때 mysqladmin shutdown을 실행하면 mysqladmin은 서버의 프로세스 ID 파일이 제거 될 때까지 대기하여 서버가 올바르게 중지되었는지 확인합니다.

따라서 TCP / IP를 활성화해야합니다.

mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown

돌아 가기 2011년 9월 30일에, 나는 내 자신의 버전 스크립트 mysqld_multi호출을 mysqlservice(내 게시물을 참조 동일한 호스트에 여러 인스턴스를 실행 ). 다른 포트에서 mysqld에 연결하기위한 가상 엔진 역할을합니다. 당신 my.cnf은 사용자 정의 매개 변수로 자신을 가져와야합니다 . 이 스크립트에서 다음과 같이 종료를 발행합니다.

stop() {
  ${ECHO} -n $"Stopping ${PROGNAME}"
  ${MYSQLD_STOP}
  ATTEMPTS=0
  STOPPING_MYSQLD=1
  MINUTES_TO_TRY=10
  (( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
  while [ ${STOPPING_MYSQLD} -eq 1 ]
  do
    ${ECHO} -n "."
    ${SLEEP} 0.25
    MYSQLD_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
    (( ATTEMPTS++ ))
    if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY}   ] ; then STOPPING_MYSQLD=0 ; fi
    if [ ${MYSQLD_HAS_BEEN_SHUTDOWN} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
  done
  ${ECHO}
  if [ ${STOPPING_MYSQLD} -eq 2 ]
  then
    ${ECHO} "Stopped ${PROGNAME}"
  else
    ${TAIL} -30 ${MYSQL_ERROR_LOG}
  fi
}

그러나 무엇 ${MYSQLD_STOP}입니까?

MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"

내가 사용하는 것을 주목하십시오 127.0.0.1 하고 명시 적 포트를 확인하십시오. 그렇게하면 소켓 파일에 의존하지 않습니다.

나는 항상 mysqladmin --protocol=tcp shtudownmysql을 멈추는 적절한 대안으로 사용 했다 service mysql stop. 수행 kill -9mysqldmysqld_safe마지막 리조트의 마지막의해야 마지막. (예, 마지막 세 번 말했습니다).

여러 번 mysqld가 경고없이 mysql.sock을 삭제했습니다. 다른 사람들도 수년에 걸쳐이 문제를 겪었습니다.

발문

비밀은 내가 말한대로입니다 : TCP / IP ( ) 를 통해 mysqladmin 을 사용하여 mysql에 연결 --protocol=tcp하고 발행하십시오 shutdown. 종료 권한 이 있기 때문에 작동해야합니다 .mysql.user 인증 된 종료 전용 . Linux 서버에서 mysqld를 종료 할 때 Windows 시스템에서 원격 종료를 실행할 수 있었기 때문에 근무일을 몇 번 절약했습니다.

업데이트 2013-03-06 22:48 EST

셧다운 동안 무슨 일이 일어나고 있는지 걱정이된다면, 특히 Buffer Pool에 많은 InnoDB 데이터가있는 경우 셧다운 시간을 조작하는 방법과 데이터가 디스크로 플러시되는 방법이 있습니다

제안 # 1

더티 페이지가 많은 경우 innodb_max_dirty_pages_pct 를 0으로 낮출 수 있습니다 .

SET GLOBAL innodb_max_dirty_pages_pct = 0;

종료하기 약 15-30 분 전에 설정하십시오. 이렇게하면 mysqld는 디스크에 쓸 수있는 더티 페이지를 최소한으로 줄입니다.

제안 # 2

기본적으로 innodb_fast_shutdown 은 1입니다.이 옵션에는 세 가지 값이 있습니다

  • 0 : InnoDB는 종료 전에 느린 종료, 전체 제거 및 삽입 버퍼 병합을 수행합니다.
  • 1 : InnoDB는 종료시 빠른 종료라고 알려진 프로세스에서 이러한 작업을 건너 뜁니다.
  • 2 : MySQL이 충돌 한 것처럼 InnoDB는 로그를 플러시하고 콜드 셧다운합니다. 커밋 된 트랜잭션은 손실되지 않지만 응급 복구 작업으로 인해 다음 시작 시간이 더 오래 걸립니다.

설명서는 다음과 같이 말합니다.

상당한 양의 데이터가 여전히 버퍼링되는 극단적 인 경우 느린 종료에는 몇 분 또는 몇 시간이 걸릴 수 있습니다. 업그레이드 프로세스가 파일 형식을 업데이트 할 경우 모든 데이터 파일이 완전히 준비되도록 MySQL 주 릴리스간에 업그레이드하거나 다운 그레이드하기 전에 느린 종료 기술을 사용하십시오.

비상 또는 문제 해결 상황에서 innodb_fast_shutdown = 2를 사용하면 데이터가 손상 될 위험이있는 경우 가장 빠르게 종료됩니다.

innodb_max_dirty_pages_pct 및 innodb_fast_shutdown의 기본값은 대부분의 경우에 적합합니다.


2
소켓 파일 은 구성된 임계 값보다 오래된 시간이있는 tmpwatch다른 모든 파일 과 함께 소켓을 삭제 하므로 Red Hat 파생 상품에서 사라집니다 /tmp.
Michael-sqlbot 2016 년

@ Michael-sqlbot에게 감사드립니다. 마침내 누군가의 말을 들었습니다. 이것이 MySQL AB (pre-Oracle, Sun 이전)의 누군가가 mysql.user이런 두통을 피하기 위해 SHUTDOWN 권한을 추가하기로 결정한 이유 입니다.
RolandoMySQLDBA

데비안 또는 우분투에서 mysqladmin --defaults-file=/etc/mysql/debian.cnf shutdown...이 파일에는 루트와 같은 MySQL 계정의 자격 증명이 들어 있습니다.
0xC0000022L

평소와 같이 @RolandoMySQLDBA는 Stack Exchange 사이트에서 최고의 DBA 리소스 중 하나입니다. 6 년 이상 후에 도움이 된 훌륭한 작업입니다.
JakeGould

5

당신의 질문이 MySQL을 "종료하는 방법"에 관한 것이 아니라 왜 당신이 그렇게 느리게 종료하는지에 관한 것 같습니다.

에서 비슷한 질문에 대한 내 대답은 , 내가 부드러운 다시 시작, 당신은 MySQL을 시작하도록 요청 후 발생하는 활동의 양을 줄임으로써 도움을 몇 가지 제안을 제공 종료 프로세스를 .

SHOW FULL PROCESSLIST;해당 항목 # 1을 자주 사용하지 않는 경우 서버에서 발생하는 상황을 파악해야 시스템 종료가 느려집니다. 중단하기에 안전한 장기 실행 쿼리가있는 경우로 쿼리를 종료 할 수 있습니다 KILL <thread-id>.

다른 제안을 요약하면 다음과 같습니다.

전역 변수 innodb_fast_shutdown = 1(기본값)를 설정하면 InnoDB의 종료 속도가 빨라집니다. 이다 업그레이드를 수행과 관련이없는 이유로 서버를 종료하는 경우, 그러나, 안전합니다. 업그레이드를 위해 종료하는 경우 0으로 설정 해야합니다 .

FLUSH TABLES;정상적으로 사용하면 열려있는 모든 테이블이 닫힙니다. 후속 쿼리에서 참조되는 경우 다시 열리지 만이 작업은 종료를 요청한 시간과 종료가 완료된 시간 사이의 시간을 궁극적으로 줄여야합니다. 마지막 단계를 위해 ...

FLUSH TABLES WITH READ LOCK;열려있는 모든 테이블을 닫고 현재 클라이언트 연결이 소유 한 독점 잠금을 얻어 다른 연결이 전체 서버의 테이블에 쓰지 못하게합니다. 당신은받지 않습니다 mysql>하지만,이 세션에서 분리하지 마십시오 - 당신이 종료 요청을 발행 할 수 있습니다 그 시점에서이 잠금을 소유 할 때까지 프롬프트 다시.

사용량이 많은 서버에서이 단계를 수행하면 서버의 활동 수준이 줄어들고 상황이 훨씬 조용해지며 종료 또는 다시 시작이보다 순조롭게 진행됩니다.


2

MySQL이 순전히 잠겨 있지는 않지만 종료 할 때 정리 활동 (롤백 등)을하고있을 가능성이 있습니다. 종료 할 때 모든 작업을 수행하지 않으면 시작시 대기해야하는 경우가 종종 있습니다.

다음은 살펴볼 내용입니다. 다른 터미널 창에서 오류 로그 (tail -f [yourerror.log])를 보면서 한 터미널 창에서 mysql을 종료하십시오. 에러 로그는 MySQL이 무엇을하고 있는지 보여줍니다.


1

유감스럽게도 귀하의 경험에 대해 들어 죄송하며 이와 유사한 바보 같은 MySQL 시나리오에 대한 나의 경험이 도움이되기를 바랍니다.

서버에서 MySQL 서비스를 종료하는 방법을 알아내는 대신 서비스 남용이 있는지 확인하기 위해 다음을 통해 시스템 상태를 점검해야합니다 ( 가정은 CentOS / RHEL 환경 ) :

 /usr/bin/iostat
 /usr/bin/uptime
 top -c

다음을 사용하여 평균 시스템로드 및 시스템 내에서 가장 많이 소비되는 리소스를 식별하십시오.

또한 mytop시스템에서 처리중인 SQL 문에 대한 전체적인보기를 얻으려면 설치해야 합니다.

설치하려면 mytop다음을 수행하십시오.

 cd /root
 wget http://jeremy.zawodny.com/mysql/mytop/mytop-1.6.tar.gz
 tar -zxvf /root/mytop-1.6.tar.gz
 cd /root/mytop-1.6
 perl Makefile.pl
 make
 make install
 chmod 644 /usr/local/bin/mytop
 vi /usr/local/bin/mytop 

(원하는 텍스트 편집기를 사용하십시오)

검색 "long|!" => \$config{long_nums},

로 주석 #"long|!" => \$config{long_nums},

chmod 555 /usr/local/bin/mytop

그리고 당신은 mytop 과 함께하는 것이 좋습니다 . 이를 사용하여 MySQL 서비스를 사용하고있는 MySQL 명령문을 점검하고 중지하십시오.

위의 지침을 실행하면 다음과 같은 기능이 제공됩니다.

  • 서버 상태 / 상태 진단
  • 병목 현상의 원인 진단

병목 현상의 원인을 제거한 후에는 MySQL 서비스를 다시 시작하려고 할 때 더 쉬워야합니다. 위 정보가 도움이 되길 바랍니다.

참고 : mytop 고대와 유지 관리되지 않습니다. innotop최신 시스템에서 사용해야 합니다.


0

MySQL의 초기화 스크립트의 표준 구현은 SIGTERM으로 MySQL에 신호를 보내고 MySQL이 종료 될 때까지 일정 시간 동안 기다립니다.

MySQL은 SIGTERM을 수신 한 후 먼저 새 연결 수신을 중지 한 다음 여전히 보류중인 쿼리 실행을 완료합니다 (작업량 및 동시 클라이언트 수에 따라 시간이 걸릴 수 있음). 워크로드, 구성, 사용 가능한 메모리 및 스토리지 엔진 선택에 따라 다시 한 번). 모든 데이터 플러싱이 완료되면 MySQL은 초기화 단계에서 할당 한 메모리를 할당 해제합니다 (MySQL이 할당 한 메모리 양에 따라 시간이 걸릴 수 있음). 모든 파일 핸들을 닫은 다음 닫습니다. "종료 (0)".

종료 요청 후 MySQL을 종료하는 데 시간이 오래 걸리는 경우이 단계 중 하나 이상을 완료하는 데 시간이 오래 걸릴 수 있습니다. 시간이 있다면 프로세스가 완료 될 때까지 기다리는 것이 좋습니다 (데이터베이스 인스턴스를 다시 시작할 때 데이터 손실 또는 긴 복구 프로세스를 피할 수 있습니다).

불행히도 귀하의 질문에 귀하의 문제에 대한 적절한 해결책을 제안 할 수있는 충분한 정보가 없습니다. 이것이 문제를 이해하는 데 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.