# RDS for MySQL长事务排查和处理
#### 什么是长事务？
事务中，当执行了DDL或者DML操作并且长时间没有提交的事务称为长事务。数据库中存在长事务会有如下影响：
- 耗尽IO资源。
- 单一长事务占用大量CPU。
- 长事务可能会占用大量的内存。
- 长事务会导致表膨胀。
- 长事务会锁定资源，通常伴随着MDL锁、行锁指标的升高，导致其他事务无法访问这些资源，降低数据库的并发性能。
- 长事务会导致日志文件增长，可能会导致日志文件过大，甚至导致磁盘打满。
 
#### 排查长事务
- 连接实例查看长事务及其会话ID。
  连接实例后，通过以下命令查看执行时间超过3000秒的事务的事务ID、执行的SQL以及对应的会话ID。
  ```
  mysql> SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query, trx_rows_modified FROM information_schema.innodb_trx WHERE TIME_TO_SEC(timediff(now(),trx_started)) >3000;
  ```
  表1字段说明 
  | 字段名              | 说明                                    |
  |:---|:---|
  | trx_id              | 事务ID。                                   |
  | trx_state           | 事务状态。包括RUNNING、LOCK WAIT、ROLLING BACK等。 |
  | trx_started      | 事务开始时间。                                |
  | trx_mysql_thread_id | 该事务所属的MySQL会话ID。                      |
  | trx_query          | 事务执行的SQL语句。                             |
  | trx_rows_modified  | 事务修改的行数。                              |
     
  
- 通过查看监控指标确认存在长事务。
  1. [登录RDS管理控制台](https://console.huaweicloud.com/rds/#/rds/management/list)。
  
  2. 单击管理控制台左上角的![](https://support.huaweicloud.com/bestpractice-rds-mysql/zh-cn_image_0000002572893510.png)，选择区域。
  
  3. 在"实例管理"页面，选择目标实例，单击操作列中的"查看监控指标"，进入监控指标概览页。
  
  4. 查看"长事务指标"（指标ID：rds_long_transaction），当该指标呈线性上升且时间较大时说明存在长事务。
   
 
#### kill长事务
1. 获取长事务对应的线程ID。 通过执行[•连接实例查看长事务及其会话ID。]中的SQL语句，获取执行时间超过某一时间（例如：3000秒）的事务对应的会话ID。
   ```
   mysql> SELECT trx_mysql_thread_id FROM information_schema.innodb_trx WHERE TIME_TO_SEC(timediff(now(),trx_started)) >3000;
   ```
   
2. 获取到会话ID后，通过**kill** 命令结束对应的事务。
   ```
   mysql> kill trx_mysql_thread_id;
   ```
   
![](https://support.huaweicloud.com/bestpractice-rds-mysql/public_sys-resources/notice_3.0-zh-cn.png)
kill长事务会导致事务回滚，请评估业务影响后执行。
#### 设置长事务告警
1. 查看已设置的告警。
   1. [登录CES管理控制台](https://console.huaweicloud.com/ces/?#/monitor/overview)。
   
   2. 单击管理控制台左上角的![](https://support.huaweicloud.com/bestpractice-rds-mysql/zh-cn_image_0000002603452659.png)，选择区域。
   
   3. 选择"告警 \> 告警规则"，查看已设置的告警。
      图1查看告警规则   
      ![](https://support.huaweicloud.com/bestpractice-rds-mysql/zh-cn_image_0000002264627445.png "点击放大") 
    
2. 设置长事务告警。
   1. [登录RDS管理控制台](https://console.huaweicloud.com/rds/#/rds/management/list)。
   
   2. 单击管理控制台左上角的![](https://support.huaweicloud.com/bestpractice-rds-mysql/zh-cn_image_0000002603572591.png)，选择区域。
   
   3. 在"实例管理"页面，选择目标实例，单击操作列中的"查看监控指标"，进入监控指标概览页。
   
   4. 查看"长事务指标"。
      图2查看监控指标   
      ![](https://support.huaweicloud.com/bestpractice-rds-mysql/zh-cn_image_0000002229548062.png "点击放大") 
   
   5. 单击"长事务指标"右上角的"+"，创建告警规则。
      图3长事务指标   
      ![](https://support.huaweicloud.com/bestpractice-rds-mysql/zh-cn_image_0000002229707906.png "点击放大") 
   
   6. 在"创建告警规则"界面，填选相关信息。具体参数说明请参见[创建告警规则和通知](https://support.huaweicloud.com/usermanual-ces/zh-cn_topic_0084572213.html)。
    
 
