亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL通過performance_schema定位未提交事務所執行的SQL

發布時間:2020-08-08 06:31:42 來源:ITPUB博客 閱讀:541 作者:神諭丶 欄目:MySQL數據庫
經常會遇到這樣一個場景:
業務那邊覺得數據庫“很慢”,上去通過show processlist查看發現大量State為在等待lock,如:
Waiting for table metadata/level lock等


比如在執行一個DDL時,發現被hang住,查看到目前進程狀態,有MDL

  1. mysql> SHOW PROCESSLIST;
  2. +-----+------+-----------+------+---------+------+---------------------------------+--------------------------------------------+
  3. | Id  | User | Host      | db   | Command | Time | State                           | Info                                       |
  4. +-----+------+-----------+------+---------+------+---------------------------------+--------------------------------------------+
  5. | 585 | root | localhost | test | Sleep   | 1658 |                                 | NULL                                       |
  6. | 586 | root | localhost | test | Query   | 1654 | Waiting for table metadata lock | alter table t change name name varchar(32) |
  7. | 590 | root | localhost | test | Query   | 0    | starting                        | show processlist                           |
  8. +-----+------+-----------+------+---------+------+---------------------------------+--------------------------------------------+
  9. 3 rows in set (0.00 sec)

在實驗環境里,我們很快就能定位到,應該是id為585這個線程,但是無法知道正在執行什么sql:
通過information_schema.innodb_trx\G,也不能查詢到具體執行了什么sql。
通過簡單的kill的確可以解決眼前的問題,但如果繼續遇到該問題,也難以定位具體內容。


但其實,performance_schema.events_statements_current提供了相關信息,此處復現一下:

  1. session1> BEGIN;
  2. Query OK, 0 rows affected (0.00 sec)

  3. session1> UPDATE t SET name='fasdfsad';
  4. Query OK, 3 rows affected (0.00 sec)
  5. Rows matched: 3 Changed: 3 Warnings: 0


  1. session2> ALTER TABLE t CHANGE name name varchar(32)
發現被hang住


查看一下是否有事務未提交,可以發現的確有:
該事務內的語句執行完畢(處于Sleep),但未提交,就會看不到對應的trx_query:

  1. session3> SELECT * FROM information_schema.innodb_trx\G
  2. *************************** 1. row ***************************
  3.                     trx_id: 9614
  4.                  trx_state: RUNNING
  5.                trx_started: 2017-09-19 15:58:05
  6.      trx_requested_lock_id: NULL
  7.           trx_wait_started: NULL
  8.                 trx_weight: 2
  9.        trx_mysql_thread_id: 585
  10.                  trx_query: NULL
  11.        trx_operation_state: NULL
  12.          trx_tables_in_use: 0
  13.          trx_tables_locked: 1
  14.           trx_lock_structs: 2
  15.      trx_lock_memory_bytes: 1136
  16.            trx_rows_locked: 4
  17.          trx_rows_modified: 0
  18.    trx_concurrency_tickets: 0
  19.        trx_isolation_level: REPEATABLE READ
  20.          trx_unique_checks: 1
  21.     trx_foreign_key_checks: 1
  22. trx_last_foreign_key_error: NULL
  23.  trx_adaptive_hash_latched: 0
  24.  trx_adaptive_hash_timeout: 0
  25.           trx_is_read_only: 0
  26. trx_autocommit_non_locking: 0
  27. 1 row in set (0.00 sec)


只能根據trx_mysql_thread_id看到未提交的事務的process id,看一下processlist,INFO內也沒有具體內容:


  1. session3> SHOW PROCESSLIST;
  2. +-----+------+-----------+------+---------+------+---------------------------------+--------------------------------------------+
  3. | Id  | User | Host      | db   | Command | Time | State                           | Info                                       |
  4. +-----+------+-----------+------+---------+------+---------------------------------+--------------------------------------------+
  5. | 585 | root | localhost | test | Sleep   | 42   |                                 | NULL                                       |
  6. | 586 | root | localhost | test | Query   | 37   | Waiting for table metadata lock | ALTER TABLE t CHANGE name name varchar(32) |
  7. | 590 | root | localhost | test | Query   | 0    | starting                        | SHOW PROCESSLIST                           |
  8. +-----+------+-----------+------+---------+------+---------------------------------+--------------------------------------------+
  9. 3 rows in set (0.00 sec)


但只要打開了P_S,就可以通過performance_schema.events_statements_current來查看到對應的sql,包括已經執行完,但沒有提交的。

  1. session3> SELECT sql_text FROM performance_schema.events_statements_current;
  2. +-------------------------------------------------------------------+
  3. | sql_text                                                          |
  4. +-------------------------------------------------------------------+
  5. | UPDATE t SET name='fasdfsad'                                      |
  6. | ALTER TABLE t CHANGE name name varchar(32)                        |
  7. | select sql_text from performance_schema.events_statements_current |
  8. +-------------------------------------------------------------------+
  9. 3 rows in set (0.00 sec)
當然,在復雜的生產環境中,光憑上面的語句查出來的信息,是遠遠不夠的。

通過如下語句,可以擴展show processlist的顯示結果,并提供對應的SQL。

  1. SELECT b.processlist_id, c.db, a.sql_text, c.command, c.time, c.state
  2. FROM performance_schema.events_statements_current a JOIN performance_schema.threads b USING(thread_id)
  3. JOIN information_schema.processlist c ON b.processlist_id = c.id
  4. WHERE a.sql_text NOT LIKE '%performance%';

結果:
  1. +----------------+------+--------------------------------------------+---------+------+---------------------------------+
  2. | processlist_id | db   | sql_text                                   | command | time | state                           |
  3. +----------------+------+--------------------------------------------+---------+------+---------------------------------+
  4. | 585            | test | UPDATE t SET name='fasdfsad'               | Sleep   | 243  |                                 |
  5. | 586            | test | ALTER TABLE t CHANGE name name varchar(32) | Query   | 238  | Waiting for table metadata lock |
  6. +----------------+------+--------------------------------------------+---------+------+---------------------------------+
  7. 2 rows in set (0.01 sec)
也可以很容易定位到執行的內容是做了一個update操作未提交。


作者微信公眾號(持續更新)
MySQL通過performance_schema定位未提交事務所執行的SQL

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富裕县| 剑河县| 青阳县| 喀喇沁旗| 大连市| 罗甸县| 庐江县| 仁怀市| 武乡县| 寿阳县| 大兴区| 宁城县| 英超| 双流县| 连州市| 龙口市| 南阳市| 集安市| 泾源县| 蒲江县| 冀州市| 太保市| 鱼台县| 政和县| 吉木乃县| 湘阴县| 兴城市| 炎陵县| 黎城县| 新干县| 苗栗县| 通化市| 偃师市| 姜堰市| 华安县| 周口市| 监利县| 高要市| 柯坪县| 兴仁县| 郴州市|