>  기사  >  데이터 베이스  >  MySQL 느린 쿼리 스냅샷 스크립트 자동 기록

MySQL 느린 쿼리 스냅샷 스크립트 자동 기록

高洛峰
高洛峰원래의
2016-11-21 14:47:171139검색

이 스크립트를 작성한 원래 의도는 Alibaba Cloud RDS 사용 중에 데이터베이스에서 예외가 발생하여 빠른 복구가 필요하다는 것입니다. 인터넷에는 유사한 킬 스크립트가 많이 있으며 모두 mysqladmin을 통해 구현됩니다. 그러나 Ali-RDS 환경에는 다음과 같은 제한이 있습니다.

SUPER 권한을 제공하지 않는 사용자, 즉 사용자는 자신의 스레드만 Kill할 수 있습니다

연결 수가 급격히 증가할 때, 콘솔을 포함한 외부 사용자는 로그인할 수 없습니다

아침에 발생한 두 가지 주요 문제를 해결하기 위해 이 python 스크립트는 db 인스턴스에서 멀티스레딩을 사용하여 각 사용자에 대한 연결을 예약하고 명령 구성 파일을 읽습니다. mysqk.ini를 실시간으로 kill이 필요한 경우 해당 사용자의 기존 연결을 이용하여 information_schema.processlist에서 조건에 맞는 스레드를 찾아 kill하는 것으로 확인된다.

참고: 이 스크립트는 9월에 한 번 재작성되었습니다. 7월 버전(브랜치 old_0.5.0)은 사용자당 인스턴스당, 하나의 db 인스턴스에 해당하는 스레드가 너무 많습니다. 항상 매우 우아하지는 않기 때문에 여러 사용자의 세션을 동시에 유지하기 위해 하나의 db 인스턴스와 하나의 스레드로 변경했습니다. 동시에 새 버전에는 특정 연결을 포함하거나 제외하는 기간별 확인, 이메일 알림, 구성 항목 적용 범위 등 더 많은 기능도 추가되었습니다.

특징

mysql ping을 통해 항상 긴 연결을 유지하고, 연결이 불가능한 당혹스러운 상황을 해결하기 위한 자동 재시작 메커니즘이 있습니다.

각 DB 인스턴스에는 자체 스레드가 있습니다. 개별 사용자를 죽이기 위해 로그인하는 복잡한 작업을 피하기 위해. SUPER 권한이 있는 경우 구성을 단순화하여 호환되도록 할 수도 있습니다.

스레드를 별도로 종료해야 하는 시나리오를 처리할 수 있습니다.

장기 실행

N초 이상의 트랜잭션에 대한 절전 상태(일반적으로 권장되지 않지만 때때로 이를 종료하면 관리자가 사용할 수 있는 연결이 빠르게 해제될 수 있습니다)

Binlog 덤프와 같이 종료할 수 없는 일부 스레드는 제외

특정 키워드가 포함된 스레드는 kill 필요

조건에 맞는 스레드가 나타나면 해당 시점의 프로세스 목록, 엔진 상태, lock_wait를 스냅샷하여 이메일을 보냅니다

시운전을 위한 dry_run 모드가 있습니다. 즉, 모든 검사 프로세스가 실행되지만 실제 킬은 없습니다

야간의 일부 장시간 작업을 확인하지 않는 점을 고려하여 시간 창 내에서만 실행을 지원합니다

비밀번호 암호화

빠른 사용

은 MySQL-python 및 pycrypto 라이브러리를 설치하기 위해 pip가 필요합니다. Python 2.7에서 테스트되었습니다.

settings.py에서 연결을 위한 사용자 이름과 비밀번호 정보를 설정하세요. 여기서는 동일한 DB 배치에서 확인해야 할 인증 정보가 동일하다고 가정합니다. 지정된 사용자는 로그인 인증에 사용되며 확인해야 할 사용자를 스크립트에 알려줍니다.
비밀번호는 prpcryptec.py를 통해 암호화해야 하며, 암호화된 키는 스크립트 자체의 KEY_DB_AUTH 변수에 적어야 합니다. (누설이 걱정된다면 mysqk.py를 pyc로 컴파일해서 실행해보세요)

mysqk.ini 메인 설정 파일에서 확인해야 할 데이터베이스 주소를

에 설정해주세요 db01=10.0.200.100:3306

db01과 같은 스레드를 종료하기 위한 옵션을 각각 지정할 수 있습니다. [id_db01]은 기본적으로 [db_commkill] 옵션을 재사용합니다.

db_comconfig 섹션에서는 db_puser를 모든 프로세스 목록을 볼 수 있는 권한을 가진 사용자로 설정하고 설정의 DB_AUTH에만

을 지정했습니다. .py. 실제로 비정상적인 스레드를 종료하지 않고 검사를 수행하고 dry_run이 0이 아닌지 확인하세요

자!

구성 항목 설명

mysqk.ini:

mail_config

이메일 알림 관련 설정, smtp 서비스 주소, 인증 정보입니다.
mail_receiver= 비어 있게 설정하면 메일이 전송되지 않습니다.

db_info

확인하고 종료할 데이터베이스 인스턴스를 설정합니다.
형식: =, dbid는 db 인스턴스를 나타내는 유일한 것입니다. 나중에 종료할 각 db에 대한 옵션을 설정합니다. 이 섹션의 구성 이름은 id_입니다.

여기에 나타나는 db 인스턴스를 확인하고 ;로 주석을 달 수 있지만 스크립트를 다시 시작해야 합니다.

db_comconfig

공개 구성을 확인하고 실시간으로 적용합니다.

db_puser: show processlist에 대한 사용자 이름을 지정합니다. 필요한 권한: PROCESS, information_schema 라이브러리 보기. 대표 사용자라 할 수 있으며, 비정상적인 스레드를 확인하고 해당 스레드를 종료할 수 있는 권한을 가진 사용자에게 결과를 제공하는 역할을 합니다.

run_max_count: 점검 수행 횟수, 전역 제어 스위치입니다. 이 값이 수정될 때마다 검사가 다시 시작됩니다. 즉, 새로 수정된 구성이 적용됩니다.

은 0입니다. 이는 스크립트가 어떠한 검사도 수행하지 않고 단순히 데이터베이스에 대한 연결을 유지한다는 의미입니다. 생존 확인 빈도는 settings.py

의 CHECK_CONFIG_INTERVAL × CHECK_PING_MULTI에 의해 결정됩니다. 이는 연결 스레드가 백그라운드에서 일관되게 확인된다는 의미입니다(그러나 종료 조건을 충족하는 스레드가 없을 수 있음). 검사 빈도는 settings.py의 CHECK_CONFIG_INTERVAL에서 지정합니다

가 다른 값인 경우 검사 횟수가 가득 차면 검사를 중지한다는 의미입니다.

dry_run: 시험 실행 활성화 여부. 모드, 0은 실제 종료를 의미하고, 1 또는 다른 값은 시험 실행을 의미합니다. 시험 실행 모드를 사용하여 느린 쿼리를 모니터링하고 경고할 수 있습니다. 동일한 세션 스레드 ID는 한 번만 경고합니다.

run_time_window: 실행 중인 검사의 시간 창, 형식은 08:00-22:00입니다. 이 시간 외에는 검사가 실행되지 않으며 공백으로 두면 제한이 없음을 의미합니다. 주요 고려 사항은 야간 일부 통계 작업에서 "비정상적인" 스레드가 발생할 수 있다는 것입니다.

db_commkill

kill은 공개 구성을 사용하고 실시간으로 적용되며 id_ 섹션의 옵션으로 재정의됩니다.

k_user: 확인하고 삭제할 데이터베이스 사용자를 나타내는 매우 중요한 옵션입니다. 여러 사용자를 쉼표로 구분합니다(인용 부호 제외).
가 all이면 settings.py에서 DB_AUTH로 지정된 모든 사용자를 확인한다는 뜻이고,

가 없으면 비정상적인 스레드를 종료하지 않는다는 의미입니다.

k_longtime : 설정된 값을 초과하는 SQL 실행을 비정상으로 간주합니다. 일반적으로 CHECK_CONFIG_INTERVAL

k_sleep보다 큼: SQL 문이 설정된 초 이상 sleep하면 비정상으로 간주됩니다. 0이면 sleep 상태에서 스레드를 종료하지 않는다는 의미입니다.

k_exclude: 복사 스레드, 관리자 연결 등 특정 키워드가 있는 스레드를 제외합니다.

k_include: 이러한 특정 키워드가 포함된 스레드를 종료해야 합니다. k_user와 k_exclude가 충족된다는 전제에서 작동한다는 점에 유의하세요.
k_exclude 및 k_include 값은 python re 모듈을 지원하는 일반 형식입니다.

id_dbid

이 영역의 구성 항목은 사용하지 마세요. db_commconfig와 동일하며 개별 dbs 옵션을 종료하는 데 사용됩니다.

사용 제안

두 가지 조합 모드:

dry_run=0으로 설정, 기본값 k_user=none, 데이터베이스에서 예외가 발생하면 해당 k_user 값을 적극적으로 수정합니다. db, 동적으로 kill

dry_run=1로 설정, 기본값은 k_user=all이며 이는 데몬 모드에서 실행하는 것과 동일합니다. 쿼리가 느린 경우 이메일로 알림을 받게 되며 그에 대한 정보도 제공됩니다. 시간이 기록됩니다

물론 dry_run=0, k_user=all을 사용하여 프로그램을 백그라운드에서 실행하고 종료할 수도 있지만 프로덕션 환경에서는 권장하지 않습니다.

볼 수 있는 로그와 스냅샷 파일이 있습니다.

구성 파일 예

mysqlk.ini:

[mail_config]mail_host=smtp.exmail.qq.commail_user=xxx@ecqun.commail_pass=xxxxxxmail_receiver=[db_info]crm0 이 구성 파일이 변경된 후 종료 횟수; 0: 모든 종료를 비활성화합니다. 999: 종료 조건을 충족하는 스레드를 항상 종료합니다. 기본값: 1일 수 없습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.