MySQL 인 스 턴 스 를 어떻게 안전하게 닫 습 니까?

본 고 는 my sqld 프로 세 스 가 닫 히 는 과정 과 MySQL 인 스 턴 스 를 어떻게 안전 하고 완화 적 으로 닫 는 지 분석 하 였 으 며 이 과정 에 대해 잘 모 르 는 학생 들 은 참고 할 수 있 습 니 다.
닫 는 과정:
1.shutdown 시작,발송  SIGTERM 신호
2.필요 하 다 면 닫 힌 스 레 드 를 새로 만 듭 니 다(shutdown thread)
클 라 이언 트 가 시작 한 닫 기 라면 전용 닫 기 스 레 드 를 새로 만 들 것 입 니 다.
SIGTERM 신 호 를 직접 받 아 닫 으 면 신호 처 리 를 전담 하 는 스 레 드 가 닫 히 거나 독립 된 스 레 드 를 새로 만들어 서 책임 집 니 다.
독립 된 닫 기 스 레 드 를 만 들 수 없 을 때(예 를 들 어 메모리 부족)MySQL Server 는 다음 과 같은 경고 메 시 지 를 보 냅 니 다.
Error: Can't create thread to kill server
3.MySQL Server 가 새로운 연결 요청 에 응답 하지 않 습 니 다.
TCP/IP 네트워크 감청 닫 기,유 닉 스 소켓 닫 기 등 채널 닫 기
4.현재 연결,트 랜 잭 션 을 점차 닫 습 니 다.
남 은 연결 은 즉시 종 료 됩 니 다.
현재 트 랜 잭 션,SQL 활동 의 연결 이 있 습 니 다.이 를 killed 로 표시 하고 다음 검사 때 닫 을 수 있 도록 정기 적 으로 상 태 를 확인 합 니 다.(KILL 문법 참조)
현재 활성 화 된 트 랜 잭 션 이 있 으 면 이 사물 은 스크롤 백 됩 니 다.이 트 랜 잭 션 에서 비 트 랜 잭 션 표를 수정 하면 수 정 된 데 이 터 를 스크롤 백 할 수 없고 일부 변경 만 완료 할 수 있 습 니 다.
Master/Slave 복사 장면 의 Master 라면 복사 스 레 드 에 대한 처리 과정 은 일반 스 레 드 와 같 습 니 다.
Master/Slave 복사 장면 의 Slave 라면 IO,SQL 스 레 드 를 순서대로 닫 습 니 다.이 두 스 레 드 가 현재 활발 하 다 면 killed 표 지 를 추가 한 다음 에 닫 습 니 다.
Slave 서버 에서 SQL 스 레 드 는 현재 SQL 작업 을 직접 중단 할 수 있 습 니 다(복사 문 제 를 피하 기 위해).그리고 이 스 레 드 를 닫 습 니 다.
MySQL 5.0.80 및 이전 버 전에 서 SQL 스 레 드 가 중간 에 사 무 를 수행 하면 이 사 무 는 다시 굴 러 갑 니 다.5.0.81 부터 사용자 가 KILL 작업 을 시작 하지 않 는 한 모든 작업 이 끝 날 때 까지 기 다 립 니 다.
Slave 의 SQL 스 레 드 가 비 사무 표 에 대해 작업 을 수행 할 때 KILL 이 강제 되 어 Master,Slave 데이터 가 일치 하지 않 을 수 있 습 니 다.
5.MySQL Server 프로 세 스 가 모든 스 레 드 를 닫 고 모든 저장 엔진 을 닫 습 니 다.
모든 표 cache 를 새로 고치 고 열 린 시 계 를 닫 습 니 다.
모든 저장 엔진 은 각각 관련 된 닫 기 동작 을 책임 집 니 다.예 를 들 어 MyISAM 은 기록 을 기다 리 는 모든 동작 을 새로 고 칩 니 다.InnoDB 는 buffer pool 을 디스크 에 리 셋 합 니 다(MySQL 5.0.5 부터 innodb 를 시작 하면fast_shutdown 을 2 로 설정 하지 않 으 면)현재 LSN 을 표 공간 에 기록 한 다음 모든 내부 스 레 드 를 닫 습 니 다.
6.MySQL Server 프로 세 스 종료
KILL 명령 어 에 대하 여
5.0 부터 KILL 지원 지정  CONNECTION|QUERY 두 가지 옵션:
KILL CONNECTION 은 원래 와 마찬가지 로 스크롤 백 을 중단 하고 이 스 레 드 연결 을 닫 고 관련 자원 을 방출 합 니 다.
KILL QUERY 는 현재 실행 중인 스 레 드 만 정지 하고 다른 것 은 변 하지 않 습 니 다.
KILL 작업 을 제출 하면 이 스 레 드 에 특수 한 kill 태그 비트 가 설 정 됩 니 다.보통 일정 시간 이 걸 려 야 스 레 드 를 진정 으로 닫 을 수 있 습 니 다.kill 태그 위 치 는 특정한 상황 에서 만 검사 할 수 있 기 때 문 입 니 다.
1.SELECT 조 회 를 수행 할 때 ORDER BY 또는 GROUP BY 순환 에서 일부 줄 기록 블록 을 읽 을 때마다 kill 태그 위 치 를 검사 하고 존재 하 는 것 을 발견 하면 이 문 구 는 종 료 됩 니 다.
2.ALTER TABLE 을 실행 할 때 원본 표 에서 일부 줄 의 기록 블록 을 읽 을 때마다 kill 태그 위 치 를 검사 합 니 다.존재 하 는 것 을 발견 하면 이 문 구 는 종료 되 고 임시 표를 삭제 합 니 다.
3.UPDATE 와 DELETE 를 실행 할 때 일부 줄 의 기록 블록 을 읽 고 업데이트 하거나 삭제 한 후에 kill 태그 위 치 를 검사 합 니 다.존재 하 는 것 을 발견 하면 이 문 구 는 종료 되 고 스크롤 백 사 무 를 수행 합 니 다.비 사무 표 에서 의 작업 이 라면 변 경 된 데 이 터 는 스크롤 백 되 지 않 습 니 다.
4、GET_LOCK()함수 가 NULL 을 되 돌려 줍 니 다.
5.INSERT DELAY 스 레 드 는 메모리 에 새로 추 가 된 기록 을 신속하게 저장 한 다음 에 종 료 됩 니 다.
6.현재 스 레 드 가 표 급 자 물 쇠 를 가지 고 있 으 면 방출 되 고 종 료 됩 니 다.
7.스 레 드 의 쓰기 동작 이 디스크 공간 방출 을 기다 리 고 있 으 면'디스크 공간 가득'오 류 를 직접 던 지고 종료 합 니 다.
8.MyISAM 표 가 REPAIR TABLE 또는 OPTIMIZE TABLE 을 실행 할 때 KILL 에 의 해 손상 되 어 사용 할 수 없 게 되 고 다시 복구 할 수 있 도록 지도 합 니 다.
MySQL 을 안전하게 닫 는 몇 가지 제안
my sqld 서비스 프로 세 스 를 안전하게 닫 으 려 면 다음 단계 로 진행 하 는 것 을 권장 합 니 다.
0.SUPER,ALL 등 최고 권한 을 가 진 계 정 으로 MySQL 을 연결 하고 유 닉 스 socket 방식 으로 연결 하 는 것 이 좋 습 니 다.
1.5.0 이상 버 전에 서 innodb 설정fast_shutdown=1,InnoDB 를 빠르게 닫 을 수 있 도록 합 니 다(full purge,insert buffer merge 를 하지 않 음).MySQL 버 전 을 업그레이드 하거나 강등 하기 위해 서 라면 설정 하지 마 십시오.
2,innodb 설정max_dirty_pages_pct=0,InnoDB 가 모든 더러 운 페이지 를 디스크 에 새로 고치 도록 합 니 다.
3、max 설정connections 와 maxuser_connections 는 1 입 니 다.마지막 으로 현재 연결 을 제외 하고 새로운 연결 을 만 들 수 없습니다.
4.활성화 되 지 않 은 모든 스 레 드 를 닫 습 니 다.즉,상 태 는 Sleep 입 니 다.  그리고 Time 이 1 이상 인 스 레 드 ID;
5,실행 SHOW PROCESSSLIST  활성 화 된 스 레 드 가 있 는 지 확인 하 십시오.특히 표 잠 금 스 레 드 가 발생 할 수 있 습 니 다.예 를 들 어 빅 데이터 세트 가 있 는 SELECT 나 넓 은 범위 의 UPDATE 또는 DDL 을 실행 하 는 것 은 매우 신중 해 야 합 니 다.
6.SHOW ENGINE INNODB STATUS 를 실행 하여 History list length 의 값 이 비교적 낮 음 을 확인 합 니 다(일반적으로 500 보다 낮 음).즉,PURGE 가 없 는 업무 가 매우 적 고 Log sequence number,Log flushed up to,Last checkpoint at 세 가지 상태의 값 과 마찬가지 로 모든 LSN 이 검사 점 을 했 음 을 확인 합 니 다.
7.그 다음 에 FLUSH LOCKAL TABLES 작업 을 수행 하고 모든 table cache 를 새로 고침 하 며 열 린 시 계 를 닫 습 니 다(LOCAL 의 역할 은 이 작업 이 BINLOG 를 기록 하지 않 는 것 입 니 다).
8.SLAVE 서버 라면 먼저 IO 를 닫 는 것 이 좋 습 니 다.THREAD,모든 RELAY LOG 가 다 적 용 된 후에 SQL 을 닫 습 니 다.THREAD,SQL 피하 기THREAD 는 큰 일 을 수행 하 는 것 이 종료 되 었 습 니 다.모든 응용 이 끝 날 때 까지 인내심 을 가지 고 기 다 려 야 합 니 다.굳이 강제로 닫 으 려 면 큰 일이 끝 난 후에 SQL 을 닫 는 것 이 좋 습 니 다.THREAD;
9.마지막 으로 my sqladmin shutdown 을 실행 합 니 다.
10.긴급 한 상황 에서 innodb 를 설정 할 수 있 습 니 다.fast_shutdown=1,그리고 my sqladmin shutdown 을 직접 실행 하면 됩 니 다.심지어 운영 체제 층 에서 kill 또는 kill-9 를 호출 하여 my sqld 프로 세 스 를 죽 입 니 다(innodbflush_log_at_trx_commt=0 일 때 일부 트 랜 잭 션 을 잃 어 버 릴 수 있 습 니 다).하지만 my sqld 프로 세 스 가 다시 시 작 될 때 CRASH RECOVERY 작업 을 하기 때문에 저울질 이 필요 합 니 다.
그렇게 많은 말 을 하 는데 사실은 정상 적 인 상황 에서 my sqladmin shutdown 을 실행 하면 됩 니 다.만약 에 차단 이 발생 하면 위의 내용 을 참고 하여 분석 하고 해결 하 세 요.하하:)
이상 은 MySQL 인 스 턴 스 를 어떻게 안전하게 닫 는 지 에 대한 상세 한 내용 입 니 다.MySQL 인 스 턴 스 를 닫 는 데 관 한 자 료 는 다른 관련 글 에 주목 하 십시오!

좋은 웹페이지 즐겨찾기