当MySQL数据库的CPU使用率异常升高时,定位导致问题的SQL语句可以通过以下步骤进行:
1. **使用`top`或`pidstat`命令**:
首先,可以通过`top -H -p <mysqld进程id>`或者`pidstat -t -p <mysqld进程id> 1 5`命令来确定哪个线程占用了大量的CPU资源。
2. **查询`performance_schema`或`information_schema`**:
使用以下SQL语句可以查询到具体的线程信息,包括其操作系统线程ID(`THREAD_OS_ID`)和正在执行的SQL语句:
```sql
SELECTa.THREAD_OS_ID,b.id,b.USER,b.HOST,b.db,b.PROCESSLIST_INFO,b.INFOFROMPERFORMANCE_SCHEMA.THREADS a,information_schema.PROCESSLIST bWHEREb.id = a.processlist_id AND a.THREAD_OS_ID = <具体线程id>;
```
其中 `<具体线程id>` 是从步骤1中获取的线程ID。
3. **分析慢查询日志**:
开启MySQL的慢查询日志,分析执行时间过长的SQL语句。可以通过以下命令查看慢查询日志的配置:
```sql
SHOW VARIABLES LIKE 'slow_query_log%';
```
然后使用`explain`分析慢查询日志中记录的SQL语句,找出可能的性能瓶颈。
4. **使用`SHOW PROCESSLIST`命令**:
登录到MySQL服务器,使用`SHOW FULL PROCESSLIST;`命令查看当前正在执行的所有线程,包括它们的状态和执行时间。这有助于识别长时间运行的查询。
5. **使用`SHOW PROFILE`或`SHOW PROFILES`**:
对于短时间执行但CPU使用率高的SQL,可以使用`SHOW PROFILE`或`SHOW PROFILES`来获取SQL语句的详细性能数据。
6. **检查`information_schema`中的`processlist`表**:
通过以下命令查询`processlist`表,找到CPU使用率高的线程:
```sql
SELECT * FROM performance_schema.threads WHERE thread_os_id = '1';
```
这将显示与特定操作系统线程ID相关联的MySQL线程的详细信息。
7. **使用通用日志记录**:
如果需要,可以开启MySQL的通用日志记录功能,记录所有执行的SQL语句,以便进行分析:
```sql
SET GLOBAL log_output='TABLE';
SET GLOBAL general_log=ON;
```
然后通过查询`mysql.general_log`表来查看日志记录的SQL语句。
通过这些步骤,你可以定位到导致CPU使用率高的SQL语句,并进一步分析和优化它们以降低资源消耗。
下面使用方案二来演示定位SQL
1:top查看

2:top -Hp 42977

3: 带入下面的脚本
SELECT*FROMperformance_schema.events_statements_currentWHEREthread_id = (SELECTthread_idFROMperformance_schema.threadsWHEREthread_os_id = 10593) ;

SELECTa. USER,a. HOST,a.db,b.thread_os_id,b.thread_id,a.id processlist_id,a.command,a.time,a.state,a.infoFROMinformation_schema.PROCESSLIST a,performance_schema.threads bWHEREa.id = b.processlist_idAND b.thread_os_id = 10593;




