ホームページ  >  記事  >  データベース  >  MySQL の低速クエリ スナップショット スクリプトを自動的に記録する

MySQL の低速クエリ スナップショット スクリプトを自動的に記録する

高洛峰
高洛峰オリジナル
2016-11-21 14:47:171186ブラウズ

このスクリプトを作成する本来の目的は、Alibaba Cloud RDS の使用中にデータベースで例外が発生し、迅速な回復が必要になるということです。インターネット上には同様の kill スクリプトが多数あり、すべて mysqladmin を通じて実装されています。ただし、Ali-RDS 環境には次の制限があります:

ユーザーに SUPER 権限を提供しない、つまり、ユーザーは自分のスレッドのみを強制終了できます

接続数が急激に増加すると、外部ユーザーはログインできなくなります。コンソール

午前 2 時の大きな問題を解決するために、この Python スクリプトは DB インスタンスでマルチスレッドを使用して各ユーザーの接続を予約し、kill 時にコマンド設定ファイル mysqk.ini を読み取ります。要件が見つかった場合、対応するユーザーの既存の接続を使用して、information_schema.processlist の条件を満たすスレッドが強制終了されます。

注: このスクリプトは 9 月に一度書き直されました。7 月のバージョン (ブランチ old_0.5.0) は、1 つの DB インスタンスに対応する 1 つのインスタンスごとにあります。そのため、常に確認するのが困難です。エレガントなので、複数のユーザーのセッションを同時に維持するために 1 つの DB インスタンスと 1 つのスレッドに変更されました。同時に、新バージョンでは、特定の接続を含むまたは除外する時間帯によるチェック、電子メール通知、構成項目のカバレッジなどの機能も追加されています。

機能

mysql pingを通じて常に長時間の接続を維持し、接続が利用できないという厄介な状況を解決するために切断後の自動再起動メカニズムを備えています

各データベースインスタンスには独自のスレッドがあり、個々のユーザーにログインする必要がありません別々に殺すための複雑な操作。 SUPER 権限を持っている場合は、構成を簡素化して互換性を持たせることもできます。

スレッドを個別に強制終了する必要があるシナリオに対処できるようにすることもできます。

N 秒を超えて長時間実行される

スリープ状態のトランザクション。 (通常は推奨されませんが、場合によっては強制終了し、管理者が使用するために接続をすぐに解放できます)

Binlog ダンプなど、強制終了できない一部のスレッドを除外します

特定のキーワードを含むスレッドを強制終了する必要がある場合

適格なスレッドの場合表示されると、現在のプロセスリスト、エンジンのステータス、lock_wait が表示されます スナップショットを作成し、メールで送信します

試運転用の dry_run モードがあり、すべてのチェックプロセスを実行しますが、実際には強制終了はしません

時間内のみの実行をサポートします一部の長いタスクが夜間にチェックされないことを考慮してウィンドウを作成します

パスワード暗号化

< ;!-- more -->

簡単に使用するには

MySQL-python および pycrypto ライブラリをインストールするために pip が必要です。テストのみが行われます。 Python 2.7上で。

settings.py で接続用のユーザー名とパスワード情報を設定します。ここでは、DB の同じバッチ内でチェックされる認証情報が同じであると仮定します。指定されたユーザーは、ログイン認証に使用され、チェックする必要があるユーザーをスクリプトに通知します。
パスワードは prpcryptec.py を通じて暗号化する必要があり、暗号化されたキーはスクリプト自体の KEY_DB_AUTH 変数に書き込む必要があります。 (リークが心配な場合は、mysqk.py を pyc にコンパイルして実行してください)

mysqk.ini メイン設定ファイルの

db_info セクションで、確認する必要があるデータベース アドレス (db01=10.0 など) を設定します。 200.100:3306

は個別に db01 にすることができます。スレッドを強制終了する必要があるオプションを指定するまで待ちます。 [id_db01] は、デフォルトで [db_commkill] のオプションを再利用します

db_comconfig セクションでは、db_puser をすべてのプロセスリストを表示できる権限を持つユーザーとして設定し、settings.py の DB_AUTH で指定されています

チェックのみを実行したいので、実際に例外を強制終了したくありません スレッド、dry_run が 0 に等しくないことを確認してください

それでは、開始します!

設定項目の説明

mysqk.ini:

mail_config

メール通知関連の設定、SMTP サービス アドレスと認証情報。
mail_receiver= 空に設定します。これは、メールが送信されないことを意味します

db_info

どのデータベース インスタンスをチェックして強制終了するかを設定します。
形式: ccba59bbdb8214500b1cca8a72093b37=f7e6dec31ab1a0471d06c55afaca8d77:298c9bd6ad6e8c821dc63aa0473d6209、dbid が唯一のものですこれは DB インスタンスを表し、その後に削除する各 DB のオプションを設定します。セクション構成名は id_ccba59bbdb8214500b1cca8a72093b37 です。ポートを指定する必要があります。

ここに表示される DB インスタンスはチェックされ、; でコメントできますが、スクリプトを再起動する必要があります。

db_comconfig

パブリック設定を確認し、リアルタイムで有効にします。

db_puser: show processlist のユーザー名を指定します。必要な権限: PROCESS、information_schema ライブラリの表示。異常なスレッドをチェックし、スレッドを強制終了する権限を持つユーザーに結果を提供する代表ユーザーとみなすことができます。

run_max_count: グローバル制御スイッチであるチェックを実行する回数。この値が変更されるたびにチェックが再開され、つまりクリーン スタートとなり、新しく変更された構成が有効になります。

は 0 です。これは、スクリプトがチェックを実行せず、単にデータベースへの接続を維持することを意味します。生存チェックの頻度は、settings.py の CHECK_CONFIG_INTERVAL × CHECK_PING_MULTI で決まります。

は 999 です。これは、接続スレッドがバックグラウンドで一貫してチェックされることを意味します (ただし、kill 条件を満たすものが存在しない可能性があります)。チェックは settings.py の CHECK_CONFIG_INTERVAL で指定されます。

は、チェック回数に達した後にチェックが停止されることを意味します。0 は、実際の強制終了を意味します。 1 またはその他の値は試行を意味します。試行モードを使用すると、遅いクエリを監視し、警告することができます。同じセッション スレッド ID は 1 回だけアラートを生成することに注意してください

run_time_window: 実行中のチェックの時間枠。形式は 08:00 ~ 22:00 です。この時間以外ではチェックは実行されません。空白のままにすると制限がないことを意味します。主な考慮事項は、夜間に一部の統計タスクで「異常な」スレッドが発生する可能性があることです。

db_commkill

kill はパブリック設定を使用し、リアルタイムで有効になり、id_ccba59bbdb8214500b1cca8a72093b37 セクションのオプションによってオーバーライドされます。

k_user: 非常に重要なオプションで、どのデータベース ユーザーをチェックして強制終了するかを指定します。複数のユーザーはカンマで区切られます (引用符は含めないでください)。
が all の場合、 settings.py の DB_AUTH で指定されたすべてのユーザーをチェックすることを意味します

が none の場合、異常なスレッドを強制終了しないことを意味します

k_longtime: SQL の実行の場合設定値を超えると異常とみなされます。一般に CHECK_CONFIG_INTERVAL より大きい

k_sleep: Sleep の SQL ステートメントが設定された秒数を超えた場合、異常とみなされます。0 の場合は、スリープ状態のスレッドを強制終了しないことを意味します。

k_exclude: 特定のキーワードを持つスレッドを除外します。

k_include: これらの特定のキーワードを含むスレッドは強制終了する必要があります。 k_user と k_exclude が満たされていることを前提として動作することに注意してください。

k_exclude と k_include の値は、Python re モジュールをサポートする通常の形式です。引用符は使用しないでください。

id_dbid

この領域の設定項目は、db_commconfig の kill オプションに使用されます。個々のデータベース。

使用方法の提案

2 つの組み合わせモード:

dry_run=0 を設定、デフォルトは k_user=none、データベースで例外が発生した場合、対応するデータベースの k_user 値をアクティブに変更し、動的に kill します

dry_run=1 を設定、デフォルトk_user=all 、これはデーモンモードで実行するのと同じです。遅いクエリがある場合はメールで通知され、その時点の情報が記録されます

もちろん、dry_run=0、k_user= も可能です。すべて、プログラムをバックグラウンドで実行して強制終了しますが、実稼働環境ではあまりお勧めできません。

表示するログとスナップショット ファイルがあります。

設定ファイルの例

mysqlk.ini:

[mail_config]mail_host=smtp.exmail.qq.commail_user=xxx@ecqun.commail_pass=xxxxxxmail_receiver=[db_info]crm0=192.168.1.125:3306crm1=192.168.1 .1 26: 3306crm2 =192.168.1.127:3306crm3=192.168.1.128:3306base=10.0.200.142:3306[db_commconfig]db_puser=ecuser; この設定ファイルが変更されたときのキル回数 0: すべてのキルを無効にします。条件; デフォルト: 1; 継承することはできませんrun_max_count=999dry_run=1


[mail_config]
mail_host=smtp.exmail.qq.com
mail_user=xxx@ecqun.com
mail_pass=xxxxxx

mail_receiver=

[db_info]
crm0=192.168.1.125:3306
crm1=192.168.1.126:3306
crm2=192.168.1.127:3306
crm3=192.168.1.128:3306
base=10.0.200.142:3306

[db_commconfig]
db_puser=ecuser

; how many kill times once this config file changed
; 0: DISABLE all kill
; 999: always kill threads that meet kill conditions
; default: 1
; can not be inherit
run_max_count=999
dry_run=1
run_time_window=08:00-22:00


[db_commkill]
k_user=all
k_longtime=10
k_lock=1
k_sleep=0

k_exclude=Binlog|ecdba|Daemon
k_include=select sleep\(17\)


[id_crm0]
; k_user: who&#39;s threads to be killed. use comma to separate
;         none: do not kill anyone&#39;s threads
;         all: kill all user&#39;s threads (with other where conditions)
; default: none
k_user=all

; k_longtime: filter the threads who&#39;s running time is longer than this
;             0: ignore the time > x  condition
; default: 10
k_longtime=10

; k_sleep: whether kill sleepd threads or not
;          0: do not kill command=&#39;Sleep&#39; threads from processlist
;          when it set to 1, usually it&#39;s subset of k_longtime condition
; default: 0
k_sleep=0

[id_crm1]
k_user=ecuser
k_longtime=10
k_sleep=0

[id_crm2]
k_user=all
k_longtime=10
k_sleep=0

[id_crm3]


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。