MySQLがWaiting for query cache lockによるビジネスダウンタイムの処理を記録する

8420 ワード

午前10時、業務フィードバックサーバ502はアクセスできず、すべてのWEBサーバ、キャッシュ、データベースが接続可能であることを問い合わせる.しかし、MySQLクエリは一貫して詰まっていて、できるだけ早く業務を回復するために、直接データベース操作を再開して、この時業務は回復します.
原因を探し始める:1.mysqlエラーログを表示するには、このようにします.
2020-07-08 10:10:14 0 [Note] Event Scheduler: Killing the scheduler thread, thread id 7
2020-07-08 10:10:14 0 [Note] Event Scheduler: Waiting for the scheduler thread to reply
2020-07-08 10:10:14 0 [Note] InnoDB: FTS optimize thread exiting.
2020-07-08 10:10:16 0 [Note] Event Scheduler: Killing the scheduler thread, thread id 7
2020-07-08 10:10:16 0 [Note] Event Scheduler: Waiting for the scheduler thread to reply
2020-07-08 10:10:18 0 [Note] Event Scheduler: Killing the scheduler thread, thread id 7
2020-07-08 10:10:18 0 [Note] Event Scheduler: Waiting for the scheduler thread to reply
2020-07-08 10:10:20 0 [Note] Event Scheduler: Killing the scheduler thread, thread id 7

分析した結果は以上ではない
12時になってまた問題が発生し、今回は再起動前にshow processlistを問合せ、ファイルmysql-uroot-pxxxxx-N-e「show processlist」>/tmp/sp.log分析でエクスポートしたファイルをエクスポートしました
2       system user             NULL    Daemon  NULL    InnoDB purge coordinator        NULL    0.000
3       system user             NULL    Daemon  NULL    InnoDB purge worker     NULL    0.000
1       system user             NULL    Daemon  NULL    InnoDB purge worker     NULL    0.000
4       system user             NULL    Daemon  NULL    InnoDB purge worker     NULL    0.000
5       system user             NULL    Daemon  NULL    InnoDB shutdown handler NULL    0.000
7       event_schbseuler        localhost       NULL    Daemon  6470    Waiting for next activation     NULL    0.000
94      replication     192.168.0.174:39478     NULL    Binlog Dump     6453    Master has sent all binlog to slave; waiting for binlog to be updatbse  NULL    0.000
95      replication     192.168.0.149:49262     NULL    Binlog Dump     6453    Master has sent all binlog to slave; waiting for binlog to be updatbse  NULL    0.000
27798   bseu    192.168.0.173:37820     dbusercollege   Query   348     Sending data    SELECT `p`.`Id`, `p`.`CId`, `p`.`CName`, `p`.`CodeId`, `p`.`CreateTime`, `p`.`IsDeletbse`, `p`.`IsEdi   0.000
27925   bseu    192.168.0.158:60228     dbusercollege   Query   349     Waiting for query cache lock    UPDATE `article` SET `ArType` = 1, `AuthorId` = '', `AuthorName` = '  ', `AuthorPhoto` = '', `Co      0.000
27930   bseu    192.168.0.155:58588     dbusercollege   Query   268     Sending data    SELECT `a`.`Id`, `a`.`ArType`, `a`.`AuthorId`, `a`.`AuthorName`, `a`.`AuthorPhoto`, `a`.`Code`, `a`.    0.000
28589   bseu    192.168.0.173:40376     dbusercollege   Query   348     Sending data    SELECT `p`.`Id`, `p`.`CId`, `p`.`CName`, `p`.`CodeId`, `p`.`CreateTime`, `p`.`IsDeletbse`, `p`.`IsEdi   0.000
28779   bse     192.168.0.149:57342     bse     Query   398     Waiting for query cache lock    SELECT code,pcode FROM a_customer_relation      0.000
28780   bse     192.168.0.149:57344     bse     Sleep   398             NULL    0.000
28781   bse     192.168.0.149:57347     bse     Sleep   398             NULL    0.000
28782   bse     192.168.0.149:57346     bse     Sleep   398             NULL    0.000
28783   read    192.168.0.149:57350     dbuser  Query   398     Writing to net  SELECT cast((cr.`code`) as INT) as code,(CASE WHEN cr.`code`=7070 THEN 0 WHEN pcr.`code` IS NULL THE    0.000
28786   bsusr   192.168.0.160:34322     dbuser  Query   398     Update  INSERT INTO customer (level_up_time, create_time, identity_number, features, job, source, state, typ    0.000
28799   bsusr   192.168.0.173:48238     dbuser  Query   391     Waiting for query cache lock    INSERT INTO customer_product_browse (views, date_time, create_time, customer_id, org_id, shopkeeper_    0.000
28810   bsusr   192.168.0.173:48266     dbuser  Query   386     Waiting for query cache lock    DELETE FROM user_device WHERE channel = 'jPush' AND bindUser_id = 3092570 AND device_id = 'android_1    0.000
28825   bsusr   192.168.0.173:48294     dbuser  Query   378     Waiting for query cache lock    INSERT INTO customer_product_browse (views, date_time, create_time, customer_id, org_id, shopkeeper_    0.000
28830   bsusr   192.168.0.160:34430     dbuser  Query   377     Waiting for query cache lock    INSERT INTO customer_product_browse (views, date_time, create_time, customer_id, org_id, shopkeeper_    0.000
28831   bsusr   192.168.0.158:35156     dbuser  Query   376     Waiting for query cache lock    UPDATE shopkeeper SET shopkeeper_auth_time = 1594180592 WHERE id = 10539        0.000
28832   bsusr   192.168.0.173:48328     dbuser  Query   375     Waiting for query cache lock    UPDATE shopkeeper SET shopkeeper_auth_time = 1594180593 WHERE id = 36873        0.000
28844   bse     192.168.0.158:56890     bse     Execute 365     Waiting for query cache lock    INSERT INTO `t_shoping_cart` (`create_time` , `update_time` , `user_id` , `shop_id` , `product_id` ,    0.000
28855   bsusr   192.168.0.160:34482     dbuser  Query   360     Waiting for query cache lock    UPDATE shopkeeper SET shopkeeper_auth_time = 1594180608 WHERE id = 51318        0.000
28869   bsusr   192.168.0.173:48476     dbuser  Query   357     Waiting for query cache lock    UPDATE shopkeeper SET shopkeeper_auth_time = 1594180611 WHERE id = 52191        0.000
28872   bse     192.168.0.173:37620     bse     Execute 356     Waiting for query cache lock    INSERT INTO `t_shoping_cart` (`create_time` , `update_time` , `user_id` , `shop_id` , `product_id` ,    0.000
28874   bse     192.168.0.155:50136     bse     Execute 356     Waiting for query cache lock    INSERT INTO `t_shoping_cart` (`create_time` , `update_time` , `user_id` , `shop_id` , `product_id` ,    0.000

解析では多くのWaiting for query cache lockが現れ、検索して以下のように発見された.
1.query_Cacheのlockはグローバルなロックであり,書き込みと読み取りが同時に大きい場合,ボトルネックはこのロックにある.
Qcacheを開くと読み書きに余分な消費が発生します.a.リードクエリが開始する前にキャッシュにヒットしているかどうかを確認する必要があります.b.リードクエリがキャッシュできる場合は、ライトキャッシュc.ライトデータの実行が完了すると、関連するすべてのテーブルのキャッシュを失効に設定する必要があります.キャッシュが大きい場合は、消費も大きくなり、システムを硬直させることができます.この操作はグローバルロックによって保護されるため
innodbテーブルでは、テーブルを変更するとキャッシュが無効になりますが、マルチバージョンのプロパティでは、この変更が他のトランザクションに一時的にブロックされ、トランザクションがコミットされるまですべてのクエリーでキャッシュが使用できません.トランザクションがコミットされるまで、長時間のトランザクションではクエリー・キャッシュのヒット率が大幅に低下します.
クエリー・キャッシュはグローバル・ロックによって保護されるため、クエリーのキャッシュ領域を大きく設定することはできません.クエリー・キャッシュ構成のメモリが大きく、クエリーの結果が大量に格納されている場合、クエリー・キャッシュが試行されると、このグローバル・ロックは長時間保持されます.クエリー・キャッシュのヒット検出操作およびキャッシュの失効検出もこのグローバル・ロックに依存するため、システムが硬直する可能性があります.
結論:1.ビジネスによって大量に書かれたビジネスに対して、クエリーキャッシュ2を使用することを避ける.クエリー・キャッシュを使用しても、あまり大きく設定しないでください.
1.クエリー・キャッシュの使用状況を表示する場合
MariaDB [(none)]> show status like '%Qcache%';
+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Qcache_free_blocks      | 0      |          #         ,       ,  Qcache_lowmem_prunes    ,           ,     query_cache_min_res_unit  ,        flush query cache     (         ),
| Qcache_free_memory      | 0      |       #        
| Qcache_hits             | 420977 |          #        
| Qcache_inserts          | 69901  |         #       
| Qcache_lowmem_prunes    | 0      |   #             
| Qcache_not_cached       | 4374   |     # query_cache_type            
| Qcache_queries_in_cache | 0      |    #            
| Qcache_total_blocks     | 0      |         #       
+-------------------------+--------+

2.サーバのquery_の表示方法Cache構成
MariaDB [(none)]> show variables like '%query_cache%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| have_query_cache             | YES     |     
| query_cache_limit            | 8388608 |    #    query     ,        
| query_cache_min_res_unit     | 4096    |   #                   
| query_cache_size             | 0       |    #              ,   0,     1024    
| query_cache_strip_comments   | OFF     |
| query_cache_type             | ON      |  #           0(OFF)、1(ON)、2(DEMAND)
| query_cache_wlock_invalidate | OFF     | #                          Query Cache,      1(TRUE),                   Query Cache,     0(FALSE)                  Query Cache。
+------------------------------+---------+

最後に私の処理方法は次のとおりです.
set global query_cache_size=0;
プロファイルにquery_をコメントするcache_sizeこの行