当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
SELECT
a.THREAD_OS_ID,
b.id,
b.USER,
b.HOST,
b.db,
b.PROCESSLIST_INFO,
b.INFO
FROM
PERFORMANCE_SCHEMA.THREADS a,
information_schema.PROCESSLIST b
WHERE
b.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
FROM
performance_schema.events_statements_current
WHERE
thread_id = (
SELECT
thread_id
FROM
performance_schema.threads
WHERE
thread_os_id = 10593
) ;
SELECT
a. USER,
a. HOST,
a.db,
b.thread_os_id,
b.thread_id,
a.id processlist_id,
a.command,
a.time,
a.state,
a.info
FROM
information_schema.PROCESSLIST a,
performance_schema.threads b
WHERE
a.id = b.processlist_id
AND b.thread_os_id = 10593;
返回外链论坛:www.fok120.com,查看更加多
责任编辑:网友投稿
|