
很多人第一次在 Linux 上装 MySQL 8.0都会卡在同一个位置下载安装这件事本身并不难难的是装完之后临时密码找不到、服务起不来、Workbench 连不上。这次我用一台干净的系统从头到尾走了一遍 MySQL 8.0 的下载安装、初始化和 MySQL Workbench 连接使用把这套流程里最容易出问题的环节挨个拆开讲清楚。如果你是第一次在 Linux 下搭 MySQL 环境或者之前只在 Windows 上装过、到 Linux 上就发怵这篇可以当一份可直接照做的操作手册。整个过程的重点是让你能自己看懂每一步在干什么而不是机械复制命令。1. 装 MySQL 8.0 之前先想清楚的三件事1.1 为什么选 8.0 而不是 5.7 或别的版本这个阶段的第一个选择就是版本。MySQL 8.0 已经不是新东西了它在生产环境里跑了很多年稳定性早就经过了验证。相比 5.78.0 最大的变化在于默认字符集换成了 utf8mb4、认证插件换成了 caching_sha2_password、窗口函数和公共表表达式这些查询能力也补上了。尤其 utf8mb4 这一点直接影响你后面建表时要不要操心中文和 emoji 存不存得进去8.0 把默认值做好之后就省了这一步的麻烦。还有一个很现实的理由很多跟着课程或者项目教程走的人后面要做的东西是基于 8.0 的语法和特性写的。比如 RECURSIVE CTE、窗口函数这类写法在 5.7 里是跑不了的。如果一上来装了 5.7后面照着文档练习的时候就会发现语法对不上那就得推倒重来。所以除非你的目标系统明确要求 5.7否则直接上 8.0 是当前最合理的默认选择。Debian/Ubuntu 系和 RHEL/CentOS 系在选择上还略有不同。Ubuntu 20.04 之后的系统仓库里自带的 mysql-server 版本已经直接是 8.0 了而 CentOS 7 的系统源里还是 5.7这也是为什么很多人会在老系统上装错版本。装之前先确认你用的发行版和架构能少走很多弯路。1.2 三种安装方式怎么选Linux 下装 MySQL 8.0 无非三条路用发行版自带的软件源、用 MySQL 官方维护的 APT/YUM 源、下载官方通用二进制包手动解压部署。这三种方式没有绝对的好坏得看你的使用场景。发行版自带源的好处是干净省事一条apt install mysql-server或者dnf install mysql-server就完事。坏处是版本通常会比你预想的旧一些——Ubuntu 22.04 自带的不是 MySQL 8.0 的最新小版本而是当初发布时打好的快照版本。对学习环境和一般项目来说够用但如果你想要新特性或者在意安全补丁跟进的速度就得考虑官方源。官方 APT/YUM 源是我个人最推荐的方案。它把 MySQL 官方打包的最新版本通过你熟悉的包管理工具装进去升级和卸载都走包管理器体验最接近正规军。唯一的门槛是第一次需要手动把官方仓库地址加进系统这个步骤稍微有点绕但只需要做一次。官方通用二进制包tarball适合什么情况呢一是你的服务器压根没法联网只能下载好了再传上去二是你想完全控制 MySQL 装到哪个目录、数据文件放哪个位置不受发行版目录规范的限制。缺点是所有初始化都要自己手动做编译参数也没有对新手不友好。我的建议是除了上面这两种特殊情况优先用官方 APT/YUM 源。1.3 先确认系统版本和 CPU 架构别装错包这一步经常被忽略但它决定了你后面会不会遇到安装包架构不匹配这种低级错误。在终端里跑这两个命令cat /etc/os-release uname -m第一个命令能看到你的发行版名称和版本号第二个命令告诉你 CPU 架构。x86_64 就是现在绝大多数服务器和 PC 的架构如果是 aarch64说明是 ARM 平台比如苹果的某些机器的虚拟机或者新的云主机就用这个。为什么强调这个因为 MySQL 官方对不同架构提供不同的安装包下载时选错了会在 dpkg 安装时直接报架构错误。另外Ubuntu 22.04 和 Ubuntu 20.04 虽然都是 apt 系但官方给的配置包版本可能要求不同的依赖提前确认系统版本能帮你判断报错的原因。还有一个容易被忽略的小点检查系统里是不是已经装了 MySQL 或者其他兼容分支。很多人用的是云服务器镜像里可能已经预装了 MariaDB而 MariaDB 和 MySQL 的安装位置、服务名都有冲突可能。先用which mysql mysqld mariadb看一下如果有先决定是卸载还是换一台干净机器别硬装。2. 下载安装全流程从官方源到 mysqld 跑起来2.1 配置官方 APT 源并完成安装我这次以 Debian/Ubuntu 系为例走一遍完整流程。首先是下载官方提供的仓库配置包。这个包不包含 MySQL 本身它做的事情是帮你把官方 APT 仓库写入系统源列表。wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb执行 dpkg 安装的时候会弹出一个交互界面让你选择要配置的 MySQL 版本选择MySQL Server Cluster下面对应的 8.0 选项然后一路 OK。如果不小心选错了可以重新执行sudo dpkg-reconfigure mysql-apt-config再选一遍。这个配置包的具体文件名版本会随官方更新而变化从官网下载页看到的文件名大概率和我写的不完全一样下载的时候以官网当前提供的文件名为准。配置完源之后更新索引然后安装sudo apt update sudo apt install mysql-server -y安装过程中会要求你设置 root 密码还是选择身份验证方式。不同版本的处理略有差异如果看到选择项推荐选择使用传统密码认证模式或者按提示设置密码如果选择 Debian 默认的 auth_socket 插件那么 root 账号只能用系统 root 身份免密登录Workbench 连接的时候会比较麻烦。这一点后面会详细说。装完后用mysql --version确认安装的版本号输出应该是类似mysql Ver 8.0.xx for Linux on x86_64这样的信息。2.2 从服务启动到开机自启安装完成不等于服务已经在跑了。Debian/Ubuntu 下 MySQL 的服务名通常是 mysql用 systemd 管理sudo systemctl start mysql sudo systemctl status mysql第一次执行时可能服务已经自动启动了status 输出里会看到active (running)状态。如果没有启动先查看错误信息最常见的原因是 /var/lib/mysql 目录权限不对或者系统里残留了旧版 MySQL 的配置文件。开机自启这一步很多人会漏掉。测试环境重启一次服务器之后 MySQL 没起来才开始到处找问题。设置自启的命令很简单sudo systemctl enable mysql从这之后MySQL 会随系统一起启动。关于既然 systemd 能管为什么还要 mysqld_safe这个问题8.0 里默认方式就是用 systemdmysqld_safe 是传统 sysv 时代的启动脚本除非你的系统没有 systemd否则不需要碰它。2.3 备选方案下载通用 Linux 二进制包手动部署如果你所在的网络环境下载速度很慢或者你非要自己掌控目录结构那就走官方 tarball 这条路。这里只说核心动作。先去官网下载页找到mysql-8.0.x-linux-glibc2.28-x86_64.tar.xz这种名字的包。下载后解压、移动到 /usr/local/mysql然后创建 mysql 系统用户sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql sudo tar -xJf mysql-8.0.x-linux-glibc2.28-x86_64.tar.xz -C /usr/local sudo ln -s /usr/local/mysql-8.0.x-linux-glibc2.28-x86_64/ /usr/local/mysql sudo mkdir -p /var/lib/mysql sudo chown -R mysql:mysql /var/lib/mysql接下来是手动初始化数据目录sudo /usr/local/mysql/bin/mysqld --initialize --usermysql --datadir/var/lib/mysql注意这个命令是mysqld --initialize不是老教程里常见的mysql_install_db5.7.6 之后官方就把初始化方式改成前者了。初始化过程会在错误日志里打印一个临时 root 密码这个密码是随机生成的一定要先找到再往下走。手动部署方案里日志默认输出到数据目录下的文件里比如 /var/lib/mysql/hostname.err用tail -n 20查看。这种部署方式最大的价值是目录结构完全由自己控制卸载时直接删目录就行。它的代价是要手动写 my.cnf 配置文件默认配置从哪加载、服务以什么用户跑、socket 文件放哪都需要心里有数。新手如果没把握建议还是用官方源。2.4 安装过程的报错怎么处理真正实操时项目安装很少一次通过。最常见的两类报错是依赖缺失和仓库密钥过期。依赖缺失的表现是 apt 在安装时提示unmet dependencies一般是因为长时间没执行 update源索引和实际依赖仓库不同步。解决办法很简单先sudo apt update --fix-missing再重新安装。仓库密钥过期容易被误判为网络问题。报错通常是一个类似The following signatures couldnt be verified because the public key is not available的提示。这个问题的本质是某个 apt 源的签名密钥过期了。解决方式是把 MySQL 官方仓库的密钥重新导入一次sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29需要注意apt-key在新版 Ubuntu22.04 之后里已经被标记为废弃更规范的做法是把密钥文件放到 /etc/apt/trusted.gpg.d/ 目录下用gpg --dearmor转换格式。不过在学习阶段只要能把问题定位到密钥过期而不是怀疑网络就已经成功了大半。3. 初始化、临时密码与账号授权3.1 从哪里找到初始化的临时密码这是新手最容易卡住的一步。安装完成后root 账号有一个随机生成的临时密码你如果不找就直接连接系统会提示Access denied。临时密码在日志文件里。不同发行版日志路径不同Debian/Ubuntu 下一般看这里sudo grep temporary password /var/log/mysqld.log sudo grep temporary password /var/log/mysql/error.log两个命令换着试试总能在一个文件里找到类似A temporary password is generated for rootlocalhost: aBc123xYz!这样的输出。注意复制密码的时候要带上最后那个感叹号之类的特殊字符漏掉一个字符就是白忙一场。如果是 tarball 手动部署初始化日志默认会写到 datadir 目录下的.err后缀文件里路径对应你--datadir参数指定的位置。我遇到过有人找不到日志直接把整个数据目录删了重新初始化了一遍这是最粗暴但确实有效的办法。3.2 修改密码和 mysql_secure_installation 的实际作用拿到临时密码后用 root 登录mysql -uroot -p登录成功后第一件事就是修改密码因为临时密码只能用一次连接。MySQL 8.0 的密码修改语句是 ALTER USERALTER USER rootlocalhost IDENTIFIED BY ThisIs_A_StrongPass_2024;改密码的时候要注意 8.0 默认安装了 validate_password 组件它对密码复杂度有要求。实测下来密码至少要 8 位并且要同时包含大写字母、小写字母、数字和特殊字符缺一个都会报错。如果你是想搞测试环境不想被这个规则卡住可以用下面这个命令查看具体策略再决定是设置一个符合要求的密码还是降低策略等级SHOW VARIABLES LIKE validate_password%;接着执行安全初始化脚本sudo mysql_secure_installation这个交互式脚本干的事情总结起来就四件移除匿名用户、禁止 root 远程登录、删除 test 测试库、刷新权限表。对学习和后续调试来说如果 root 只是本机管理用那禁止远程登录是合理的匿名用户和 test 库删掉也是好习惯。整个过程按提示 Y 到底就行。这里有一个容易纠结的问题很多教程建议 root 远程登录方便管理但我的实际建议是 root 只用来本机管理业务数据的访问单独开一个账号。这样就算某个业务库被拖库也不至于 root 权限直接暴露。3.3 创建业务账号并开放远程访问前面提到 Workbench 连接尽管你可以用 root 连但更符合实际的方式是创建一个业务账号。比如给某个模拟项目建一个账号和库CREATE DATABASE demo_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; CREATE USER demo_user% IDENTIFIED BY Demo_Pass_2024; GRANT ALL PRIVILEGES ON demo_db.* TO demo_user%; FLUSH PRIVILEGES;关于 demo_user% 里的这个%经常被误解为允许所有来源它确实表示不限制客户端 IP但真正能不能连上还取决于后面要提到的 bind-address 和防火墙。如果只希望特定网段的机器能连可以写成这样CREATE USER demo_user192.168.1.% IDENTIFIED BY Demo_Pass_2024;授权完成后用SHOW GRANTS FOR demo_user%;检查权限是否按预期生成。这一步其实是整个连接环节里问题的重灾区很多人的账号密码都对、数据库也建好了最后却连不上往往是忘了授权或者授权之后没有刷新权限表。4. MySQL Workbench 的安装和连接配置4.1 把 Workbench 客户端装好MySQL Workbench 是官方出品的图形化客户端它的角色定位相当于数据库的驾驶舱建表、写 SQL、看性能、做模型设计都能在图形界面里完成。对刚开始接触 MySQL 的人来说用 Workbench 的好处是可以把注意力放在数据而不是命令行上。安装方式取决于你的发行版。如果之前配置了官方 APT 源那直接用 apt 装即可sudo apt install mysql-workbench-community如果没有配官方源就通过官网 Workbench 下载页挑选对应系统的包。Ubuntu 系下载 .deb 文件后执行sudo dpkg -i mysql-workbench-community_8.0.xx-1ubuntu22.04_amd64.deb如果 dpkg 安装时提示依赖缺失手动跑sudo apt install -f修复一下即可。这里提醒一个细节Workbench 的版本号不需要和服务器端的 MySQL 版本严格一致8.0.x 的 Workbench 连低版本 MySQL 完全没问题但是反过来用旧版 Workbench 连 8.0 服务端时可能因为认证插件问题连不上。4.2 新建连接时那些参数都是什么意思打开 Workbench在首页找到 MySQL Connections 旁边的加号新建连接。这里有四个核心参数Connection Name连接名自己起一个方便辨认的名字即可叫什么都行。Hostname服务器 IP。注意如果是本机填 127.0.0.1 而非 localhost原因涉及 socket 和 TCP 的差异等会讲到。Port3306MySQL 默认端口除非你改过 my.cnf。Username刚才创建的 demo_user或者 root。Password 一栏可以先点 Store in Vault 保存。用测试账号时保存密码确实省事但如果你用的是 root 账号我反而不建议保存密码——图形客户端的历史连接信息经常被翻出来还是让密码在每次连接时输入更安全。第一次点 Test Connection 之前先要确认服务端的 bind-address 和防火墙。Workbench 本质上是个 TCP 客户端它通过 3306 端口访问 MySQL服务端默认只绑定 127.0.0.1本机连接没问题但从另一台机器就连不上。要让外部能连需要修改 MySQL 配置文件my.cnf或mysqld.cnf在 [mysqld] 段下加一行bind-address 0.0.0.0改完重启服务sudo systemctl restart mysql。但这里必须强调bind-address 0.0.0.0会让 MySQL 监听所有网卡。如果是云服务器风险不小配合防火墙放行指定来源 IP 会稳妥很多别图省事全放开。4.3 连上之后最值得做的几件事连接成功以后Workbench 的主界面就能展示服务状态、数据库列表和表对象。新手阶段我建议优先做这几件事第一打开一个查询标签页执行SELECT VERSION();确认服务器版本。第二在左侧面板展开你的测试库右键选择 Table Data Import Wizard 或者 Create Table体验用可视化方式建一张带主键、索引的表建立对表结构的直观感觉。第三打开 Server 菜单里的 Server Status看看当前的连接数、运行时长和各类变量这里能直观感受到 MySQL 8.0 的运行时状态。另外值得用一下的是工具菜单里的 EER Diagram 功能也就是逆向工程。选中数据库之后Workbench 能自动把现有的表结构生成一张 ER 图。这个功能在学习阶段特别有用因为它能帮你把库表之间的外键关系看得清清楚楚比对着命令行里一条条 SHOW CREATE TABLE 强多了。4.4 连接时默认 Schema 和字符集的选择新建连接时有一个很容易被忽略的 Default Schema 选项。它的作用是指定连接后默认选中的数据库。如果你已经创建了 demo_db可以直接在连接配置里填上这样连进去后就不需要再手动执行USE demo_db。关于字符集MySQL 8.0 的默认 server 字符集已经是 utf8mb4正常情况下没有必要修改。但是 Workbench 连接时有一个 Connection Settings 里的高级选项卡可以设置character set为 utf8mb4。在某些老系统上Workbench 默认连接字符集可能是 latin1导致你在图形界面里看到中文字符正常但通过命令行客户端看却乱了。遇到这种情况把连接设置里的字符集改成 utf8mb4 再重新连接就行。这一点在多人协作环境里尤其重要不同客户端连接字符集不一致会让人误以为数据存储就有问题实际上只是客户端显示层的差异理解了这个原理排查时就不会被带偏。5. 我在实际部署中踩过的坑与绕行建议5.1 防火墙把 3306 挡在外面这是所有远程连不上 MySQL问题里占比最高的一类。症状很典型Workbench 测试连接时卡在等待响应最后报错Cant connect to MySQL server on ... (timed out)。本机命令行 mysql 能连远程却连不上大概率就是防火墙的问题。Debian/Ubuntu 系先查 ufw 状态sudo ufw status sudo ufw allow 3306/tcpRHEL 系用 firewalldsudo firewall-cmd --permanent --add-port3306/tcp sudo firewall-cmd --reload这里有个容易忽略的点改完防火墙规则后之前已经建立的连接不会被中断但新连接会不会被放行需要立刻测试。用另一台机器执行telnet IP 3306能看到Connected to IP就算通了。如果 telnet 装不了用nc -vz IP 3306也可以。先确认端口通再去看 MySQL 账号配置能节省大量排查时间。5.2 远程连接时反复出现的认证插件报错如果在 Workbench 连接时提示Authentication plugin caching_sha2_password cannot be loaded说明你用的是老版本的客户端或者驱动。MySQL 8.0 把默认认证插件从 mysql_native_password 换成了 caching_sha2_password这个插件在连接时需要额外的 RSA 公钥交换旧客户端不认识它。解决办法有三个方向。第一个是升级 Workbench 或者 Connector/J、Connector/Python 到你系统截止目前支持的最新版这是最推荐的做法。第二个是在创建用户时临时指定老插件写法是CREATE USER demo_user% IDENTIFIED WITH mysql_native_password BY Demo_Pass_2024;第三个方向是针对已有用户用 ALTER 修改插件方式但我不建议你在生产库上长时间这么干因为 mysql_native_password 在 8.0 里已经标记为废弃未来的版本迟早要移除。学会看这个报错背后的原因比背命令更重要认证插件只是密码校验方式和账号权限是两码事不要一看到 error 就怀疑授权这是新手容易犯的思维惯性。5.3 改配置文件之后服务起不来修改 my.cnf 或者 mysqld.cnf 之后重启服务失败是另一个高频问题。我碰到过的最典型场景是加了lower_case_table_names1后 MySQL 直接拒绝启动错误日志里写着表名大小写设置被锁定。原因在于 MySQL 8.0 在初始化数据目录时就把这个值固化下来了后期改配置文件不会生效必须初始化前就指定。在处理服务启动问题时我的排查顺序是先看状态再查日志最后才考虑配置文件。sudo systemctl status mysql sudo journalctl -u mysql -n 50 --no-pager日志里如果看到[ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server (1) and data dictionary (0)基本就是上面说的情况。解决办法是删掉数据目录重新初始化或者保持默认配置不动。这个坑遇到一次之后就会长记性改配置之前先想想该参数是不是只在初始化时生效。5.4 授权正确却依旧拒绝访问的隐蔽原因有一种情况最让人头疼防火墙放通了账号也授权了密码也没错但远程连接仍然报Access denied for user demo_userx.x.x.x。这时责任往往在 MySQL 的账号 Host 匹配规则上。MySQL 在判断一个连接来自哪个 Host 时会优先按精确 IP 匹配。比如你明明创建了 demo_user%但系统里还存在一个 demo_userlocalhost本机连接时走的是 localhost 那条记录而远程连接则看其他规则。如果之前注释掉的旧记录干扰就会出现看起来权限都给了却连不上的局面。排查方法很简单执行SELECT user, host, plugin FROM mysql.user WHERE user demo_user;把返回结果里所有 host 记录过一遍搞清楚每条记录对应的来源范围。养成先看 mysql.user 再判断授权问题的习惯能帮你避免浪费大量时间在无用功上。从下载安装、临时密码、账号授权到 Workbench 连接这一套流程走完你实际上已经把 MySQL 8.0 在 Linux 上的完整生命周期摸了一遍。我自己实测下来整个环境搭建最花时间的从来不是安装本身而是定位那些看似小却层层嵌套的连接问题。作为这个系列任务的起步阶段把基座打好也意味着后面在做表结构设计、写 SQL、调性能的时候不用再回头怀疑环境有问题。如果在实操中卡在某个报错上建议先按日志关键词搜索而不是急着重装很多问题翻日志就能找到答案。