【MySQL】windows系统下mysql慢日志查询

【MySQL】windows系统下mysql慢日志查询

一、找到 MySQL 配置文件

1. 确定配置文件位置

sql 复制代码
# 方法1:通过服务查找
sc qc MySQL  # 或 sc qc MySQL80(取决于版本)

# 方法2:通过 MySQL 命令行
mysql --help | findstr "my.ini"
# 或者
mysql --help | findstr "Default options"

2. 常见配置文件位置

sql 复制代码
# MySQL 5.7 及以下
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini

# MySQL 8.0
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

# 或者
C:\Windows\my.ini
C:\my.ini

二、配置慢查询日志(修改 my.ini)

bash 复制代码
[mysqld]
# 慢查询日志基础配置
slow_query_log = 1
slow_query_log_file = "C:/ProgramData/MySQL/MySQL Server 8.0/Data/slow.log"
long_query_time = 2  # 单位:秒,执行时间超过2秒的查询被记录

# 可选配置
log_queries_not_using_indexes = 1  # 记录未使用索引的查询
log_throttle_queries_not_using_indexes = 10  # 每分钟最多记录10个
log_output = FILE  # FILE, TABLE 或 FILE,TABLE

# 确保日志目录存在且有写入权限

三、重启 MySQL 服务

powershell 复制代码
# 以管理员身份打开 PowerShell

# 方法1:使用 services.msc 图形界面
services.msc

# 方法2:使用 PowerShell 命令
# 停止服务
Stop-Service MySQL80  # 或 MySQL57、MySQL

# 启动服务
Start-Service MySQL80

# 或者使用 net 命令
net stop MySQL80
net start MySQL80

# 或者使用 sc 命令
sc stop MySQL80
sc start MySQL80

四、验证配置是否生效

bash 复制代码
-- 在 MySQL 命令行中执行
-- 1. 查看慢查询配置
SHOW VARIABLES LIKE '%slow_query%';
SHOW VARIABLES LIKE '%long_query_time%';
SHOW VARIABLES LIKE '%log_queries_not_using_indexes%';

-- 示例输出应类似:
-- slow_query_log: ON
-- slow_query_log_file: C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log
-- long_query_time: 2.000000

-- 2. 临时修改配置(无需重启)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- 设置为1秒更容易触发
SET GLOBAL log_queries_not_using_indexes = 'ON';

五、创建测试慢查询

bash 复制代码
-- 1. 创建测试数据库和表
CREATE DATABASE IF NOT EXISTS test_slow;
USE test_slow;

-- 2. 创建测试表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100),
    age INT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_username (username)
);

-- 3. 插入大量测试数据(10万条)
DELIMITER $$
CREATE PROCEDURE generate_test_data()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= 100000 DO
        INSERT INTO users (username, email, age) 
        VALUES (
            CONCAT('user_', i),
            CONCAT('user', i, '@example.com'),
            FLOOR(RAND() * 100)
        );
        SET i = i + 1;
    END WHILE;
END$$
DELIMITER ;

CALL generate_test_data();
DROP PROCEDURE generate_test_data;

-- 4. 执行可能触发慢查询的语句

-- 未使用索引的查询
SELECT * FROM users WHERE email LIKE '%test%';

-- 复杂查询
SELECT u1.*, u2.* 
FROM users u1 
JOIN users u2 ON u1.id = u2.id 
WHERE u1.age > 50 
ORDER BY u1.created_at DESC 
LIMIT 1000;

-- 全表扫描
SELECT COUNT(*) FROM users WHERE age BETWEEN 20 AND 30;

-- 强制延迟(测试用)
SELECT SLEEP(3);  -- 等待3秒,肯定会记录

-- 创建大表连接
CREATE TABLE orders LIKE users;
INSERT INTO orders SELECT * FROM users LIMIT 50000;

-- 复杂连接查询
SELECT u.*, o.* 
FROM users u 
LEFT JOIN orders o ON u.id = o.id 
WHERE u.age > 40 
ORDER BY u.created_at 
LIMIT 5000;

六、查看慢查询日志

方法1:直接查看日志文件

bash 复制代码
# 打开 PowerShell
# 查看慢查询日志文件

# 查看最后100行
Get-Content "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log" -Tail 100

# 实时监控日志
Get-Content "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log" -Wait

# 或者使用 type 命令
type "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log" | more

# 使用 findstr 过滤
type "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log" | findstr "Query_time"

方法2:使用 MySQL 内置工具

bash 复制代码
# 进入 MySQL 的 bin 目录
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"

# 使用 mysqldumpslow 分析慢查询日志(需要 Perl)
# 如果没有 Perl,可以从 https://strawberryperl.com/ 安装

# 安装 Strawberry Perl 后
perl mysqldumpslow.pl -s t "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log"
perl mysqldumpslow.pl -s c "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log"

# 常用参数:
# -s t: 按查询时间排序
# -s c: 按出现次数排序
# -t 10: 只显示前10条

方法3:使用第三方工具分析

bash 复制代码
# 1. 下载 pt-query-digest(Percona Toolkit for Windows)
# https://www.percona.com/downloads/percona-toolkit/LATEST/

# 2. 使用 pt-query-digest
perl pt-query-digest.pl "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log"

# 3. 生成报告
perl pt-query-digest.pl "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log" > slow_report.txt

方法4:查询 mysql.slow_log 表

bash 复制代码
-- 如果 log_output 包含 TABLE,可以查询系统表
SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;

-- 详细分析
SELECT 
    start_time,
    query_time,
    lock_time,
    rows_sent,
    rows_examined,
    db,
    LEFT(sql_text, 200) AS query_preview
FROM mysql.slow_log 
WHERE start_time > DATE_SUB(NOW(), INTERVAL 1 HOUR)
ORDER BY query_time DESC
LIMIT 10;

-- 统计慢查询数量
SELECT 
    DATE(start_time) AS date,
    HOUR(start_time) AS hour,
    COUNT(*) AS slow_query_count,
    AVG(query_time) AS avg_query_time,
    MAX(query_time) AS max_query_time
FROM mysql.slow_log
GROUP BY DATE(start_time), HOUR(start_time)
ORDER BY date DESC, hour DESC;

七、使用 MySQL Workbench 图形界面

  1. 打开 MySQL Workbench

  2. 连接到你的 MySQL 服务器

  3. 查看慢查询日志:

    • 导航到 Management → Log Files → Slow Log
    • 点击 Refresh 查看日志内容
  4. 使用 Performance Dashboard:

    • Home → Performance → Dashboard
    • 查看 Slow Queries 部分

八、Windows 环境下自动化监控

创建 PowerShell 监控脚本

powershell 复制代码
# monitor_mysql_slow.ps1
$slowLogPath = "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log"
$alertThreshold = 5  # 每分钟超过5个慢查询报警

# 检查最近1分钟的慢查询数量
$slowCount = mysql -u root -p你的密码 -e "
    SELECT COUNT(*) 
    FROM mysql.slow_log 
    WHERE start_time > DATE_SUB(NOW(), INTERVAL 1 MINUTE)
" -s -N

if ([int]$slowCount -gt $alertThreshold) {
    # 发送邮件报警(需要配置邮件)
    $subject = "MySQL慢查询报警 - $slowCount 个慢查询/分钟"
    $body = "警告:过去1分钟发现 $slowCount 个慢查询!`n`n"
    
    # 获取最慢的查询
    $topSlow = mysql -u root -p你的密码 -e "
        SELECT 
            start_time,
            query_time,
            rows_examined,
            LEFT(sql_text, 200) as query_preview
        FROM mysql.slow_log 
        WHERE start_time > DATE_SUB(NOW(), INTERVAL 5 MINUTE)
        ORDER BY query_time DESC 
        LIMIT 5
    "
    
    $body += $topSlow
    Send-MailMessage -To "admin@example.com" -Subject $subject -Body $body -SmtpServer "smtp.example.com"
    
    # 写入Windows事件日志
    Write-EventLog -LogName Application -Source "MySQL Monitor" -EventId 1001 -EntryType Warning -Message "MySQL慢查询过多: $slowCount 次/分钟"
}

# 每天凌晨清理旧日志(可选)
$currentHour = Get-Date -Format "HH"
if ($currentHour -eq "00") {
    # 清空慢查询日志(先备份)
    $backupPath = "C:\MySQL_Logs\slow_backup_$(Get-Date -Format 'yyyyMMdd').log"
    Copy-Item $slowLogPath $backupPath
    "" | Out-File $slowLogPath -Encoding ASCII
}

创建 Windows 计划任务自动运行

bash 复制代码
# 创建计划任务
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\monitor_mysql_slow.ps1"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName "MySQL慢查询监控" -Action $action -Trigger $trigger -User "SYSTEM"

九、常见问题解决

问题1:权限不足

bash 复制代码
# 给日志文件添加权限
icacls "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log" /grant "NT SERVICE\MySQL80:(F)"

# 或者给整个目录权限
icacls "C:\ProgramData\MySQL\MySQL Server 8.0\Data" /grant "NT SERVICE\MySQL80:(OI)(CI)(F)"

问题2:日志文件过大

bash 复制代码
-- 定期清理慢查询日志
-- 方法1:清空文件
SET GLOBAL slow_query_log = 'OFF';
! del "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log"
SET GLOBAL slow_query_log = 'ON';

-- 方法2:使用 PURGE 命令(MySQL 5.6+)
PURGE BINARY LOGS BEFORE NOW();

问题3:看不到日志文件

bash 复制代码
# 检查MySQL错误日志
Get-Content "C:\ProgramData\MySQL\MySQL Server 8.0\Data\mysql_error.log" -Tail 50 | findstr "slow"

# 重新创建日志文件
# 1. 停止MySQL服务
net stop MySQL80

# 2. 创建空文件
New-Item "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log" -ItemType File -Force

# 3. 设置权限
icacls "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log" /grant "Everyone:(F)"

# 4. 启动服务
net start MySQL80

十、快速测试脚本

bash 复制代码
# quick_test_slowlog.ps1
Write-Host "=== MySQL慢查询日志测试 ===" -ForegroundColor Cyan

# 1. 检查服务状态
Write-Host "`n1. 检查MySQL服务状态..." -ForegroundColor Yellow
Get-Service MySQL80 | Format-List Status, Name, DisplayName

# 2. 检查配置文件
Write-Host "`n2. 检查配置文件..." -ForegroundColor Yellow
$configPath = "C:\ProgramData\MySQL\MySQL Server 8.0\my.ini"
if (Test-Path $configPath) {
    Get-Content $configPath | Select-String "slow_query"
} else {
    Write-Host "配置文件不存在: $configPath" -ForegroundColor Red
}

# 3. 执行测试查询
Write-Host "`n3. 执行测试慢查询..." -ForegroundColor Yellow
mysql -u root -p -e "
    SELECT NOW() as test_start;
    SELECT SLEEP(3) as forced_slow_query;
    SELECT NOW() as test_end;
"

# 4. 查看日志
Write-Host "`n4. 查看慢查询日志..." -ForegroundColor Yellow
$slowLog = "C:\ProgramData\MySQL\MySQL Server 8.0\Data\slow.log"
if (Test-Path $slowLog) {
    Get-Content $slowLog -Tail 20
} else {
    Write-Host "慢查询日志文件不存在: $slowLog" -ForegroundColor Red
}

Write-Host "`n=== 测试完成 ===" -ForegroundColor Green

这样你就可以在 Windows 环境下完整地验证 MySQL 慢查询日志了!

相关推荐
玉梅小洋44 分钟前
Windows 10 Android 构建配置指南
android·windows
雨中风华7 小时前
Linux, macOS系统实现远程目录访问(等同于windows平台xFsRedir软件的目录重定向)
linux·windows·macos
·云扬·7 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
筵陌9 小时前
MySQL索引及其底层原理(上)
mysql
怣509 小时前
MySQL子查询零基础入门教程:从小白到上手(零基础入门版)
数据库·mysql
yuuki2332339 小时前
【C++】继承
开发语言·c++·windows
非凡ghost10 小时前
PowerDirector安卓版(威力导演安卓版)
android·windows·学习·软件需求
猫头虎10 小时前
基于信创openEuler系统安装部署OpenTeleDB开源数据库的实战教程
数据库·redis·sql·mysql·开源·nosql·database
Nandeska10 小时前
17、MySQL InnoDB ReplicaSet
数据库·mysql
AI_567810 小时前
SQL性能优化全景指南:从量子执行计划到自适应索引的终极实践
数据库·人工智能·学习·adb