【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 慢查询日志了!

相关推荐
私人珍藏库1 小时前
[Windows] 隐写者 SteganographierGUI 1.3.8
windows·pc·工具·软件
weixin_387002151 小时前
二次开发的openssl在windows平台的编译
linux·windows·安全·ssl
叽里咕噜怪1 小时前
MySQL-读写分离实验
数据库·mysql
霸王大陆1 小时前
《零基础学PHP:从入门到实战》教程-模块七:MySQL 数据库基础-3
数据库·mysql·php
AL流云。2 小时前
MySQL安装【Centos, Ubuntu, Windows】
mysql·ubuntu·centos
菜鸟小九2 小时前
mysql运维(主从复制)
android·运维·mysql
eguid_12 小时前
【软件分享】简单的Windows无线电视投屏软件simpleTVCast,支持桌面镜像投屏和视频投屏
windows·电视投屏·音视频投屏·镜像投屏·桌面镜像投屏
zwm_yy2 小时前
mysql安全优化
数据库·mysql·adb
周杰伦_Jay2 小时前
【MySQL】核心特性+实操教程(含SQL命令+表格对比+优化技巧)
sql·mysql