☰
MySQL ERROR 1045 根本原因与四步实战解决方案
2026/9/26 1:50:56 网站建设 项目流程

1. 这个报错到底在说什么?别被吓住,它只是MySQL在“核对门禁卡”

你刚装完MySQL,兴冲冲打开终端敲下mysql -u root -p,输入密码后屏幕猛地跳出一行红字:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)。那一刻,手停在键盘上,心里一咯噔——是不是密码输错了?是不是安装出问题了?是不是系统不兼容?其实,这个报错远没有听起来那么可怕,它根本不是系统崩溃,而是一次非常标准、非常常见的“身份核验失败”提示。你可以把它想象成小区门禁系统:你刷了卡(输入了用户名root),也按了密码(输入了-p后的密码),但门禁主机(MySQL服务)查了查数据库里的门禁权限表,发现这张卡在“localhost”这个门口的通行记录里,要么没登记过密码,要么登记的密码和你按的对不上,于是果断亮起红灯,拒绝放行。

这个错误代码1045是MySQL官方定义的“访问被拒绝”,(28000)是SQL标准状态码,代表“无效的授权凭证”。关键信息就藏在'root'@'localhost'这个字符串里——它明确指出了被拒绝的是哪个用户(root)、从哪个主机(localhost)发起的连接请求。很多人第一反应是“我密码肯定没错”,但问题恰恰就出在这里:MySQL里,'root'@'localhost'和'root'@'127.0.0.1'是两个完全不同的账户,哪怕密码一样,权限也得单独设置。这就像你家楼下的门禁卡和车库的门禁卡,虽然都叫“张三的卡”,但物理上是两张独立的卡,一张能进单元门,另一张才能开地库闸机。所以,当你用-h 127.0.0.1连接时,MySQL找的是'root'@'127.0.0.1'这个账户;而用-h localhost或者不加-h参数时,默认走的是 Unix socket 连接,匹配的是'root'@'localhost'。这就是为什么很多人反复重置密码却依然报错的根本原因:你改的是A账户的密码,但程序连的是B账户。

这个报错几乎横跨所有MySQL使用场景:本地开发环境搭建、Docker容器化部署、云服务器初始化配置、甚至Mac M1芯片上的Homebrew安装。它不挑操作系统,Windows、Linux、macOS通通会遇到;也不分MySQL版本,从5.7到8.0,再到MariaDB,底层认证逻辑一脉相承。如果你正在看这篇文字,大概率你是个开发者、运维新手,或者刚接触数据库的学生。你不需要精通C语言去编译MySQL源码,也不需要背诵几百条SQL语法,你只需要理解这背后的“账户-主机”绑定逻辑,再掌握几套经过千百次验证的实操方案,就能在5分钟内把这个问题彻底解决。接下来,我会像带一个新同事调试一样,带你一层层剥开这个报错的外壳,告诉你每一步操作背后的“为什么”,以及那些只有踩过坑的人才知道的细节。

2. 根本原因深度拆解:为什么MySQL要搞这么复杂的“双账户”体系?

要真正解决ERROR 1045,必须先理解MySQL权限系统的底层设计哲学。这不是一个bug,而是一个精心设计的安全机制。它的核心逻辑是:用户身份 = 用户名 + 主机名。这个组合才是MySQL中唯一有效的权限主体。'root'@'localhost'和'root'@'%'在MySQL眼里,就像两个完全不相干的陌生人,哪怕他们都叫“root”,一个住在本地(localhost),一个来自任意网络地址(%),他们的权限、密码、甚至能否登录,都是独立配置的。

2.1 localhost与127.0.0.1的本质区别:Unix Socket vs TCP/IP

这是绝大多数人栽跟头的第一个地方。在MySQL中,“localhost”这个词有特殊含义。当你执行mysql -u root -p时,客户端默认不走TCP/IP网络协议,而是尝试通过Unix domain socket文件进行本地通信。这个socket文件通常位于/var/run/mysqld/mysqld.sock(Linux)或/tmp/mysql.sock(macOS)。此时,MySQL服务端收到的连接请求,其来源主机名被硬编码为'localhost',因此它只会在mysql.user表中查找User='root' AND Host='localhost'这条记录。

而当你显式指定mysql -h 127.0.0.1 -u root -p时,客户端强制走TCP/IP协议栈,哪怕目标地址还是本机。这时,服务端看到的来源IP是127.0.0.1,它就会去查找User='root' AND Host='127.0.0.1'的记录。如果这条记录不存在,或者密码不匹配,同样会报1045错误。你可以用一条SQL命令立刻验证这一点:

SELECT User, Host FROM mysql.user WHERE User = 'root';

执行后,你极大概率会看到类似这样的结果:

+------ +-----------+ | User | Host | +------ +-----------+ | root | localhost | | root | 127.0.0.1 | | root | ::1 | +------ +-----------+

看到了吗?localhost、127.0.0.1、::1(IPv6的本地回环)是三条独立的记录。它们的密码字段authentication_string可能完全不同。很多一键安装脚本(比如Ubuntu的apt install mysql-server)在初始化时,会为localhost创建一个空密码的root账户,但为了安全,又会禁用127.0.0.1这条记录,或者干脆不创建。这就导致你用mysql -u root能登录(因为走socket,匹配localhost),但用mysql -h 127.0.0.1 -u root就死活登不上(因为那条记录要么不存在,要么密码为空或错误)。

2.2 MySQL 8.0的认证插件革命:caching_sha2_password vs mysql_native_password

如果你用的是MySQL 8.0或更新版本,问题可能更复杂一层。MySQL 8.0将默认的身份验证插件从老旧的mysql_native_password升级为更安全的caching_sha2_password。这个新插件要求客户端必须支持SHA256加密握手,而一些老版本的客户端工具(比如某些Navicat旧版、PHP 7.2之前的mysqli扩展)并不原生支持。当你用这些工具连接时,即使用户名密码完全正确,也会因为握手协议不匹配而被拒绝,错误日志里可能显示Plugin caching_sha2_password could not be loaded。

你可以通过以下SQL查看root用户的认证插件:

SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';

如果结果里plugin字段是caching_sha2_password,而你的客户端又不支持,最直接的解决方案就是把这个插件改回去:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码'; FLUSH PRIVILEGES;

这条命令的威力在于:它不仅重置了密码,更重要的是,它把认证方式降级为向后兼容的旧协议。对于本地开发环境,这通常是最快、最稳妥的解法。当然,生产环境建议升级客户端,而不是降级服务端,但作为快速排障手段,它立竿见影。

2.3 权限表损坏与初始化异常:那些被忽略的“静默故障”

除了上述两种主流原因,还有一类更隐蔽的问题:MySQL的数据目录(通常是/var/lib/mysql)在初始化过程中发生了异常。比如,安装时磁盘空间不足、SELinux/AppArmor策略拦截、或者安装包本身有缺陷,都可能导致mysql.user表的初始数据写入不完整。最典型的症状是,mysql.user表里压根就没有root@localhost这条记录,或者这条记录的authentication_string字段是空的(NULL),而password_expired字段却是Y(已过期)。这种情况下,任何密码输入都会失败,因为MySQL根本找不到一个有效的凭证来比对。

诊断这类问题的方法很直接:在MySQL服务停止状态下,用文本编辑器打开mysql.user.MYD文件(MyISAM表)或检查InnoDB的系统表空间,但这对新手太不友好。更实用的办法是,在安全模式下启动MySQL,并跳过权限表加载:

sudo mysqld_safe --skip-grant-tables --skip-networking &

然后用mysql -u root直连(此时不校验密码),再手动检查mysql.user表的内容。如果发现关键记录缺失,就需要用INSERT INTO mysql.user ...语句重建,这已经属于高级修复范畴,但对于理解整个权限体系的完整性至关重要。

3. 四套实战解决方案:从“重启大法”到“终极重置”,总有一款适合你

面对ERROR 1045,网上充斥着各种零散的“试一下这个命令”、“删掉那个文件”的碎片化建议。但作为一个在MySQL线上环境摸爬滚打十年的老兵,我总结出四套经过严格验证、覆盖99%场景的解决方案。它们不是简单的命令堆砌,而是有清晰的适用边界、明确的操作步骤和可预期的结果。选择哪一套,取决于你当前的环境状态和你的技术信心。

3.1 方案一:安全模式重置密码(推荐给所有新手,成功率95%)

这是最安全、最通用的入门级方案。它利用MySQL的--skip-grant-tables参数,在启动时完全绕过权限验证系统,让你获得一个“上帝视角”的root连接,从而可以无阻碍地修改任何账户的密码。整个过程不需要动任何配置文件,也不会影响其他数据库的正常运行。

第一步:停止MySQL服务

# Ubuntu/Debian sudo systemctl stop mysql # CentOS/RHEL sudo systemctl stop mysqld # macOS (Homebrew) brew services stop mysql

提示:务必确认服务已完全停止。可以用sudo lsof -i :3306检查3306端口是否已被释放。如果端口还在被占用,说明mysqld进程没杀干净,需要sudo kill -9 $(pgrep mysqld)强制终止。

第二步:以安全模式启动MySQL

# 关键!必须指定数据目录,否则可能启动失败 sudo mysqld_safe --skip-grant-tables --skip-networking --datadir=/var/lib/mysql &

这里--skip-networking参数极其重要。它禁止MySQL监听TCP端口,只允许本地socket连接,相当于给这个“裸奔”的MySQL加了一道物理防火墙,防止被外部恶意连接。--datadir参数则确保它读取的是你实际安装的数据目录,避免因路径错误导致启动失败。

第三步:无密码登录并重置root密码新开一个终端窗口,执行:

mysql -u root

此时你应该直接进入了MySQL命令行,没有任何密码提示。接着,执行以下SQL(注意:MySQL 5.7和8.0的语法略有不同):

对于MySQL 5.7及更早版本:

USE mysql; UPDATE user SET authentication_string=PASSWORD('你的新密码') WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES; EXIT;

对于MySQL 8.0及以上版本:

USE mysql; ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; FLUSH PRIVILEGES; EXIT;

注意:FLUSH PRIVILEGES;这条命令必不可少。它告诉MySQL重新加载内存中的权限缓存。没有它,你改的密码不会生效。

第四步:优雅重启服务回到第一个终端,按Ctrl+C停止安全模式的mysqld进程,然后正常启动:

sudo systemctl start mysql # 或 sudo systemctl start mysqld

最后,测试新密码:

mysql -u root -p # 输入你刚刚设置的新密码

如果成功进入,恭喜,问题已解决。这个方案的优势在于,它不依赖于你是否记得旧密码,也不关心localhost和127.0.0.1的区别,它直接在源头上重建了凭证。

3.2 方案二:利用debian.cnf配置文件(专治Ubuntu/Debian系“安装即报错”)

Ubuntu和Debian的MySQL官方包有一个鲜为人知的“后门”:在/etc/mysql/debian.cnf文件里,预置了一个名为debian-sys-maint的管理账户。这个账户拥有SUPER权限,可以执行包括修改root密码在内的所有操作。它的存在,就是为了应对安装后root密码未知的尴尬局面。

第一步:查看debian.cnf文件

sudo cat /etc/mysql/debian.cnf

你会看到类似这样的内容:

[client] host = localhost user = debian-sys-maint password = 一串随机字符 socket = /var/run/mysqld/mysqld.sock

记下这里的user和password。

第二步:用debian账户登录并重置root

mysql -u debian-sys-maint -p # 输入上面看到的密码

进入后,执行:

USE mysql; -- MySQL 8.0+ ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; -- MySQL 5.7- UPDATE user SET authentication_string=PASSWORD('你的新密码') WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES; EXIT;

实操心得:这个方法最大的好处是,你完全不需要停止MySQL服务。对于正在运行的生产环境(当然,前提是它用的是Debian系发行版),这是最平滑的修复方式。但它的局限性也很明显:只适用于Ubuntu/Debian及其衍生版,且debian.cnf文件必须存在且未被手动删除。

3.3 方案三:Docker环境专项修复(解决“容器一启就报错”的魔咒)

如果你是在Docker中运行MySQL(比如用docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xxx mysql:8.0),却依然遇到1045错误,那问题很可能出在卷挂载(volume)上。Docker的MySQL镜像有一个特性:只有在容器首次启动、且数据目录为空时,才会根据环境变量MYSQL_ROOT_PASSWORD初始化root密码。如果你之前挂载了一个非空的卷(比如./mysql-data:/var/lib/mysql),那么MySQL会直接读取卷里的旧数据,而忽略环境变量,导致root密码还是旧的,甚至可能是空的。

诊断:

# 查看容器日志,寻找初始化信息 docker logs your-mysql-container-name # 如果看到 "Initializing database" 字样,说明是首次初始化; # 如果看到 "Starting MySQL" 而没有初始化日志,说明它在复用旧数据。

修复:

# 方法1:清空数据卷(慎用!会丢失所有数据) docker volume rm your-mysql-volume-name docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=newpass -v your-mysql-volume-name:/var/lib/mysql mysql:8.0 # 方法2:进入容器,用方案一的安全模式(推荐) docker exec -it your-mysql-container-name bash # 在容器内执行 mysqld_safe --skip-grant-tables... 等一系列操作

注意:Docker环境下,mysqld_safe可能不在PATH里,你需要用完整路径/usr/bin/mysqld_safe。另外,容器内的/var/lib/mysql就是你的数据目录,无需额外指定--datadir。

3.4 方案四:终极重装(当所有方案都失效时的“核按钮”)

当以上三个方案都宣告失败,比如你发现mysql.user表结构损坏、debian.cnf文件丢失、或者Docker卷里全是乱码文件时,最省心的办法就是彻底卸载重装。但这绝不是简单地apt remove mysql-server就完事。真正的“干净重装”,必须清除所有残留的配置和数据。

Ubuntu/Debian完整清理流程:

# 1. 停止服务并卸载包 sudo systemctl stop mysql sudo apt-get purge mysql-server mysql-client mysql-common sudo apt-get autoremove sudo apt-get autoclean # 2. 彻底删除数据和配置 sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysql # 3. 清理残留的dpkg配置 sudo dpkg -l | grep mysql | awk '{print $2}' | xargs sudo dpkg --purge # 4. 重新安装 sudo apt-get update sudo apt-get install mysql-server

安装完成后,系统会自动生成一个新的root密码,并输出在终端里(Ubuntu 22.04+),或者你可以用方案二的debian.cnf来获取。这个流程看似繁琐,但它能100%保证你得到一个“出厂设置”的MySQL,所有历史包袱一扫而空。我在处理客户现场那些“怎么都修不好”的疑难杂症时,最后一步永远是这个。

4. 预防胜于治疗:一次配置,永久告别1045报错

解决了眼前的问题,更要思考如何让它永不复发。很多开发者陷入一个误区:把MySQL当成一个黑盒,只在出问题时才去翻文档。但其实,只要在安装之初做几个简单的配置,就能规避90%的1045错误。这些配置不是什么高深技巧,而是MySQL官方文档里明明白白写着的最佳实践。

4.1 安装时就设定强密码:拒绝“空密码陷阱”

无论是用包管理器安装,还是下载二进制包,MySQL都提供了交互式配置向导。在Ubuntu上,安装完mysql-server后,系统会自动运行mysql_secure_installation脚本。这一步,绝对不要跳过!它会引导你完成五项关键设置:

  1. 设置root账户密码(这是最核心的一步);
  2. 移除匿名用户(Anonymous users);
  3. 禁用远程root登录(Disallow root login remotely);
  4. 删除test数据库及其访问权限;
  5. 重新加载权限表(Reload privilege tables)。

其中,第1步和第3步直接关系到1045错误。如果你在第1步设定了一个强密码,并在第3步选择了“Y”(禁用远程root),那么MySQL就会为你创建一条root@localhost记录,并赋予它完整的本地管理权限。后续你用mysql -u root -p就能畅通无阻。

实操心得:我见过太多人,在向导里一路狂按回车,结果root密码为空,然后在项目里各种折腾。记住,安全向导的每一个“Y/N”选项,都是MySQL工程师用血泪经验写就的防御策略。

4.2 统一认证方式:让localhost和127.0.0.1“同等待遇”

如前所述,localhost和127.0.0.1是两条独立的权限记录。为了彻底杜绝“这个能登,那个不能登”的困惑,最好的办法是让它们拥有相同的密码和权限。在你成功登录root后,立即执行以下SQL:

-- 为127.0.0.1创建root账户(如果不存在) CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '你的统一密码'; -- 将localhost的权限复制给127.0.0.1 GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION; -- 刷新权限 FLUSH PRIVILEGES;

这样,无论你用mysql -u root -p还是mysql -h 127.0.0.1 -u root -p,都能成功登录。这个操作只需执行一次,一劳永逸。

4.3 配置文件标准化:用my.cnf终结“参数迷宫”

MySQL的配置分散在多个地方:全局配置文件/etc/mysql/my.cnf、用户配置文件~/.my.cnf、甚至命令行参数。这种分散性是导致连接行为不一致的根源之一。一个专业的做法是,创建一个统一的、明确的客户端配置文件。

在你的用户主目录下,创建~/.my.cnf文件:

[client] user = root password = 你的密码 host = localhost # 或者 host = 127.0.0.1,根据你的偏好选择

并设置严格的文件权限:

chmod 600 ~/.my.cnf

提示:chmod 600是必须的。MySQL客户端会检查这个文件的权限,如果权限过于宽松(比如644),它会直接忽略该文件并报错,这是MySQL内置的安全策略。

有了这个文件,你以后执行mysql命令时,就再也不用每次都敲-u root -p了。它会自动读取配置,大大降低人为失误的概率。而且,这个文件只对你自己的用户生效,不会影响系统其他服务,安全又便捷。

4.4 Docker Compose最佳实践:让每次启动都“可预期”

对于Docker用户,我强烈建议放弃裸docker run命令,转而使用docker-compose.yml。它不仅能让你的环境配置一目了然,还能通过init脚本实现自动化修复。

一个健壮的docker-compose.yml示例:

version: '3.8' services: mysql: image: mysql:8.0 container_name: mysql-dev environment: MYSQL_ROOT_PASSWORD: mysuperstrongpassword MYSQL_DATABASE: myapp ports: - "3306:3306" volumes: - ./mysql-data:/var/lib/mysql - ./mysql-init:/docker-entrypoint-initdb.d restart: unless-stopped

关键在于./mysql-init这个挂载点。在这个目录下,放一个01-fix-root.sql文件:

-- 确保root@localhost和root@127.0.0.1都有相同密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysuperstrongpassword'; CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'mysuperstrongpassword'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION; FLUSH PRIVILEGES;

这样,每次容器首次启动时,MySQL都会自动执行这个SQL,确保权限配置万无一失。这才是DevOps时代应有的工作流。

5. 常见问题与排查技巧实录:那些论坛里找不到的“真·避坑指南”

在过去的十年里,我帮上百个团队处理过MySQL 1045错误。除了上述标准方案,还有一些极其琐碎、但又高频出现的“边缘情况”,它们往往不会出现在官方文档里,却能让一个资深工程师抓耳挠腮半小时。我把这些实战中积累的“暗礁”和“捷径”,毫无保留地整理出来。

5.1 “密码是对的,但还是报错”:字符集与不可见字符的陷阱

最让人崩溃的场景莫过于:你100%确定密码正确,甚至用echo "你的密码" | sha256sum验证过,但MySQL就是不认。这时,请立刻怀疑你的终端或编辑器引入了不可见字符。特别是当你从网页、微信、或者某些富文本编辑器里复制密码时,很容易混入全角空格、零宽空格(U+200B)、或者BOM头。

排查方法:

# 用od命令查看密码的十六进制编码 echo -n "你的密码" | od -c # 正常密码应该只显示可见字符和换行符 \n # 如果看到 \0 \t \r 或其他奇怪符号,说明有脏字符

解决方案:

  • 在纯文本编辑器(如vim、nano)里手动输入密码,而不是复制粘贴;
  • 在MySQL命令行里,用SET PASSWORD FOR 'root'@'localhost' = 'your_password';代替ALTER USER,因为前者对字符串的解析更宽容;
  • 终极办法:用mysql_config_editor工具安全地存储密码,它会自动处理编码问题:
    mysql_config_editor set --login-path=local --user=root --password # 然后用 mysql --login-path=local 连接

5.2 “Navicat连不上,但命令行可以”:客户端驱动版本不匹配

Navicat、DBeaver、甚至某些IDE(如DataGrip)的数据库连接,背后都依赖特定版本的JDBC或ODBC驱动。当MySQL升级到8.0,而你的Navicat还是旧版(比如12.x),它的驱动可能还不支持caching_sha2_password插件。

快速验证:

  • 在Navicat的连接设置里,找到“高级”选项卡;
  • 勾选“使用旧版认证协议(MySQL 4.1+)”;
  • 或者,在“SSL”选项卡里,将“SSL模式”改为“禁用”。

如果勾选后能连上,那就100%是驱动兼容性问题。解决方案是升级Navicat到最新版(16+),或者在MySQL端执行前面提到的ALTER USER ... IDENTIFIED WITH mysql_native_password命令。

5.3 “Mac M1芯片上死活不行”:Rosetta与架构冲突

M1/M2芯片的Mac在运行Intel架构的MySQL二进制包时,有时会因为Rosetta转译层的细微差异,导致socket文件路径识别错误。最典型的表现是,mysql -u root -p报1045,但mysql -h 127.0.0.1 -u root -p却能成功。

根本原因:Homebrew安装的MySQL,其socket文件默认路径是/opt/homebrew/var/run/mysql/mysqld.sock,但某些客户端(尤其是通过Rosetta运行的)会错误地去/tmp/mysql.sock寻找。

一劳永逸的解决:

# 创建符号链接,让所有路径都指向正确位置 sudo ln -sf /opt/homebrew/var/run/mysql/mysqld.sock /tmp/mysql.sock

或者,在你的~/.my.cnf文件里,明确指定socket路径:

[client] socket = /opt/homebrew/var/run/mysql/mysqld.sock

5.4 “WSL2里localhost不通”:网络虚拟化带来的“假localhost”

在Windows Subsystem for Linux 2 (WSL2) 中,localhost对Linux子系统来说,指的是WSL2自己的网络命名空间,而不是Windows宿主机。所以,当你在WSL2里运行MySQL,并试图从Windows上的Navicat连接localhost:3306时,实际上是在连接WSL2内部的loopback,而WSL2的防火墙默认是阻止外部连接的。

正确做法:

  • 不要连接localhost,而是连接Windows宿主机的真实IP(在WSL2里用cat /etc/resolv.conf | grep nameserver查到);
  • 或者,在Windows防火墙里,为WSL2的MySQL端口(3306)创建入站规则;
  • 最优雅的方案:在WSL2的MySQL配置文件/etc/mysql/mysql.conf.d/mysqld.cnf中,将bind-address从127.0.0.1改为0.0.0.0,并确保skip-networking是注释掉的。

常见问题速查表:

现象最可能原因快速验证命令推荐解决方案
mysql -u root成功,mysql -h 127.0.0.1 -u root失败root@127.0.0.1记录不存在或密码错误SELECT User,Host FROM mysql.user WHERE User='root';CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'xxx'; GRANT ...;
Navicat报错2002或1045,命令行正常Navicat驱动不兼容MySQL 8.0新认证在Navicat连接设置里启用“旧版认证协议”升级Navicat或在MySQL端ALTER USER ... WITH mysql_native_password
Docker容器内MySQL启动后立即退出数据卷里有损坏的ibdata1文件docker logs your-container查看错误日志docker volume rm your-volume && docker-compose up -d
Mac上mysql -u root -p报错,但mysql -h 127.0.0.1 -u root -p成功socket路径错误ls -l /tmp/mysql.socksudo ln -sf /opt/homebrew/var/run/mysql/mysqld.sock /tmp/mysql.sock

最后再分享一个小技巧:当你在任何Linux发行版上安装完MySQL,第一时间执行sudo mysql_secure_installation,然后在它的向导里,把root密码设为一个你绝对记得住的、但又足够复杂的字符串(比如MySql2024!Secure)。这个习惯,能帮你省下未来至少80%的深夜救火时间。毕竟,一个稳定的数据库环境,不是靠事后补救堆出来的,而是靠安装时的那几分钟严谨配置奠定的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询