MySQL root 密码忘了怎么办这个问题在我这些年的技术支持记录里出现的频率大概仅次于“数据库连不上”。它不分场景、不分经验年限新手会踩老手换了台久未登录的测试机照样会踩。真正麻烦的地方不在于改密码这个动作本身而在于不同安装方式、不同操作系统、不同版本之间进入免密模式的方法完全不一样网上抄来的命令十有八九在你机器上跑不通。这篇就把 Windows、Linux、macOS、Docker 四条线全部走一遍讲清楚每一步在做什么、为什么这么做、哪里最容易翻车。适合谁看手上有一台 MySQL 但 root 密码进不去的开发者、运维、测试同学也适合刚接手一台历史遗留数据库、连配置文件都不敢乱改的新手。我会把底层原理、版本差异、真实报错都对上你照着操作基本能一次通实在不通也能在第 7 节的排查表里找到对应条目。1. 重置之前先把“忘密码”这件事拆开看1.1 三种典型场景与各自的处理边界密码进不去看似同一个症状实际至少分三种情况处理策略差得很远。第一种是你自己刚装的实例密码记混了或输错了。这种最省事机器上通常没有业务数据实在不行初始化重装比折腾重置更快。第二种是别人装的实例你接手维护。这时你要先确认一件事这个实例有没有别的可用账号比如某个业务账号、监控账号有足够权限能直接ALTER USER改 root 密码。如果有根本不需要停机免密一条 SQL 就结束了这是最优先尝试的路线。第三种是生产或类生产环境唯一超管账号进不去且不能重启。这种最麻烦也最需要谨慎。你要评估停机窗口、主从关系、连接池的自动重连行为以及应用侧是否有硬编码的超管连接。我见过不止一次有人为了改个密码把主库重启了结果从库延迟告警、定时任务重复触发问题比密码本身严重得多。注意重置 root 密码本质上是一次“绕过认证”的操作理论上任何能物理接触这台机器的人都能做。所以这件事本身就是一个安全信号——重置完成后请务必把第 8 节里的加固动作做掉别改完密码就撒手。还有一种容易忽略的边界云托管数据库。这类实例通常不给你服务器登录权限也没有配置文件可改重置只能走控制台的“重置密码”入口。本文讲的是自建实例托管环境请直接看服务商文档别在服务器上瞎找 mysqld 路径。1.2 动手前必须确认的四项信息我建议你在敲任何命令之前先把这四项信息查清楚能省掉至少一半的返工。第一MySQL 的版本。5.7 和 8.0 在改密码语法、认证插件、免密模式行为上都有差异8.4 又砍掉了一些老插件。版本号决定了你后面用哪套 SQL。第二安装方式。系统包管理器装的apt、yum、brew、官方压缩包解压的、官方安装程序装的三种方式的配置文件位置、服务单元名称、数据目录路径全都不同。Windows 上尤其明显官方安装程序装出来是 Windows 服务叫MySQL80压缩包版本则是自己在命令行跑mysqld.exe。第三配置文件的位置。MySQL 会按固定顺序读多个位置的配置文件最后读到的覆盖前面的。Linux 上常见的/etc/my.cnf、/etc/mysql/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf都在候选列表里。不确定就用mysqld --verbose --help | head -30看它实际读了哪些。第四数据目录的属主和权限。这一条最容易被跳过也最容易导致后面莫名其妙起不来。数据目录必须属于运行 mysqld 的那个系统用户通常是mysql。你要是用 root 直接跑mysqld很容易把新建的日志文件、临时文件搞成 root 属主下次正常启动时服务切到mysql用户就没法写了于是启动失败而你还在怀疑密码改错了。需要确认的信息Windows 查看方式Linux 查看方式macOS 查看方式版本号服务属性里的可执行文件路径mysqld --versionbrew info mysql服务名sc query type servicesystemctl list-units | grep mysqlbrew services list配置文件安装目录下my.inimysqld --verbose --help/opt/homebrew/etc/my.cnf数据目录属主资源管理器看安全选项卡ls -ld /var/lib/mysqlls -ld /opt/homebrew/var/mysql2. 免密模式的底层原理skip-grant-tables 到底跳过了什么2.1 权限校验链路与权限表加载顺序要理解重置为什么能成得先知道 MySQL 是怎么验证一个连接的。客户端连上来服务端先看来源 IP 和用户名去内存里的权限缓存匹配账号握手阶段校验认证字符串密码哈希认证通过后再逐层检查这个账号对目标库、表、列有没有权限。这套权限数据存在mysql系统库的几张表里服务启动时会把这些表读进内存形成一张权限缓存。关键点在于服务启动时如果带上--skip-grant-tables它压根不会去读那几张权限表内存里的权限缓存是空的于是任何账号、任何密码都能连进来且拥有全部权限。这就是重置的物理基础。它同时会隐式开启--skip-networking也就是不监听 TCP 端口——因为一个谁都能连、权限全开的实例暴露在网络上等于把门拆了。所以你用免密模式启动后普通客户端用-h 127.0.0.1是连不上的必须走本机 socket 或命名管道。这也解释了那个几乎人人都撞过的报错ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement。因为在免密模式下权限表没加载ALTER USER这类需要读写权限表的语句被直接拦下了。解决办法是执行一次FLUSH PRIVILEGES它会强制重新加载权限表之后ALTER USER才能生效。很多人卡在这里以为方法不对其实只差这一行。还有一个细节值得说清楚FLUSH PRIVILEGES在免密模式下重新加载权限表之后当前连接依然保留全权限但新连接开始按真实权限校验。这意味着你改完密码后当前会话还能继续操作别被这个假象骗了改完就老老实实重启服务恢复正常模式。2.2 三条重置路线对比与选型建议实际可用的路线有三条各有适用场景我按推荐度排一下。第一条临时加--skip-grant-tables参数启动。最通用四个平台都能用也是本文主线。缺点是免密窗口期长短取决于你手速期间实例处于完全不设防状态所以一定要配合--skip-networking或者干脆断网操作。第二条--init-file预置 SQL。在启动参数里指定一个 SQL 文件服务启动过程中自动执行它。文件里就写一句ALTER USER。好处是免密窗口几乎为零——服务起来时密码已经改好了你可以直接正常连。缺点是对文件权限要求严格文件必须是 mysqld 运行用户可读、且不能对其他用户开放否则服务会拒绝启动并报错。这条路线我强烈推荐用在稍微正式一点的环境。第三条直接改系统表。用UPDATE mysql.user SET authentication_string...硬改。5.7 时代这是主流8.0 之后我基本不推荐了因为 8.0 的密码哈希算法变了你不能自己拼一个字符串塞进去必须调用服务端的函数算哈希绕了一圈还是得回到前两条路线。方案停机免密暴露窗口难度推荐场景skip-grant-tables需要数十秒到数分钟低本地开发、测试机--init-file需要接近零中类生产、多人共用的机器改系统表需要中等高版本坑多老版本 5.7 及以下用其他高权限账号改不需要无低有可用备用账号时首选3. Windows 环境从停服务到恢复正常登录3.1 停服务、找安装路径、跳过权限校验启动Windows 上的第一步永远是确认 MySQL 是以服务形式跑的还是命令行手动跑的。绝大多数官方安装程序装出来都是服务。用管理员权限打开 PowerShell 或 CMD先看服务名sc query type service state all | findstr /i mysql看到SERVICE_NAME: MySQL80这类输出就说明是服务模式。停掉它net stop MySQL80如果提示有依赖服务或者停不掉去服务管理器里看依赖关系通常是某些监控代理或者应用服务在占用。别硬杀进程taskkill掉 mysqld 有可能留下未完成的崩溃恢复下次启动要多花几分钟甚至要人工介入。接下来找安装目录。在服务属性里看“可执行文件的路径”能直接拿到mysqld.exe的完整位置比如D:\mysql-8.0.36-winx64\bin\mysqld.exe。这一步很关键因为压缩包版本没有注册服务你必须用全路径启动而且路径里有空格的话必须加引号否则命令行解析会出错。然后以管理员身份启动免密模式D:\mysql-8.0.36-winx64\bin\mysqld.exe --console --skip-grant-tables --shared-memory这里的--shared-memory是 Windows 专属的关键参数。前面说过--skip-grant-tables会隐式禁用 TCP 监听Windows 上没有了 TCP客户端要么走命名管道要么走共享内存。共享内存方式最省事加上这个参数客户端用--shared-memory就能连。--console的作用是把日志直接打到当前窗口方便你确认服务是不是真的起来了——看到类似ready for connections的输出才算成功。注意这个窗口不能关一关 mysqld 就退出了。改密码的操作要另开一个命令行窗口做。这是新手最常犯的错关掉窗口再去连报连接失败然后以为参数写错了。3.2 改密码的两种语法与 MySQL 8 的强制刷新另开一个管理员窗口用共享内存方式连接D:\mysql-8.0.36-winx64\bin\mysql.exe -uroot --shared-memory连上之后不管三七二十一先执行FLUSH PRIVILEGESFLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY N3wPss_2024;这两句在 MySQL 5.7.6 以上和 8.x 都适用。如果你在 5.7 的老版本上ALTER USER可能不被支持那就退回老语法FLUSH PRIVILEGES; UPDATE mysql.user SET authentication_string PASSWORD(N3wPss_2024) WHERE User root AND Host localhost; FLUSH PRIVILEGES;注意PASSWORD()函数在 MySQL 8.0 里已经被移除了8.0 上跑这句会直接报函数不存在所以版本一定要先确认。另外如果你改了rootlocalhost但应用是从别的机器连过来的还得检查有没有root%这个账号两个都得改否则改完本机能进、远程还是进不去。密码设置上有两个坑。一是 8.0 默认装了validate_password组件密码太简单会报ERROR 1819要求长度、大小写、数字、特殊字符。临时绕开的办法是先把它调低改完再调回来SET GLOBAL validate_password.policy LOW;二是 8.0 默认认证插件是caching_sha2_password一些老的客户端库、老版本的图形化工具不认这个插件连上来会报Authentication plugin caching_sha2_password cannot be loaded。如果确实有老客户端要连可以把这个账号改回老插件ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY N3wPss_2024;改完密码回到那个--console窗口CtrlC 停掉 mysqld然后正常启动服务net start MySQL80再用新密码连一次能进就算完事。连不上别急着重置第二遍先去看数据目录下的.err错误日志八成是权限或者配置的问题第 7 节有对照表。4. Linux 环境systemd 与 mysqld_safe 两套打法4.1 临时改配置法最稳适合生产以外的机器Linux 上我更倾向于改配置文件而不是命令行传参原因是 systemd 管的服务对命令行参数的支持不够直观而且改配置文件的方式可回滚、可复查出问题了一眼能看出来改了什么。先停服务sudo systemctl stop mysqld配置文件位置先用mysqld --verbose --help | head -40确认Debian 系一般在/etc/mysql/mysql.conf.d/mysqld.cnfRHEL 系在/etc/my.cnf。在[mysqld]段落下加一行[mysqld] skip-grant-tables skip-networkingskip-networking这里显式写上虽然skip-grant-tables会隐式开启但写出来是给自己看的也是给后来接手的人看的明确表达“我知道这段时间实例不该被远程访问”。然后启动并连进去sudo systemctl start mysqld sudo mysql -uroot注意这里用sudo mysql走的是本机 socket 认证不需要密码。连上之后同样先FLUSH PRIVILEGES再改密码。改完把配置里那两行删掉或者注释掉重启服务验证新密码。这条路线有个变体用 systemd 的环境变量注入不改文件sudo systemctl set-environment MYSQLD_OPTS--skip-grant-tables --skip-networking sudo systemctl start mysqld # 改完密码后 sudo systemctl unset-environment MYSQLD_OPTS sudo systemctl restart mysqld我一般不用这个变体因为set-environment设的东西容易忘忘了清掉下次重启还是免密模式那就是个定时炸弹。改文件虽然土但肉眼可见。Ubuntu 上还有一个专属坑默认安装的 MySQLroot 账号用的是auth_socket插件意思是“系统用户是 root 就能以 root 身份免密登录 MySQL”。这种情况下你根本没密码可忘sudo mysql直接就能进。真要用密码登录得把插件换掉ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY N3wPss_2024;很多人不知道这个机制一顿操作猛如虎其实一开始sudo mysql就能解决。4.2 --init-file 法把免密窗口压到最短正式一点的环境我推荐这条路。思路是不开启免密模式而是让 mysqld 在启动过程中读取一个 SQL 文件文件里就一句改密码的语句。先写文件。注意两点一是用引号包住 EOF 防止变量被 shell 展开二是文件权限必须是 mysqld 运行用户可读、其他人不可读否则 MySQL 会拒绝执行sudo tee /tmp/mysql-init.sql /dev/null EOF ALTER USER rootlocalhost IDENTIFIED BY N3wPss_2024; EOF sudo chown mysql:mysql /tmp/mysql-init.sql sudo chmod 600 /tmp/mysql-init.sql然后带--init-file启动。如果你是用 systemd 管的直接跑 mysqld 可能和已有服务打架稳妥的做法是先把服务停掉然后在前台跑一次sudo systemctl stop mysqld sudo -u mysql mysqld --defaults-file/etc/my.cnf --init-file/tmp/mysql-init.sql --console看到ready for connections之后另开终端用新密码验证一下mysql -uroot -pN3wPss_2024 -e SELECT user, host, plugin FROM mysql.user;能查出来就说明密码已经生效了。这时候 CtrlC 停掉前台进程删掉临时 SQL 文件用 systemctl 正常启动服务。整个过程免密窗口为零因为 mysqld 一起床密码就已经是新密码了。注意--init-file里的语句如果执行失败mysqld 是起不来的错误会打到终端或者错误日志里。最常见的失败原因是文件权限不对、语句里账号的 host 部分和实际存在的账号对不上、或者新密码触发了密码强度校验。还有个小细节--defaults-file一定要放在命令行参数的第一位MySQL 对参数顺序有要求放后面会被忽略导致读错配置文件。这个坑我踩过查了半天才发现是参数位置问题。5. macOS 环境Homebrew 与官方安装包的两条路径5.1 目录与 socket 路径差异macOS 上的麻烦主要来自安装方式的分裂。用 Homebrew 装的Apple Silicon 机器上在/opt/homebrewIntel 机器上在/usr/local用官方 DMG 装的数据目录在/usr/local/mysql/data配置在/etc/my.cnf或/usr/local/mysql/etc/my.cnf。你抄网上的命令跑不通九成是路径没对上。先定位。Homebrew 装的话brew services list brew --prefix第一条能看到 mysql 服务的状态和确切名字可能是mysql也可能是mysql8.0这种带版本的。第二条给出 prefix数据目录就在prefix/var/mysql配置文件在prefix/etc/my.cnf。官方 DMG 装的直接看/usr/local/mysql这个目录在不在在的话数据目录就是/usr/local/mysql/data。socket 文件的位置也不一样Homebrew 默认在/tmp/mysql.sock官方包默认在/tmp/mysql.sock或数据目录下。不确定的话连上之后执行SHOW VARIABLES LIKE socket;就知道了——但你现在连不上那就去看配置文件里的socket那一行或者直接find /tmp -name *.sock。5.2 完整命令行流程与权限踩坑以 Homebrew 为例完整流程如下。先停服务brew services stop mysql确认没有残留进程pgrep -fl mysqld有输出就说明没停干净用kill发 TERM 信号让它优雅退出别直接-9。然后进免密模式。这里我不建议用brew services启动因为它会把参数吃掉你用命令行直接跑 mysqld$(brew --prefix mysql)/bin/mysqld_safe --skip-grant-tables --skip-networking mysqld_safe是个包装脚本它会盯着 mysqld 进程挂了自动拉起日志也会写到数据目录下的.err文件里。启动后稍等两三秒然后连$(brew --prefix mysql)/bin/mysql -uroot --socket/tmp/mysql.sock如果报 socket 找不到就去数据目录下找.err日志里面会明确写着ready for connections时用的 socket 路径。拿到路径再连。改密码的 SQL 和前面一样先FLUSH PRIVILEGES。改完退出把mysqld_safe那个后台进程停掉$(brew --prefix mysql)/bin/mysqladmin -uroot -pN3wPss_2024 shutdown用mysqladmin shutdown比kill好它会走正常的关闭流程避免下次启动做崩溃恢复。最后brew services start mysql恢复正常。macOS 上有个特有坑如果你之前用官方 DMG 装过后来又用 Homebrew 装了一遍机器上会有两个 mysqld数据目录也是两套。你改的可能是 A连的却是 B怎么改都不生效。用which mysqld和ps aux | grep mysqld交叉确认一下到底跑的是哪个。另一个坑是数据目录权限。Homebrew 装的实例数据目录属主应该是当前登录用户官方 DMG 装的是_mysql用户。你要是混着用 sudo 跑过很容易把文件搞成 root 属主之后正常启动就失败。修法是sudo chown -R $(whoami) 数据目录Homebrew或sudo chown -R _mysql:_mysql 数据目录官方包改完再启动。6. Docker 环境最容易翻车的一块6.1 compose 里的 MYSQL_ROOT_PASSWORD 为什么改不动先说最常见的那声哀嚎改了docker-compose.yml里的MYSQL_ROOT_PASSWORDdocker compose up -d重启密码还是老的。原因很简单——这个环境变量只在容器首次初始化、数据目录为空的时候生效。数据目录里已经有mysql系统库了初始化脚本直接跳过你的新密码自然不生效。这个设计其实是对的否则每次重启容器密码都被重置那才叫灾难。但对不知情的人来说就是“我明明改了配置啊”。所以 Docker 环境下的重置核心在于绕过已有的初始化状态直接操作数据卷。6.2 独立容器挂载数据卷重置法标准做法是停掉原容器用一个临时容器挂载同一个数据卷以免密模式启动改完密码销毁临时容器再启动原容器。第一步找到数据卷的名字docker inspect 容器名 --format {{range .Mounts}}{{.Type}} {{.Name}} {{.Destination}}{{\n}}{{end}}输出里Destination是/var/lib/mysql的那一条Name就是卷名比如myapp_mysql_data。如果是 bind mountName位置会是宿主机路径那就直接用那个路径。第二步停原容器docker compose stop mysql第三步起临时容器挂同一个卷docker run -it --rm --name mysql-reset \ -v myapp_mysql_data:/var/lib/mysql \ mysql:8.0 \ mysqld --skip-grant-tables --skip-networking注意镜像版本要和原容器一致8.0 的数据目录用 8.4 的镜像去开可能直接触发升级流程或者报错。命令末尾的mysqld ...会覆盖镜像默认的启动命令。第四步另开终端连进去docker exec -it mysql-reset mysql -uroot容器里的 socket 路径一般是/var/run/mysqld/mysqld.sockmysql客户端默认就找这个通常不用指定。连上之后照例FLUSH PRIVILEGES; ALTER USER root% IDENTIFIED BY N3wPss_2024;这里要特别注意 host 部分。Docker 官方镜像初始化时会创建root%允许从任意主机连你在容器里改的是rootlocalhost应用从宿主机连过来用的却是root%还是连不上。稳妥做法是两个都改或者先SELECT user, host FROM mysql.user;看清楚有哪些记录。第五步退出 mysql 客户端CtrlC 停掉临时容器--rm会自动删除然后docker compose start mysql。用新密码验证。如果不想起临时容器也可以在原容器里改配置文件然后重启但官方镜像的配置文件路径和权限都封装得比较严改起来别扭。还有一种取巧办法docker compose exec进容器直接改/etc/mysql/conf.d/下加个skip-grant-tables.cnfdocker compose restart改完再删掉重启。适合手边没有镜像拉取权限、或者数据卷名不好找的情况。注意如果容器还配了主从复制、或者应用侧有连接池重启后从库可能因为认证失败而断开复制。改密码前先确认CHANGE REPLICATION SOURCE TO里配的账号是不是 root是的话改完要同步更新。还有一类更省事的场景如果你只是本地开发用的 Docker MySQL数据不重要那直接删卷重建比重置快得多。docker compose down -v再up -d一分钟搞定。判断标准就是那句老话这个数据你能不能承受丢失。能就别折腾重置了。7. 报错现场实录12 个高频问题排查表7.1 启动与连接阶段报错重置过程里失败大多发生在“起不来”和“连不上”这两个环节。我按出现频率把踩过的坑整理成表遇到问题先对照别急着重置第二遍。报错信息根本原因处理办法ERROR 2002 (HY000): Cant connect to local MySQL server through socketsocket 路径不对或服务根本没起来去错误日志确认 socket 实际路径先pgrep mysqld看进程在不在ERROR 2003 (HY000): Cant connect to MySQL server on 127.0.0.1免密模式隐式开了skip-networkingTCP 端口没监听改用 socket 或共享内存方式连接Windows 加--shared-memorymysqld: Cant create/write to file ... (Errcode: 13)数据目录属主或权限不对把目录属主改回运行 mysqld 的用户检查 SELinux 上下文服务启动几秒后自动退出配置文件语法错误或--init-file内容执行失败看.err日志最后 30 行那里面一定有明确原因Another process with pid xxx is using unix socket file上一个 mysqld 没退干净kill掉残留进程确认端口和 socket 文件都没被占用Access denied for user rootlocalhost仍处于正常模式密码确实不对确认skip-grant-tables是否真的生效日志里会有提示关于权限问题多说一句。Linux 上如果开了 SELinux 或 AppArmor即使文件权限完全正确mysqld 也可能读不了数据目录。ls -Z看一下安全上下文必要时用semanage fcontext加规则或者restorecon -Rv修复。这个坑排查起来很费时间因为错误信息看上去就是权限不足但ls -l显示的权限完全没问题得往安全模块上想。7.2 改密码阶段的报错报错信息根本原因处理办法ERROR 1290: The MySQL server is running with the --skip-grant-tables option免密模式下权限表未加载先执行FLUSH PRIVILEGES;再改密码ERROR 1819: Your password does not satisfy the current policy requirementsvalidate_password强度策略拦截临时SET GLOBAL validate_password.policyLOW;ERROR 1064语法错误版本不支持ALTER USER或误用了PASSWORD()5.7.6 以下用UPDATE mysql.user老语法ERROR 2059: Authentication plugin caching_sha2_password cannot be loaded老客户端不认 8.0 默认插件账号改回mysql_native_password或升级客户端驱动ERROR 1820: You must reset your password using ALTER USER密码过期状态直接ALTER USER ... IDENTIFIED BY ...覆盖改完密码连上却是旧密码生效改的账号 host 和实际使用的 host 不一致SELECT user,host FROM mysql.user;逐条核对ERROR 1698 (28000): Access denied for user rootlocalhost单独拎出来说这个报错几乎只出现在 Ubuntu 的默认安装上原因是 root 用auth_socket插件而你试图用密码登录。解法是sudo mysql进去把插件换掉前面的 4.1 节已经讲过。还有一个隐蔽的问题改完密码后应用连不上但命令行能连。这时候先别怀疑密码去查应用侧的连接串——是不是还写着老密码、是不是走了另一个账号、是不是连接池里缓存了旧连接。我有一次排查了半小时最后发现是配置文件里那份密码没改改的是环境变量里那份加载顺序不同导致生效的是后者。8. 重置完成之后比改密码更重要的三件事8.1 把 root 从日常连接里摘出去密码改回来只是把门重新装上了但如果这扇门一直是业务在推迟早还得出事。我给自己的规矩是root只用于本机 socket 管理操作任何应用、任何脚本、任何图形化工具都不许用 root 连。给每个业务建独立账号权限只给到需要的库和表主机名限制到具体网段。CREATE USER app_user10.0.1.% IDENTIFIED BY Str0ng_Pss; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO app_user10.0.1.%;顺手把匿名账号和测试库清掉。安装完没清理的实例里经常留着localhost这种空用户名的记录那是历史遗留的坑早晚会带来奇怪的认证行为。SELECT user, host FROM mysql.user WHERE user ; DROP USER IF EXISTS localhost;再检查一下root%存不存在。很多镜像、很多一键脚本会创建这个账号等于把超管开给了全网。除非你有明确理由否则删掉它只保留rootlocalhost。8.2 一套能长期生效的密码管理习惯密码忘了这件事本质上不是记忆力问题是管理方式问题。我现在的做法很简单所有数据库密码单独存一个加密的笔记或者用密码管理器命名规则统一成“环境-实例-账号”比如prod-orderdb-root。听起来有点小题大做但比起每次翻聊天记录、翻三个月前的部署文档这个成本几乎为零。另一个习惯是把重置流程本身写进运维文档标清楚这台机器上的实例是什么版本、装在哪、数据目录在哪、服务名叫什么、socket 在哪。这次重置花二十分钟下次可能只花两分钟前提是你把这次摸索出来的路径记下来了。最后分享一个小技巧。如果你实在不想管理一堆密码可以给自己留一条“后门”——不是安全意义上的后门而是本机 socket 认证。把rootlocalhost设成auth_socketLinux或保持本机免密 socket 访问日常维护走sudo mysql密码只在需要远程连接时才用。这样既保留了应急入口又不会因为忘密码而卡住前提是服务器本身的登录权限你得管好。我在几台个人测试机上一直是这么配的用起来确实省心。
阅读完成 · 觉得有帮助?