MySQL基础运维:日志基础之慢查询日志与错误日志 | 作用、配置与查看方法全实战
本文承接MySQL运维系列内容聚焦新手入门运维最刚需的两大核心日志错误日志、慢查询日志。很多新手学习MySQL时都会遇到两个最头疼的问题一是MySQL启动失败、运行报错完全不知道去哪找原因二是SQL执行越来越慢不知道哪条SQL拖垮了性能无从下手优化。而解决这两个问题的核心钥匙就是MySQL的日志。错误日志是MySQL排障的第一入口所有启动、运行、关闭的错误信息都会记录在这里90%的MySQL启动失败、运行异常都能通过它1分钟定位原因慢查询日志是SQL性能优化的核心工具会自动记录所有执行超时的SQL帮你精准找到拖慢系统的“坏SQL”是优化的第一手资料。本文完全面向零基础新手沿用系列统一的edu_shop电商库、edu_student学生管理库场景用通俗的大白话、可直接复制的标准代码、真实业务排障实战带你从零掌握两大日志的核心作用、配置方法、查看技巧、排障优化全流程看完就能直接落地解决实际问题。【前置必读】本文所有示例基于MySQL 8.0 LTS版本完全兼容MySQL 5.7所有命令均经过实测可直接复制执行日志配置、查看分为两类操作会明确标注执行环境MySQL客户端内执行Navicat、DBeaver、mysql 命令行界面操作系统终端执行Windows CMD/PowerShell、Linux Shell终端所有配置、查看操作均需要MySQL root超级管理员权限。导言先搞懂MySQL日志的核心价值很多新手对MySQL日志的认知是“没用的日志文件占磁盘空间”但实际上日志是MySQL的“黑匣子”记录了MySQL从启动、运行到关闭的全生命周期行为是排障、优化、审计的核心依据。MySQL的日志体系分为6大类新手入门优先吃透本文的2种核心日志即可其他日志后续会逐步讲解错误日志Error Log本文核心记录MySQL启动、运行、关闭过程中的错误、警告、关键事件是排障的第一入口慢查询日志Slow Query Log本文核心记录执行时间超过阈值的SQL语句是SQL性能优化的核心工具二进制日志Binlog记录所有数据修改操作用于数据恢复、主从复制之前备份恢复文章已涉及重做日志Redo LogInnoDB引擎事务日志用于崩溃恢复保证数据持久性回滚日志Undo LogInnoDB引擎事务日志用于事务回滚、MVCC多版本控制通用查询日志General Log记录所有客户端的连接和执行的SQL语句日志量极大生产环境默认关闭。一、错误日志MySQL排障的第一入口错误日志是MySQL最核心的排障日志没有之一。它就像MySQL的“病历本”记录了MySQL从启动、运行到关闭的所有异常信息、警告信息和关键生命周期事件90%的MySQL启动失败、运行异常问题都能通过错误日志1分钟定位根因。1. 错误日志的核心作用新手必须记住只要MySQL启动失败、运行异常闪退、执行命令报错第一时间就去看错误日志。它核心记录3类内容启动/关闭过程的关键信息MySQL启动时的配置加载、端口监听、存储引擎初始化、关闭时的资源释放过程错误信息启动失败、运行时的致命错误比如端口被占用、数据文件损坏、权限不足、内存溢出等警告信息非致命的风险提示比如配置参数不兼容、密码过期、连接数超限等提前规避潜在风险。2. 第一步找到错误日志的存储路径新手最常见的问题“我知道错误日志有用但我不知道它在哪”。一条命令就能精准定位日志路径在MySQL客户端内执行-- 查看错误日志配置核心看log_error的值就是错误日志的完整路径SHOWVARIABLESLIKElog_error%;执行结果解读变量名示例值含义log_error/var/log/mysqld.logLinuxD:\MySQL\log\mysqld.errWindows错误日志的完整存储路径文件名log_error_verbosity3日志详细级别1-只记录错误 2-错误警告 3-错误警告信息默认不同系统的默认路径Linux系统默认路径通常是/var/log/mysqld.log或/var/lib/mysql/主机名.errWindows系统默认在MySQL安装目录的data文件夹下文件名是主机名.err。3. 错误日志的开启与配置错误日志默认是开启的无需手动开启MySQL启动时就会自动生成并写入。如果需要自定义日志路径、调整日志级别通过修改MySQL配置文件实现永久生效。配置方法永久生效找到MySQL的配置文件Linux系统/etc/my.cnf或/etc/mysql/my.cnfWindows系统MySQL安装目录下的my.ini在配置文件的[mysqld]节点下添加/修改以下配置[mysqld] # 自定义错误日志存储路径Linux示例 log_error /var/log/mysql/mysqld.err # Windows示例 # log_error D:\MySQL\log\mysqld.err # 日志详细级别默认3即可兼顾信息完整度和日志大小 log_error_verbosity 3保存配置文件重启MySQL服务生效Linuxsystemctl restart mysqldWindows在服务面板重启MySQL服务注意自定义日志路径的文件夹必须提前创建且给MySQL运行用户授予读写权限否则MySQL会启动失败。4. 错误日志的查看方法新手可直接复制错误日志是纯文本文件根据操作系统选择对应的查看方式核心是过滤ERROR级别的错误信息快速定位问题。场景1Linux系统查看最常用生产环境通用在Linux终端执行核心用tail实时查看、grep过滤错误信息新手记住以下3条命令即可覆盖90%的场景# 1. 实时查看日志最新内容排查启动失败、实时报错最常用按CtrlC退出tail-f/var/log/mysqld.log# 2. 查看日志最后100行快速看最近的报错tail-n100/var/log/mysqld.log# 3. 过滤所有ERROR级别的错误信息精准定位问题最核心grep-iERROR/var/log/mysqld.log# 4. 过滤指定时间段的错误信息比如2024-06-01的报错grep-iERROR/var/log/mysqld.log|grep2024-06-01场景2Windows系统查看找到错误日志文件.err后缀用记事本、Notepad、VS Code等文本编辑器直接打开用编辑器的查找功能搜索ERROR关键词快速定位错误信息实时查看可以用PowerShell的Get-Content命令# Windows PowerShell实时查看错误日志对应Linux的tail -fGet-ContentD:\MySQL\log\mysqld.err-Wait-Tail 1005. 新手实战用错误日志解决2个最常见的问题实战1MySQL启动失败1分钟定位根因问题现象Linux系统重启MySQL服务失败systemctl start mysqld执行后提示启动失败完全不知道哪里出了问题。排障步骤执行命令查看错误日志的ERROR信息grep-iERROR/var/log/mysqld.log|tail-n20查看报错结果常见的3种报错与解决方案报错1Cant start server: Bind on TCP/IP port: Address already in use根因3306端口被其他程序占用MySQL无法监听端口解决方案执行netstat -tulpn | grep 3306查看占用端口的程序关闭占用程序或修改MySQL端口后重启。报错2Permission denied根因MySQL数据目录、日志目录的权限不对MySQL运行用户没有读写权限解决方案给目录授予权限执行chown -R mysql:mysql /var/lib/mysql/重启服务。报错3unknown variable xxxxxx根因my.cnf配置文件里有错误的参数MySQL无法识别解决方案删除配置文件里的错误参数保存后重启服务。实战2MySQL运行警告提前规避风险问题现象MySQL能正常启动但客户端连接时提示警告或者业务偶尔出现连接超时。排障步骤过滤错误日志中的WARNING警告信息grep-iWARNING/var/log/mysqld.log|tail-n20常见警告与解决方案警告1Too many connections根因连接数超过了MySQL的最大连接数限制新的连接被拒绝解决方案修改配置文件的max_connections参数调大最大连接数同时检查业务是否有连接未释放的问题。警告2Your password has expired根因用户密码过期MySQL 8.0默认密码有有效期解决方案登录MySQL执行ALTER USER 用户名主机地址 IDENTIFIED BY 密码 PASSWORD EXPIRE NEVER;关闭密码过期。6. 错误日志使用避坑指南绝对不要直接删除正在写入的错误日志文件Linux系统中直接删除正在被MySQL写入的日志文件会导致磁盘空间无法释放正确做法是先清空日志 /var/log/mysqld.log或用日志轮转工具切割定期归档清理日志错误日志会持续增长尤其是开启了详细级别后建议配置logrotateLinux自动切割、归档、删除过期日志避免占满磁盘空间生产环境不要关闭错误日志哪怕MySQL运行稳定也不要关闭错误日志它是异常排障的唯一依据关闭后出现问题将无据可查排障优先看最新的日志错误日志是按时间顺序写入的最新的报错在日志末尾优先看最后几十行的内容避免被历史报错干扰。二、慢查询日志SQL性能优化的核心工具慢查询日志是MySQL专门用来记录“执行慢的SQL”的日志它会按照你设置的时间阈值自动记录所有执行超时的SQL语句帮你精准定位拖垮数据库性能的“坏SQL”是SQL优化的第一步也是最核心的一步。很多新手遇到数据库变慢只会盲目加索引、升级服务器却不知道到底是哪条SQL慢、慢在哪里而慢查询日志就是帮你找到优化目标的“导航仪”。1. 慢查询日志的核心作用精准定位慢SQL自动记录所有执行时间超过阈值的SQL不用你手动一条条排查还原执行上下文记录SQL的执行时间、锁等待时间、扫描行数、返回行数帮你分析SQL慢的根因性能优化的依据通过分析慢日志找到高频慢SQL针对性优化是数据库性能调优最核心的依据业务风险预警通过慢日志的变化提前发现业务代码的bug、索引失效、数据量暴涨带来的性能问题。2. 慢查询日志核心配置参数新手必记慢查询日志默认是关闭的需要手动开启核心配置参数如下所有参数均可通过SHOW VARIABLES LIKE slow_query%;查看当前配置参数名作用推荐配置值slow_query_log慢查询日志的开关ON-开启 OFF-关闭测试/生产环境均设为ONslow_query_log_file慢查询日志的完整存储路径文件名Linux/var/log/mysql/slow.logWindowsD:\MySQL\log\slow.loglong_query_time慢查询阈值单位秒SQL执行时间超过这个值就会被记录生产环境推荐1测试环境推荐0.5最小可设为0log_queries_not_using_indexes是否记录没用到索引的SQL哪怕执行时间没超过阈值测试环境推荐ON生产环境按需开启会增加日志量log_throttle_queries_not_using_indexes限制每分钟记录的无索引SQL数量避免日志暴涨生产环境开启后设为60min_examined_row_limit扫描行数少于这个值的SQL不记录到慢日志过滤无意义的小表查询推荐10003. 慢查询日志的开启与配置分为**临时配置重启失效适合测试和永久配置重启不失效生产环境推荐**两种方式。方式1临时配置MySQL重启后失效适合测试环境快速开启验证在MySQL客户端内执行-- 1. 开启慢查询日志SETGLOBALslow_query_logON;-- 2. 设置慢查询阈值为1秒执行时间超过1秒的SQL会被记录SETGLOBALlong_query_time1;-- 3. 开启记录未使用索引的SQLSETGLOBALlog_queries_not_using_indexesON;-- 4. 限制每分钟无索引SQL的记录数量避免日志暴涨SETGLOBALlog_throttle_queries_not_using_indexes60;-- 验证配置是否生效SHOWVARIABLESLIKEslow_query%;SHOWVARIABLESLIKElong_query_time;注意设置long_query_time后需要重新打开MySQL客户端会话才会生效当前会话不会立即生效。方式2永久配置重启不失效生产环境推荐修改MySQL配置文件永久生效避免重启后配置丢失。打开MySQL配置文件Linux/etc/my.cnf、Windowsmy.ini在[mysqld]节点下添加以下配置[mysqld] # 开启慢查询日志 slow_query_log ON # 慢查询日志存储路径提前创建文件夹并授予MySQL读写权限 slow_query_log_file /var/log/mysql/slow.log # Windows示例 # slow_query_log_file D:\MySQL\log\slow.log # 慢查询阈值1秒 long_query_time 1 # 记录未使用索引的SQL log_queries_not_using_indexes ON # 限制每分钟无索引SQL的记录数量 log_throttle_queries_not_using_indexes 60 # 扫描行数少于1000的SQL不记录过滤小表查询 min_examined_row_limit 1000保存配置文件重启MySQL服务生效systemctl restart mysqldLinux、Windows服务面板重启。4. 慢查询日志的查看与分析方法慢查询日志是纯文本文件里面记录了每一条慢SQL的完整执行信息新手可以先手动查看理解格式再用官方工具批量分析。第一步理解慢查询日志的格式我们先模拟一条慢SQL看慢日志里记录了什么内容在MySQL客户端执行-- 模拟慢SQL休眠3秒一定会被记录到慢日志SELECTSLEEP(3);-- 用大表查询模拟真实慢SQL基于之前的学生管理库SELECT*FROMedu_studentWHEREaddressLIKE%北京市%;打开慢日志文件会看到如下格式的内容每一部分都有明确的含义# Time: 2024-06-01T10:00:00.123456Z -- SQL执行的时间 # UserHost: root[root] localhost [] -- 执行SQL的用户和客户端地址 # Query_time: 3.000215 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 -- 核心指标 -- Query_timeSQL总执行时间单位秒就是我们的慢查询阈值判断依据 -- Lock_time锁等待时间单位秒 -- Rows_sent返回给客户端的行数 -- Rows_examinedMySQL扫描的总行数扫描行数远大于返回行数说明需要加索引 SET timestamp1717236000; -- SQL执行的时间戳 SELECT SLEEP(3); -- 执行的慢SQL语句新手核心看3个指标Query_timeSQL执行时间越长说明越慢是优化的核心目标Rows_examined和Rows_sent的差值扫描行数远大于返回行数说明SQL没有用到索引全表扫描了大量数据是优化的重点Lock_time锁等待时间过长说明有事务锁冲突需要排查并发写操作。第二步手动查看慢日志新手入门和错误日志的查看方法一致在操作系统终端执行# Linux实时查看慢日志最新内容tail-f/var/log/mysql/slow.log# Linux查看日志最后50条慢SQLtail-n200/var/log/mysql/slow.log# Windows PowerShell实时查看Get-ContentD:\MySQL\log\slow.log-Wait-Tail100第三步用官方工具批量分析慢日志生产环境必备慢日志里的SQL数量多了之后手动查看根本不现实MySQL自带了mysqldumpslow慢日志分析工具无需额外安装能快速对慢SQL进行分类、排序、统计是新手分析慢日志的首选工具。1. 核心语法mysqldumpslow[参数]慢日志文件路径2. 新手必学的常用参数参数作用-s t按SQL总执行时间排序默认找最慢的SQL-s c按SQL执行次数排序找高频执行的慢SQL-s l按锁等待时间排序找锁冲突严重的SQL-s r按扫描行数排序找全表扫描最严重的SQL-t N只显示前N条结果-g 关键词过滤包含指定关键词的SQL3. 实战常用命令可直接复制# 1. 查看执行时间最慢的前10条SQL最常用mysqldumpslow-st-t10/var/log/mysql/slow.log# 2. 查看执行次数最多的前10条高频慢SQLmysqldumpslow-sc-t10/var/log/mysql/slow.log# 3. 查看扫描行数最多的前10条SQL找全表扫描的坏SQLmysqldumpslow-sr-t10/var/log/mysql/slow.log# 4. 过滤包含edu_order订单表的慢SQLmysqldumpslow-gedu_order/var/log/mysql/slow.log4. 分析结果解读执行命令后会返回分类统计后的结果示例如下Count: 5 Time2.56s (12.8s) Lock0.00s Rows100.0 (500), root[root]localhost SELECT * FROM edu_order WHERE user_id N;Count:5这条SQL一共执行了5次Time2.56s (12.8s)单次平均执行时间2.56秒总执行时间12.8秒Rows100.0 (500)单次平均返回100行总返回500行Nmysqldumpslow会把数字、字符串自动替换为N把相同模板的SQL合并统计避免重复。5. 新手实战慢查询日志从开启到优化的完整闭环我们用之前的电商库edu_shop走一遍完整的慢查询优化流程新手可以跟着同步操作。步骤1开启慢查询日志设置阈值0.5秒-- 临时开启慢查询SETGLOBALslow_query_logON;SETGLOBALlong_query_time0.5;SETGLOBALlog_queries_not_using_indexesON;-- 重新打开客户端会话确认配置生效SHOWVARIABLESLIKEslow_query_log;步骤2模拟业务慢SQL-- 1. 全表扫描查询北京市的用户无索引执行慢SELECT*FROMedu_userWHEREaddressLIKE%北京市%;-- 2. 联表查询用户的订单无合适索引SELECTu.username,o.order_no,o.pay_amount,o.create_timeFROMedu_user uLEFTJOINedu_order_main oONu.user_ido.user_idWHEREu.province广东省;-- 3. 统计订单金额无索引SELECTSUM(pay_amount)FROMedu_order_mainWHEREcreate_timeBETWEEN2024-05-01AND2024-06-01;步骤3用mysqldumpslow分析慢日志# 查看执行时间最慢的前5条SQLmysqldumpslow-st-t5/var/log/mysql/slow.log步骤4根据分析结果优化SQL根据慢日志的Rows_examined指标发现3条SQL都是全表扫描没有用到索引针对性添加索引-- 1. 给用户表的省份字段加索引ALTERTABLEedu_userADDINDEXidx_province(province);-- 2. 给订单表的user_id加索引联表字段必须加索引ALTERTABLEedu_order_mainADDINDEXidx_user_id(user_id);-- 3. 给订单表的创建时间加索引ALTERTABLEedu_order_mainADDINDEXidx_create_time(create_time);步骤5验证优化效果重新执行之前的SQL查看执行时间会发现执行时间从几秒降到了几毫秒不再出现在慢查询日志中优化完成。6. 慢查询日志使用避坑指南生产环境不要把long_query_time设为0会记录所有执行的SQL导致日志文件暴涨很快占满磁盘空间生产环境最小设为0.1秒推荐1秒生产环境开启log_queries_not_using_indexes要谨慎如果有大量小表全表查询会导致日志量暴增建议配合log_throttle_queries_not_using_indexes限制记录数量定期归档清理慢日志慢日志会持续增长建议配置logrotate自动切割归档避免占满磁盘不要直接在生产环境用文本编辑器打开大的慢日志文件几个G的日志文件直接打开会导致服务器卡顿用mysqldumpslow工具分析即可慢日志分析要关注高频慢SQL而不是单次最慢的SQL一条单次执行10秒的SQL对系统的影响远不如一条每次执行0.5秒、每分钟执行1000次的高频慢SQL优化优先看执行次数多的SQL。三、生产环境日志管理最佳实践统一日志存储路径把错误日志、慢查询日志、binlog都放在统一的日志目录下不要分散在数据目录方便管理、备份和权限控制配置日志自动轮转Linux系统用logrotate工具Windows系统用定时任务自动切割、压缩、归档、删除过期日志避免日志文件过大、占满磁盘空间定期分析日志每周至少分析一次慢查询日志优化高频慢SQL每天巡检错误日志提前发现潜在的风险警告不要等出了问题才去看日志日志权限管控日志文件只能给MySQL运行用户和root用户读写权限禁止其他用户访问避免日志中的敏感信息SQL、用户信息泄露测试环境和生产环境配置一致测试环境开启慢查询日志阈值设得更低在测试阶段就发现并优化慢SQL不要等到生产环境出了性能问题才优化。四、新手高频报错与解决方案1. 开启慢查询日志后slow_query_log还是OFF原因慢日志路径的文件夹不存在或者MySQL没有读写权限导致开启失败。解决方案手动创建日志文件夹比如mkdir -p /var/log/mysql/给文件夹授予MySQL权限chown -R mysql:mysql /var/log/mysql/重新执行开启命令或重启MySQL服务。2. 设置了long_query_time1但所有SQL都不被记录原因设置GLOBAL参数后当前会话不会生效需要重新打开MySQL客户端会话或者SQL执行时间确实没有超过阈值。解决方案重新打开Navicat、mysql命令行等客户端重新执行SQL或用SELECT SLEEP(2);模拟慢SQL验证。3. 错误日志里没有内容启动失败也看不到报错原因自定义了错误日志路径但文件夹不存在或权限不对MySQL无法写入日志只能把报错输出到系统日志。解决方案Linux查看系统日志/var/log/messages或journalctl -u mysqld找到启动失败的原因Windows查看系统事件查看器里的MySQL错误信息修复日志路径的权限和文件夹重启MySQL服务。4. mysqldumpslow命令执行提示“未找到命令”原因MySQL的bin目录没有添加到系统环境变量和之前mysqldump命令的问题一致。解决方案进入MySQL安装目录的bin文件夹下执行命令把MySQL的bin目录添加到系统环境变量永久生效。结语错误日志和慢查询日志是MySQL新手入门运维的两大核心工具一个帮你解决“MySQL能不能跑起来”的问题一个帮你解决“MySQL跑得快不快”的问题。很多新手觉得运维很难其实绝大多数的数据库问题都能通过这两个日志找到答案。不用追求复杂的监控工具先把这两个基础日志吃透养成“出问题先看日志优化先看慢查询”的习惯你的MySQL运维能力就已经超过了80%的新手。需要我给你一份Linux系统的logrotate日志轮转配置模板自动切割错误日志和慢查询日志避免磁盘占满吗加粗样式
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2461333.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!