ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MySQL启动失败 status=1/FAILURE 排查思路与解决指南

MySQL启动失败 status=1/FAILURE 排查思路与解决指南 1. 这个报错为什么值得重视status1只是引子不是病根先说句得罪人的话codeexited, status1/FAILURE这个报错本身几乎没有任何排查价值。它就像医院给你开的初诊单上写患者感觉不舒服一样除了告诉你MySQL确实没起来之外什么都没说。真正决定你能不能快速解决问题的是你接下来怎么去定位那个不舒服到底出在哪。我见过太多人卡在这个问题上的原因其实就是因为只盯着 systemd 给出的这一行状态反复systemctl start mysql、systemctl status mysql折腾半天也没头绪。因为status1只是 mysqld 进程启动失败后退出的通用返回码而 MySQL 启动过程中要经历读取配置文件、解析参数、初始化/校验数据目录、绑定端口、启动 InnoDB 引擎等多个阶段任何一步出了岔子最终落到 systemd 眼里都是同一个1。这也就意味着如果你不去看不该看的东西——也就是系统日志和 MySQL 的错误日志那你永远只能在外围打转。这篇文章我不会只丢给你一个执行这几条命令就好的速效方案那是对你不负责任。我会按我自己在线上环境排障时的思路从日志怎么看、常见失败分支怎么验证、到修复后怎么确认把status1背后的典型原因逐个拆开来讲并且会附上每一步操作背后的道理。无论是刚接触 Linux 下 MySQL 部署的新手还是被这个问题临时叫去救火的运维这篇文章都值得你花十分钟从头到尾看完。文章里涉及的所有操作默认环境是 CentOS 7/8 或 Ubuntu 18.04 上用 systemd 管理 mysqld 服务的场景发行版不同个别命令细节略有差异我会在对应位置单独说明MySQL 版本以 5.7 和 8.0 为主这两个版本踩坑点最密集也最有代表性。2. 从journalctl开始的排查链路三步锁定真正原因2.1 第一步别猜让 systemd 告诉你进程发生了什么当你执行systemctl start mysql看到Job for mysqld.service failed because the control process exited with error code时先压住想改配置的手按顺序执行下面三条命令systemctl status mysqld -l journalctl -u mysqld --no-pager -n 50 journalctl -u mysqld --no-pager -n 200 | grep -E ERROR|error|FAILED|failed|Cant|cannot|denied第一条命令里的-l参数非常关键很多人在网上贴 status 输出时因为没有加-l只看到被省略号截断的日志关键信息全丢了。我自己就吃过这个亏——有次排查一个从库起不来的问题前面几次看 status 都只显示到failed with result exit-code就没了加上-l之后才看到后面跟着一条完整的InnoDB: Unable to lock ./ibdata1, error: 11。第二条命令是把最近 50 行系统日志拉出来这是 mysqld 在启动过程中通过 systemd 打给标准输出的消息一般来说真正导致启动失败的那一行错误就在这 50 行里。第三条命令是在完整日志里做一次粗过滤把 ERROR 级别的内容先抓出来适合日志行数较多时快速定位。在实际操作中我建议你重点看两个时间点Started MySQL Server之前紧挨着的 5~10 行以及Main process exited, codeexited, status1之前那一段。真正报错的那一行往往就藏在这两个位置之间前后时间差通常只有几秒。2.2 第二步从 mysqld 自己的视角看问题——错误日志才是根因现场systemd 的 journal 只是把 mysqld 打到标准错误上的信息转发出来有些启动阶段更详细的错误mysqld 会直接写进自己的错误日志文件。这个文件的位置不同安装方式差的挺远用 yum/apt 安装的官方 RPM/DEB 包默认在/var/log/mysqld.log或/var/log/mysql/error.log二进制 tar 包解压部署的一般在数据目录下默认是/usr/local/mysql/data/机器名.err这里的机器名是你的 hostname如果你改了/etc/my.cnf里log_error参数那就以配置文件为准看错误日志比看 systemd 日志更接近真相因为这里记录的是 mysqld 进程内部初始化过程中打印的完整信息包括 InnoDB 初始化阶段、buffer pool 分配、redo log 创建、binlog 检查等步骤。比如 InnoDB 报Cannot create temporary file或者Permission denied这种错误只有在错误日志里才看得到完整的上下文。看错误日志时需要注意一点别只盯着最后的几行。MySQL 启动失败时错误日志里往往有一段完整的事故链最后几行只是表象真正的原因可能在前面的某一行就埋下了。举个很常见的例子日志最后几行是[ERROR] Aborting但往上翻几行你会看到[ERROR] InnoDB: Operating system error number 13 in a file operation这才是需要解决的根因Aborting只是 InnoDB 发现无法继续之后做出的最终决定。2.3 第三步看权限和上下文SELinux/AppArmor拿走最后一块遮羞布如果说前两步是排障的常规动作那第三步就是很多人容易忽略的盲区——安全上下文。特别是在 CentOS/RHEL 系列系统上SELinux 强制模式enforcing下MySQL 启动失败有相当高的比例是 SELinux 拦截导致的。判断是不是 SELinux 的问题最直接的方法是先看错误日志里有没有Permission denied字样然后用ausearch或grep查一下审计日志ausearch -m avc -ts recent | grep -E mysqld|mysql | tail -30如果能看到类似avc: denied { read } for pidxxxx namemy.cnf这样的记录那基本可以实锤是 SELinux 拦截。同样Ubuntu 系还要考虑 AppArmor查/var/log/syslog或dmesg里的apparmorDENIED记录。这第三步之所以重要是因为它的表现方式和普通权限问题几乎一模一样——都是Permission denied但修复方式截然不同。普通权限问题你chown或chmod就能解决SELinux 问题你改了半天文件权限也毫无变化。我之前就见过一个同事因为把 MySQL 数据目录挪到了/data/mysql下结果 mysqld 一直启动失败他反复检查了数据目录属主属组、甚至把目录权限放宽到了 777 都没用最后一看 SELinux 拦截原因是新位置的目录缺少mysqld_db_t上下文标签。这类问题处理起来不复杂执行restorecon -Rv /data/mysql就能给目录打上正确标签但想不到这一步的人会被折腾到怀疑人生。3. 最常见的高频症结之一数据目录的权限与初始化状态3.1 权限不对导致启动失败的完整现场先说权限问题这是我在各种环境里遇到次数最多的一种斗胆说一句新手在 MySQL 启动失败上踩的坑十个里面有四个是权限问题。MySQL 的 mysqld 进程在启动时会把自己切换为mysql用户运行该用户由安装包自动创建因此mysql用户必须对以下几类路径具有相应权限路径类型典型位置需要的权限说明数据目录/var/lib/mysql读写执行属主为 mysql存放所有库表数据错误日志文件/var/log/mysqld.log读写属主通常是 mysql且不能被其他用户随意写pid/socket 目录/var/run/mysqld读写执行用于存放 mysqld.pid 和 mysql.sock配置文件/etc/my.cnf读属主 root 即可mysql 用户可读就行排查权限问题时我最常用的命令是ls -ldn /var/lib/mysql ls -ldn /var/run/mysqld ls -ldn /var/log/mysqld.log ls -ldn /etc/my.cnf注意这里加了个-n参数作用是不做用户 ID 到用户名的转换直接显示数字 UID/GID这样看起来更直观。正常情况下/var/lib/mysql的属主应该是mysql:mysqlUID 和 GID 都是 27 左右不同发行版略有差异如果你看到属主是 root 或者其他用户那就可以直接定位问题了。修复权限的命令比较标准chown -R mysql:mysql /var/lib/mysql chown -R mysql:mysql /var/run/mysqld # 如果该目录存在 chown mysql:mysql /var/log/mysqld.log这里有个实操细节/var/run/mysqld这个目录比较特殊因为在某些发行版中它会被 systemd 的 tmpfiles.d 机制在每次启动时自动创建并设置权限但如果这个机制因为某些原因没生效mysqld 启动时会直接报Cant create/write to file /var/run/mysqld/mysqld.pid然后退出。这种情况下手工创建目录并设置属主就能解决mkdir -p /var/run/mysqld chown mysql:mysql /var/run/mysqld做完之后再执行启动大多数常规权限问题都能过掉。3.2 数据目录没初始化最容易忽略的第五步权限问题之外第二个高频原因是数据目录根本就是空的或者缺少系统库文件。很多人刚装完mysql-server软件包就直接systemctl start mysqld然后发现起不来一脸迷茫。实际上在 Debian/Ubuntu 系安装包通常会在 postinst 脚本里自动帮你初始化数据目录但 CentOS 系有时候要手动执行初始化特别是用二进制 tar 包部署的场景这一步百分之百要你手动来做。判断数据目录是否初始化过最直接的方法是看目录下有没有一个叫auto.cnf的文件以及mysql和sys这两个目录是否存在ls /var/lib/mysql/ | head -20如果空荡荡的或者只有lostfound那就说明还没初始化。初始化的命令在不同版本上不太一样MySQL 5.7mysqld --initialize-insecure --usermysql注意这里我用的是--initialize-insecure它表示初始化时不给 root 账号设置密码方便首次登录后再修改。如果你用默认的--initialize会在错误日志里生成一个临时初始密码操作会绕一些适合安全要求较高的环境。MySQL 8.0 同样推荐用--initialize-insecure或者是--initialize具体看你后续想怎么设置密码。但无论哪个版本有两个参数是必须带上的--usermysql指定以 mysql 用户身份初始化数据文件和--datadir如果数据目录不在默认位置必须显式指定否则它会按编译时的默认路径去找。初始化完成之后再确认一下数据目录的文件属主chown -R mysql:mysql /var/lib/mysql然后才能安心执行启动。这个初始化之后还要再确认一次属主的习惯是我在线上踩过坑才养成的——因为--initialize过程中创建的文件属主不一定是 mysql有时候会混入执行命令时的用户身份。3.3 迁移目录引发的权限与上下文组合坑如果你是因为磁盘空间不足把数据目录从/var/lib/mysql挪到了新分区比如/data/mysql那问题就变成一个组合题了。首先是数据目录权限必须改成mysql:mysql这步好说其次是 SELinux 上下文我前面提到的restorecon -Rv /data/mysql就是干这个的最后还有一点很多人想不到——/etc/my.cnf里的datadir参数改完之后如果目录路径中间有任何一节比如/data本身权限是 700 且属于其他用户mysqld 进程也会因为路径穿越访问不了。检查这层问题可以用namei -l /data/mysql它会从根目录开始逐级显示每一层路径的权限和属主。我遇到过最魔幻的一次是因为/data这个目录是被某个工单系统自动创建的属主是一个特殊服务账号权限是 700导致 mysql 用户根本走不进去而错误日志上只会显示Cant open the mysql.plugin table这种完全误导人的报错。这种路径中间层权限的问题不用 namei 逐层看很难发现。4. 配置层面的地雷my.cnf参数错误的典型现场4.1 参数值写错导致的连环报错链如果权限没问题、数据目录也初始化好了但启动依然失败那八成问题出在/etc/my.cnf或/etc/my.cnf.d/下的配置里。MySQL 启动时会按固定优先级读取这些配置文件如果你在某个文件里写入了非法参数或者非法的参数值启动过程就会直接中止。最常见的几种配置错误我按出现频率列一下datadir路径写错或末尾多带了空格导致 mysqld 去错误的目录找数据参数名拼写错误比如把innodb_buffer_pool_size写成了innodb_bufer_pool_sizeMySQL 会直接报Unknown variable并退出参数值单位写错比如innodb_buffer_pool_size 2G在 5.7 里是可以的但早年版本只接受2G或2147483648写成2GB就会解析失败socket路径和 pid 文件路径指向的目录不存在排查这类问题时我有两个习惯可以分享。第一个习惯是每次改完配置先在命令行验证一遍语法MySQL 从 5.7 开始提供了mysqld --validate-config这个参数MySQL 8.0 里依然有效它能只加载配置并检查参数合法性不真正启动服务mysqld --validate-config --usermysql如果配置里有问题这个命令会直接给出[ERROR]级别的提示省得你反复重启服务来回试。第二个习惯是在配置文件的每个主要修改处写清楚日期和原因特别是多人维护的机器这个习惯能帮你省掉很多这个参数是干嘛的的猜谜时间。如果你手头配置文件的片段比较多、涉及大量参数变更区分是哪个参数导致的问题可以用二进制搜索法先把配置文件的非默认部分全部注释掉确认 MySQL 能正常启动然后再一段一段放开注释每段放开后启动一次定位到具体是哪一小段配置引发的问题。这个方法看起来笨但在参数多的时候是最省时的方式。4.2 端口和socket被占用的冲突现场端口冲突这个问题听起来简单但在实际排查过程中经常会绕弯路因为它表现出来的错误信息跟你预期的不太一样。如果你在/etc/my.cnf里配置了port3306但系统上已经有另外一个 MySQL 实例或者其他程序占用了 3306mysqld 会报Bind on TCP/IP port got error: Address already in use这个还算直白。但某些情况下错误日志里显示的会是Cant start server: Bind on TCP/IP port: Address already in use而且日志里不会直接告诉你哪个进程占用了端口需要你自己去查。查端口占用最直接的方式ss -lntp | grep 3306 lsof -i:3306这里有个细节值得注意如果你在同一台机器上用二进制包部署了多个 MySQL 实例它们默认都会尝试绑定 3306第二个实例启动必然失败。这时候未必是有人占用而是你忘了给第二个实例指定不同的port和socket。多实例场景下每个实例都必须在 my.cnf 里显式区分三样东西port、socket、pid-file三样缺一样都会造成冲突。另外还有一个不太容易想到的方向——/tmp/mysql.sock或者其他 socket 路径下残留了旧的 socket 文件。mysqld 在正常关闭时会删除 socket 文件但如果进程被kill -9强杀socket 文件就会残留在磁盘上。下次启动时如果 MySQL 发现该路径已经有文件会报类似Bind on UNIX socket ... Address already in use的错误。这类情况处理起来很直接确认没有 MySQL 进程占用后手动删除残留的 socket 文件再启动即可。4.3 资源限制被忽略导致启动异常open files/内存不足还有一类配置层面的问题症状也是 startup 失败但根源在于系统层面而不是 MySQL 配置本身。最常见的是两个文件描述符限制open files limit和内存不足。open files limit不够的话MySQL 启动时可能需要在错误日志里建立新的 redo log、打开表文件如果文件描述符不够会看到Too many open files或Cannot open file ... error 24之类的错误。这个问题在 systemd 环境下尤其隐蔽因为你就算在/etc/security/limits.conf里写好了mysql soft nofile 65535也没用——systemd 管理的服务进程在启动时并不会读取 limits.conf它读取的是 service 文件里的LimitNOFILE设置。查看当前 systemd 对 mysqld 进程的资源限制用systemctl show mysqld | grep LimitNOFILE如果显示的值过小你需要编辑 service 文件或使用 drop-in 配置systemctl edit mysqld然后在打开的编辑器中加入[Service] LimitNOFILE65535 LimitNPROC65535保存后执行systemctl daemon-reload再重启服务才能生效。内存不足的问题表现得更隐蔽。mysqld 在启动阶段如果申请不到足够内存特别是 InnoDB buffer pool会直接崩溃错误日志里往往只留下一句Out of memory。这种场景下先看下还有没有内存余量free -h如果发现系统内存本来就很紧张可以临时把innodb_buffer_pool_size调小比如从默认的 128M 调到 64M试试能否启动等确认问题后再逐步调大。但注意 InnoDB buffer pool 在 MySQL 8.0 里默认是自动按物理内存比例分配的如果你机器内存本身不大还指望默认配置能顺滑启动那是想多了。5. 从InnoDB崩溃恢复到binlog异常存储引擎层面的失败模式5.1 InnoDB无法启动redo日志与表空间损坏的应对配置、权限、资源都排查完没问题依然status1的话就得把目光投向 MySQL 最核心的存储引擎 InnoDB 了。InnoDB 的启动过程本身就是一套复杂的恢复流程涉及 redo log重做日志、undo log、double write buffer、表空间等模块任何一个环节的数据异常都可能让 mysqld 在启动早期直接退出。最常见的 InnoDB 启动失败错误有这么几种InnoDB: Unable to lock ./ibdata1, error: 11几乎都是因为已经有一个 mysqld 进程占用了数据文件或者数据目录被 NFS/共享存储挂载时文件锁机制出问题。处理方式是先确认没有 mysqld 进程存活ps aux | grep mysqld必要时清掉残留进程后重启。InnoDB: Corrupted page或Database page corruption这是表空间数据页损坏可能由磁盘坏道、掉电、不正常的 kill -9 导致。这种问题处理起来要谨慎优先从备份恢复如果没有备份可以尝试innodb_force_recovery参数进入强制恢复模式。InnoDB: Cannot open file ./ibdata1要么文件丢失要么路径配置错误要么没有读权限。innodb_force_recovery这个参数在排障时救过我很多次但要会用不能乱用。它取值从 1 到 6数值越大越激进逐级允许 InnoDB 跳过不同类型的损坏检查取值跳过的检查适用场景1忽略损坏的 redo log 页启动时因 redo 日志问题退出2阻止回滚操作因 undo log 损坏导致无法回滚3跳过数据页恢复数据页校验失败时尝试导出数据4忽略 redo log 全部内容redo log 整体异常时用5跳过 undo log 扫描undo 表空间损坏时用6不做任何恢复动作最后手段可能丢失数据设置方法是在 my.cnf 里加一行[mysqld] innodb_force_recovery1设置后重启 mysqld验证能起来后要做的第一件事不是让业务正常跑而是立刻用mysqldump把能导出的数据全部导出来然后重建一个全新的数据目录导入备份。因为innodb_force_recovery运行模式下 InnoDB 只允许读操作且可能已经跳过关键恢复步骤绝对不能作为长期运行模式。5.2 binlog异常导致启动中止的坑binlog二进制日志是 MySQL 复制和数据恢复的重要依赖但它也会成为启动失败的元凶。典型报错有这两种一种是Cant find file ./binlog.index。binlog.index 文件记录了当前实例使用的所有 binlog 文件名列表如果这个文件被误删mysqld 启动时会直接退出。遇到这种情况在数据目录下创建一个空白的 binlog.index 文件并把权限改成 mysql:mysql通常能让服务先起来然后再考虑全量备份和重建 binlog。另一种更隐蔽Found binary log magic at offset ... but failed to verify。这是 binlog 文件本身损坏多因磁盘异常或强制断电导致。如果你配置了sync_binlog0默认偏性能取向断电时文件内容和文件系统元数据不一致的概率会明显上升。遇到这种问题处理方式是需要确认从哪个 binlog 文件开始损坏然后从损坏点之后的部分做截断或清理再启动服务同时做好从备份恢复的准备。这里我想特别提醒大家一件事binlog 相关的错误在 systemd 的 journal 日志里有时候只会显示一句很笼统的[ERROR] Aborting真正的 binlog 路径信息全在 mysqld 错误日志里所以遇到 InnoDB 或 binlog 相关问题时一定不要只看 journal必须要翻/var/log/mysqld.log或者其他 log_error 指定的文件。我见过有人对着 journal 里那行Main process exited, codeexited, status1纠结了很久其实旁边/var/log/mysqld.log里早就写清楚了具体是哪个 binlog 文件出问题。5.3 ibdata1 和临时表空间异常的边界情况和 binlog 类似的还有几个存储引擎层面的边界情况容易被忽略。例如ibdata1文件被误删或只剩 10M 初始大小或者临时表空间ibtmp1无法扩展都会让 mysqld 启动中止。ibtmp1这个文件存放的是磁盘临时表的数据如果/tmp所在分区满了或者tmpdir指向的目录空间不足启动时也会报错。遇到这类问题时有个通用的判断原则先确认数据目录所在分区的剩余空间df -h /var/lib/mysql如果空间使用率接近 100%那么 InnoDB 无法扩展新文件、binlog 无法写入、临时表空间无法增长这些都会直接导致启动失败。这种情况下优先清理磁盘空间而不是去 MySQL 配置里找问题。我处理过一台问题机器现象是 mysqld 启动后一直在初始化阶段打转最后报No space left on device但其实/var/lib/mysql所在分区早就被一堆大日志文件塞满了。清理完之后MySQL 什么都没改就正常启动了。6. 验证修复成果的完整清单不是能start就完事了6.1 三条必须执行的启动确认命令当你按照上面的排查路径解决了问题执行systemctl start mysqld返回成功之后很多人就直接收工了。但作为一个踩过坑的人我强烈建议你再做三个确认动作缺一个都可能让你在下一个拐角重新翻车。第一个确认动作是看进程稳态systemctl status mysqld -l ps -ef | grep mysqld注意看进程是否稳定存在status 输出里不能只是active (running)还需要确认进程启动时间不是几秒前反复重启后的假象。有些情况下mysqld 起了一下又因为别的问题退出systemd 会自动重启它导致你以为服务是稳定的其实它在反复崩溃。这种情况用systemctl status看一眼Active: active (running) since ...后面的时间就能判断。第二个确认动作是看错误日志尾部是否有新的 ERRORtail -20 /var/log/mysqld.log如果启动成功后日志尾部是ready for connections或mysqld: ready for connections.那基本可以放心了。注意这里有个小细节MySQL 5.7 打印的是mysqld: ready for connections而 MySQL 8.0 会在版本信息之外还打印一行X Protocol ready for connections不要被这行多出来的消息吓到这是正常的。第三个确认动作是实际登录验证mysql -uroot -p -e select version();这个命令的作用不只是验证能登录更重要的是验证 socket 连接、权限验证、系统库完整性这三个环节都正常。如果这里报ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/run/mysqld/mysqld.sock说明 socket 路径配置可能和你客户端默认连接的不一致需要你显式指定-S /path/to/mysqld.sock或者修改客户端的默认 socket 路径。6.2 上线前需做好的防复发准备问题解决了但不代表下次不会再来。这里分享几个我从实战里总结出来的防复发经验都是拿真金白银换来的。第一配置变更必须有记录。每次动my.cnf前把原文件备份一份命名带日期。这个习惯的收益在最开始几次可能看不出来但等到半年后你面对一个被改了十几次的配置文件而你需要搞清楚innodb_buffer_pool_size 到底是哪次变更调上来的时你会发现备份就是救命稻草。第二日志轮转必须配好。mysqld 的错误日志如果长期不轮转会膨胀到几个 GB到那时别说排障了连打开文件都费劲。systemd 环境下可以通过logrotate服务来管理确保/var/log/mysqld.log按天或按大小切割。我在生产环境见过最夸张的一次mysqld.log 涨到了 30 多 GB把一个 100G 的根分区直接撑爆服务当天夜里就挂了。第三systemd 的Restarton-failure要慎用。有些人在 service 文件里配置了Restartalways觉得这样服务挂了能自动拉起来。但对于需要人工介入才能解决的启动故障比如数据目录损坏自动重启只会让服务反复崩溃循环打满系统日志。我的习惯是对于 MySQL 这类有状态的数据库服务宁可配置Restarton-failure也绝对不要用Restartalways而且要配合StartLimitIntervalSec限制重启频率。第四如果你有监控系统建议把mysqld_process_alive和mysqld_error_log_error_count这两个指标加进去。前者是进程存活探针后者是在错误日志里持续扫描 ERROR 级别的日志条数。这两类指标的组合能让你在服务半死不活的情况下提前收到告警而不是等到用户报障才发现 MySQL 已经挂了十几个小时。7. 最后的提醒遇到status1时先冷静十秒再动手写完上面这么多技术细节之后我想再分享一个工作习惯层面的体会因为我发现很多时候启动失败本身并不可怕可怕的是在情绪驱动下的乱操作。当systemctl start mysqld第一次报出codeexited, status1/FAILURE时先冷静十秒。不要立刻去翻配置文件开始改不要凭记忆去 chown 数据目录更不要在一个论坛帖子和另一个论坛帖子的答案之间反复横跳。这十秒里你只需要做一件事把错误日志的关键行读一遍。systemctl status mysqld -l之后紧跟着的journalctl -u mysqld --no-pager -n 50这两条命令的输出包含了 80% 以上启动失败问题的直接线索。如果你把这两条命令的输出贴给任何一个有经验的 DBA 看他们大概率在三分钟之内就能告诉你问题出在哪个方向。而如果你自己只盯着status1这几个字那不管折腾多久都只是在浪费时间。第二件我想强调的事是这类型的启动失败没有一个银弹任何直接给你保证能解决的方案都要打问号。我能在这篇文章里做到的最有价值的事情就是教你把启动失败这个笼统的现象一步一步拆解成权限问题、配置问题、InnoDB 异常、资源限制这些可验证、可修复的具体问题分支。方向对了修复就是水到渠成的事情。最后再给读者一个小建议如果你手头正好有这类故障建议你在排障的过程中把每一步的命令输出都留个档尤其是journalctl和错误日志的关键片段。这些记录不只是给同事看也是给你自己积累经验用的。我自己整理过一份 MySQL 启动失败日志速查笔记每当遇到新的错误模式就往里补一行几年下来已经变成了一份非常实用的避坑手册。等你积累到一定程度会发现所谓资深不过就是见得多、记得住、能快速把现象和原因对应起来而已。
返回列表