ARTICLE DETAIL

资讯详情

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

Ubuntu 22.04安装MySQL 8.0全流程:从源配置到远程连接与故障排查

Ubuntu 22.04安装MySQL 8.0全流程:从源配置到远程连接与故障排查 1. 安装前的准备与方案选型1.1 为什么选择 Ubuntu 22.04 LTS MySQL 8.0我在 Ubuntu 22.04 上安装 MySQL 的次数两只手数不过来。不是因为我记性差而是每次帮朋友、同事、学员处理环境都会在这套组合上走一遍完整流程。Ubuntu 22.04 LTS 是 Canonical 在 2022 年 4 月发布的长期支持版本官方保证五年维护周期一直持续到 2027 年。搭配 MySQL 8.0无论是搭个人博客、跑 JavaWeb 课程设计还是给小型业务系统做数据存储这套组合都是当下最省心的选择之一。为什么要专门写 Ubuntu 22.04 的安装教程因为 Ubuntu 20.04 默认给你装的是 MySQL 8.0.19 左右而 Ubuntu 22.04 的 apt 源里带的是 MySQL 8.0.28 以上版本经历了多个小版本迭代像 cached_sha2_password 认证插件的兼容性问题、排序规则默认值这些细节都不一样。很多在网上搜到的旧教程会告诉你改 my.cnf 里某个参数但放到 22.04 上可能完全没效果。另外一个现实情况是绝大多数人装 MySQL 不是为了学习而是为了用后面要接 Navicat、要远程连接、要和 Java/Python 程序对接。这些场景下安装本身只是第一步真正的坑全在配置、权限、认证方式这些后续环节。所以我这篇不止讲怎么装更会把我实际踩过的坑、排查思路一起写出来。如果你属于下面这几类人这篇内容会比较对胃口刚接触 Linux 的学生、准备部署个人项目的开发者、以及需要在服务器上快速搭环境又不想被各种报错折磨的运维新手。如果你已经是老手了可以直接跳到第 4 节看故障排查那部分我花了不少篇幅整理真实案例。1.2 三种安装方式对比APT源、官方仓库、源码编译很多第一次接触 Linux 的朋友会问安装 MySQL 难道不是一条命令的事情吗确实是但能跑和好用是两码事。我先说结论在 Ubuntu 22.04 上我强烈推荐用官方 APT 仓库安装其次才是系统自带源源码编译一般情况下没必要碰。系统自带的 apt 源最简单sudo apt install mysql-server一行搞定。但有一说一Ubuntu 仓库里的 MySQL 版本更新存在延迟而且有些编译参数是 Ubuntu 团队按自己的策略调整过的。比如在 Ubuntu 22.04 上系统源里默认把mysql_native_password插件标记为 Deprecated这个细节会让不少用老版本 Navicat 的同事抓狂。官方 APT 仓库则是由 MySQL 官方维护的你拿到的是官方编译的二进制包版本更新及时配置行为更接近 MySQL 官方文档描述。安装过程稍微多几步下载仓库配置文件、更新索引、再安装。我后面给的完整实操就是这个方案。源码编译安装适合两种人一种是想在特殊硬件架构上运行、官方没有提供对应二进制包的场景比如某些 ARM 开发板另一种是极客玩家想自己定制编译参数优化性能。代价是编译时间动辄半小时起步还得自己解决一堆依赖库问题。日常开发、生产部署完全没有必要走这条路。三种方式的核心差异我用一个表格整理出来方便你按场景对号入座安装方式操作难度版本更新速度配置可控性推荐场景系统 apt 源极低慢跟随 Ubuntu 发布节奏一般部分参数被 Ubuntu 定制本地快速体验、学习环境官方 APT 仓库中低快官方同步发布高接近官方默认行为开发环境、生产服务器源码编译高取决于你自己最高任意定制特殊架构、极端性能定制1.3 安装前必须完成的系统检查不管选哪种方式动手之前我建议你先花两分钟做一轮系统检查能帮你避免后面一半以上的低级问题。第一件事确认系统版本。Ubuntu 22.04 和 20.04 的安装命令虽然一样但源配置方式有差异。用lsb_release -a看一眼或者看/etc/os-release文件内容。如果你发现自己的系统其实是 20.04 或者 24.04还在照着 22.04 的教程走有些步骤会莫名其妙失败。第二件事检查系统资源。MySQL 8.0 默认配置下内存占用在 300MB 到 500MB 左右如果你的云服务器只有 1GB 内存装完之后最好主动调低innodb_buffer_pool_size这类参数不然系统会因为内存不足触发 OOM Killer。查看内存用free -h查看磁盘空间用df -h这两个命令十秒钟搞定。第三件事看端口占用。MySQL 默认监听 3306 端口如果之前装过其他数据库或者某些应用占了这个端口后面启动服务时会报错。用ss -lntp | grep 3306确认一下端口是空闲的。如果被占了要么先停掉占用程序要么安装后修改 MySQL 的端口配置。第四件事确保服务器时间准确。这个问题容易被忽略但很实际MySQL 的日志和事务时间戳都依赖系统时间如果时间偏差太大会出现各种诡异问题。用timedatectl查看当前时区如果发现时区不对执行sudo timedatectl set-timezone Asia/Shanghai设置成你所在时区。这四项检查做完你的系统基本就是干净可安装的状态了。我见过有人在/var/lib/mysql目录残留旧数据的情况下直接 install结果初始化阶段就报错所以如果你的服务器之前装过 MySQL 并且没卸载干净最好先检查一下这个目录是否存在旧文件。2. 通过官方APT仓库安装MySQL 8.0的完整实操2.1 配置官方MySQL APT源我实际测试下来在 Ubuntu 22.04 上配官方源最稳妥的方法是借助 MySQL 官方提供的配置工具。打开终端依次执行下面的命令。# 下载 MySQL APT 配置包 wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb这里有个细节需要注意MySQL 官方会把配置包的版本号更新你如果发现 0.8.29 下载失败可以访问https://dev.mysql.com/downloads/repo/apt/页面手动查看最新版本号。下载完成后用 dpkg 安装这个配置包sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb安装过程中会弹出图形界面让你选择要启用的 MySQL 版本。这里默认就是 MySQL 8.0直接选 OK 确认即可。如果你手抖选了其他版本也不用慌张安装完成后可以手动编辑/etc/apt/sources.list.d/mysql.list文件来修改。图形界面选完后更新一下软件源索引让 apt 识别到刚才加入的 MySQL 官方仓库sudo apt update执行完之后用apt-cache policy mysql-server检查一下候选版本信息如果显示的版本号是8.0.x且来自mysql-8.0仓库说明源配置成功了。这一步我强烈建议每次都做因为很多人配完源直接 install结果还是从 Ubuntu 自带源装的版本完全不对。这里还要提醒一件事不要在同一台机器上混用 Ubuntu 自带源和 MySQL 官方源。两者对数据目录的初始化方式有一点差异如果你先用自带源装了一遍卸载后再用官方源装很可能因为残留的配置文件和 systemd 服务单元导致服务起不来。遇到这种情况我后面第 4 节会给详细的清理方案。2.2 执行安装并启动服务源配好之后安装命令就非常朴素了sudo apt install -y mysql-server安装过程大概需要一两分钟取决于网络速度。装完之后 MySQL 服务会自动启动不过我还是建议手动确认一下状态sudo systemctl status mysql如果看到active (running)说明服务已经在运行了。有些教程会让你执行sudo service mysql start但在 Ubuntu 22.04 上用 systemctl 才是正规操作。systemd 是现在的标准服务管理器service命令在老版本系统里还能用在新系统里只是一个兼容包装。接下来执行sudo systemctl enable mysql这一步是把 MySQL 设置成开机自启。很多人装了 MySQL 重启服务器之后发现数据库连不上了就是因为没执行这条命令。虽然默认情况下官方源安装的 MySQL 会自动启用开机自启但自己动手敲一遍更稳妥这条命令没有任何副作用。2.3 安全初始化脚本必做安装完成不等于可以直接用。MySQL 8.0 在 Ubuntu 上安装后root 用户默认使用auth_socket认证插件意思是只能通过系统 root 用户登录登录时不用密码。这个设计本身是安全的但对你日常使用来说很不方便因为你总不能每次操作都sudo mysql进去。这时候就要执行 MySQL 官方提供的安全初始化脚本sudo mysql_secure_installation这个脚本会一步步引导你完成几项安全设置我逐个说一下实际过程中会遇到什么。第一项是问你要不要配置密码校验插件。MySQL 8.0 的密码校验插件默认强度是 MEDIUM要求密码至少 8 位包含数字、大小写字母和特殊字符。你如果只是本地学习用可以选 No 跳过后面用弱密码图个方便如果是要部署到线上我建议选 Yes 并设置一个强密码。密码这东西后期改起来挺麻烦的一步到位更省心。第二项是设置 root 密码。这里尤其要注意如果你前面选了启用密码校验插件密码强度不够会直接报错。即使没有强制启用我也建议你用一个自己能记住的强密码或者把密码记到密码管理工具里。我见过太多人装完 MySQL 一周之后忘了 root 密码然后就得上第 4 节的紧急恢复流程。第三项是删除匿名用户这个直接 Yes。匿名用户意味着任何人不需要账号密码就能连接数据库这在生产环境是绝对不允许的。第四项是禁止 root 远程登录这个也选 Yes。根账号只允许本地连接远程访问应该通过专用账号这样权限控制更清晰也能降低账户被爆破的风险。第五项是删除测试数据库test选 Yes。这个库是空的留下没有任何意义反而多了一个潜在的攻击面。第六项是重新加载权限表选 Yes让刚才的修改立即生效。整个脚本执行完你的 MySQL 才算一个处于安全默认状态的数据库服务。注意我这里说的是默认安全后面你启用远程连接加入新用户时边界还是要自己控制好。3. 远程访问配置与连接工具实战3.1 修改监听地址与防火墙规则本地安装完 MySQL 后默认监听地址是127.0.0.1这表示只允许本机连接。你要在另一台电脑上用 Navicat 或者通过程序远程连接就必须修改监听地址。编辑 MySQL 配置文件sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf找到这一行bind-address 127.0.0.1改成bind-address 0.0.0.00.0.0.0表示监听所有网络接口。如果你只想让某个网段的机器访问也可以填具体的 IP 地址比如bind-address 192.168.1.0这种写法虽然不常见但确实可以。改完保存退出重启 MySQL 让配置生效sudo systemctl restart mysql这里要注意bind-address 只是让 MySQL 监听所有接口真正的访问控制靠的是用户权限配置。你改了监听地址但不授权任何远程用户远程连接依然会被拒绝错误消息是Host xxx is not allowed to connect to this MySQL server。这两个配置缺一个都不行。接着处理防火墙。Ubuntu 22.04 默认通常没有启用 UFW 防火墙但如果你之前手动启用过就需要放行 3306 端口sudo ufw allow 3306/tcp如果你是云服务器还得去云厂商的控制台在安全组里放行 3306 端口。这一步很多人会忘记本地测试没问题一到云服务器上远程连接就超时八成就是安全组没配。3.2 创建远程用户与权限授权修改监听地址只是第一步还得在 MySQL 里创建一个允许远程登录的用户。用 root 登录数据库sudo mysql -u root -p注意这里和 Ubuntu 20.04 不一样因为你在 2.3 节已经设置了 root 密码所以需要加-p参数。然后执行创建用户的语句CREATE USER dev% IDENTIFIED BY YourStrongPassword123!;这个语句创建了一个名为dev的用户%表示允许从任何 IP 地址连接。如果只想允许某个特定 IP可以写成dev192.168.1.100这样更安全。接着给这个用户授权GRANT ALL PRIVILEGES ON *.* TO dev%; FLUSH PRIVILEGES;这里我用*.*表示所有库的所有权限实际生产环境建议按需授权比如只给某个应用库的权限GRANT ALL PRIVILEGES ON my_app_db.* TO dev%; FLUSH PRIVILEGES;MySQL 8.0 和 5.7 在授权时有个差异5.7 里GRANT ALL PRIVILEGES会自动创建用户8.0 里必须先执行CREATE USER再授权顺序不能反。很多人从旧教程里复制命令过来直接报错就是这个原因。授权完成后你可以先本机测试一下用户是否能正常登录mysql -u dev -p -h 127.0.0.1这一步通过之后再测试远程连接就不容易出错了。本机测都连不上必然不是防火墙的问题而是用户或认证方式的问题排查范围一下缩小很多。3.3 认证插件导致的连接报错这是 MySQL 8.0 安装后最常遇到的问题特别是在用 Navicat 旧版本或者部分老程序的场景中。MySQL 8.0 默认的认证插件是caching_sha2_password而 MySQL 5.7 时代默认的是mysql_native_password。很多图形化客户端和旧版驱动程序只实现了后者连接时会报错Authentication plugin caching_sha2_password cannot be loaded或者Unable to load authentication plugin caching_sha2_password我在 Ubuntu 22.04 上就遇到过 Navicat 15 之前的老版本连不上新装的 MySQL 8.0就是认证插件不兼容。解决方案有两条路第一条路升级客户端工具。Navicat 16 及以上版本已经完整支持caching_sha2_password这是官方推荐的长远方案。我之前用 Navicat 16 连 MySQL 8.0 就没有任何问题。如果你用的是 Python 的 PyMySQL要确保版本不低于 0.9.3Java 的 JDBC 连接器则建议用 8.0.x 系列。第二条路把用户的认证插件改回mysql_native_password。这个方案适合那些无法升级客户端的场景。在 MySQL 命令行里执行ALTER USER dev% IDENTIFIED WITH mysql_native_password BY YourStrongPassword123!; FLUSH PRIVILEGES;改完后你用老客户端就能连上了。但我要提前说明白MySQL 官方已经声明mysql_native_password是废弃插件未来版本会彻底移除所以这只是一种兼容性过渡方案不是长久之计。SSL 连接错误也是热搜词里出现频率很高的一个。MySQL 8.0 默认启用了 SSL 连接如果你在连接字符串里强制启用了 SSL 但服务器端证书配置不对就会报SSL connection error。排查时先确认用的客户端版本是否支持 MySQL 8.0 的 SSL 协议然后在连接参数里把useSSLfalse试一下如果这样能连上说明问题就出在 SSL 证书链上。4. 常见故障与排查技巧实录4.1 服务无法启动看日志才是正路MySQL 服务无法启动是我在搜索热词里看到频率最高的一个问题。面对这个问题第一反应不该是去网上搜MySQL 启动失败怎么办而是打开日志文件看具体报错。Ubuntu 22.04 上 MySQL 的错误日志默认在/var/log/mysql/error.log用tail -n 50查看最新的日志内容sudo tail -n 50 /var/log/mysql/error.log我遇到最多的启动失败场景是数据目录权限不对。MySQL 的数据目录在/var/lib/mysql这个目录的所有者必须是mysql用户。如果你用 root 手动操作过这个目录比如复制过数据文件权限就变了服务自然起不来。修复方法sudo chown -R mysql:mysql /var/lib/mysql sudo systemctl start mysql第二个常见原因是磁盘空间满了。df -h看一下根分区的使用率如果达到 100%MySQL 会连错误日志都写不进去启动直接失败或者干脆没反应。这种场景下先清出空间再启动别盯着 MySQL 配置瞎折腾。第三个原因是配置参数写错了。比如你在mysqld.cnf里设置了一个无效的参数名或者某个参数的取值超出范围MySQL 在启动时解析 config 失败也会起不来。日志里会明确告诉你哪个参数有问题照着改就行。还有一种容易忽略的情况/var/run/mysqld目录不存在或者权限不对。这个目录是 MySQL 运行时存放 socket 文件的地方如果缺失会导致启动报错。修复办法也很简单sudo mkdir -p /var/run/mysqld sudo chown mysql:mysql /var/run/mysqld最后说一个 Windows 上常见的报错因为热搜词里也有net start mysql mysql 服务无法启动这条是 Windows 下的经典问题和 Ubuntu 不是一回事。但在排查思路上是通用的查看 Windows 事件查看器里的 MySQL 错误日志确认是数据目录初始化问题还是配置文件路径问题本质上和 Linux 上看日志定位问题是同一个方法论。4.2 忘记 root 密码的应急恢复流程忘记 MySQL root 密码是每个使用者都会遇到的场景我给你一个在 Ubuntu 22.04 上实测有效的恢复流程。首先停掉 MySQL 服务sudo systemctl stop mysql然后以跳过权限验证的方式启动 MySQLsudo mysqld_safe --skip-grant-tables 注意这里有个细节老版本用--skip-grant-tables启动后root 登录不需要密码直接mysql -u root就能进去。但 MySQL 8.0 里即使跳过权限表你直接无密码登录也是不行的因为auth_socket插件依然会拦截。正确做法是登录后先刷新权限表mysql -u root进入 MySQL 命令行后执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPassword123!;搞定后退出重启 MySQLsudo systemctl restart mysql这里我用的是ALTER USER而不是UPDATE mysql.user SET authentication_string...因为 8.0 已经不再支持直接修改authentication_string字段来改密码旧教程里的方法在 8.0 上会得到空密码但登录不进去的诡异状态。整个流程里最容易踩的坑是mysqld_safe启动方式。在 Ubuntu 22.04 上你可能已经用了 systemd 管理服务此时再手动跑mysqld_safe两者会产生冲突。更稳妥的方式是sudo mkdir -p /var/run/mysqld sudo chown mysql:mysql /var/run/mysqld sudo mysqld --skip-grant-tables --skip-networking --skip-networking参数表示不监听网络端口只允许本地 socket 连接这样可以防止其他人趁你跳过权限验证的时候远程连进来安全系数更高。4.3 中文乱码与字符集配置装好 MySQL 之后插入中文数据出现乱码或者?问号基本是字符集配置没做对。Ubuntu 22.04 上 MySQL 8.0 的默认字符集其实是utf8mb4这一点比老版本强很多但你还是得确认一下实际生效值。登录 MySQL 执行SHOW VARIABLES LIKE character_set%;查看结果里character_set_server和character_set_database的值。如果是utf8mb4那就没有问题如果还是latin1手动修改配置文件[mysqld] character-set-server utf8mb4 collation-server utf8mb4_unicode_ci改完重启 MySQL 生效。这里解释一下为什么用utf8mb4而不是utf8MySQL 里的utf8字符集最多只支持 3 个字节的 Unicode 字符这意味着像 emoji 这种 4 字节字符根本存不进去会直接报错。utf8mb4才是完整支持 Unicode 的字符集能存下所有字符。排序规则unicode_ci在排序和比较时大小写不敏感适合大多数业务场景。还有一个容易被忽视的点建表时用的字符集。即使服务端和数据库都设置成utf8mb4如果你在建表语句里显式指定了DEFAULT CHARSETutf8那这个表依然是老字符集。建议统一在配置文件层级做默认值设置建表时不指定自然继承数据库的字符集配置。Python 程序连接时遇到中文乱码还有一个额外检查点连接字符串里设置 charset 参数。比如 PyMySQL 连接时可以写pymysql.connect(hostlocalhost, userdev, passwordxxx, databasexxx, charsetutf8mb4)Java JDBC 则在 URL 后面追加参数?useUnicodetruecharacterEncodingutf8。程序端的字符集设置错了即使数据库一切正常照样会乱码。4.4 新装后值得关注的几条配置建议MySQL 装完不是直接丢那不管了。根据我自己的实践有四个配置项建议你在首次使用时就调整好避免后面业务起来了又动手术。第一个是innodb_buffer_pool_size。这个参数是 InnoDB 引擎的缓冲池大小直接决定了 MySQL 对内存的使用量和读写性能。默认值是 128MB对于 1GB 内存的小服务器来说是合适的但如果你的机器有 4GB 以上内存建议调高到物理内存的 60% 到 70%[mysqld] innodb_buffer_pool_size 2G第二个是max_connections。默认值是 151如果你的应用并发高比如网页端和多个服务共享同一个数据库很容易打满这个限制导致连接报错。可以先设成 500 观察一下注意这个值也不是越大越好每个连接都会占用内存要结合服务器内存评估。第三个是慢查询日志。线上排查性能问题全靠它默认是关闭的建议开启[mysqld] slow_query_log 1 slow_query_log_file /var/log/mysql/slow-query.log long_query_time 2long_query_time 2表示执行时间超过 2 秒的 SQL 会被记录下来。刚部署的应用用这个配置跑一阵子你会非常清晰地知道哪些 SQL 需要优化索引。第四个是二进制日志。如果你之后要做主从复制、基于时间点的数据恢复binlog 是必须的。MySQL 8.0 默认已经开启了 binlog日志文件默认在/var/lib/mysql目录下。建议给它设置一个独立的存储位置避免和数据文件混在一起导致 I/O 竞争。5. 踩过这么多坑之后我最想说的几句话这篇写到这里核心内容已经讲完大半。最后我想以个人的经验做一个小结算是给读到这里的同行一点参考。先说一条非常实在的建议看完安装教程之后别急着在生产服务器上操作先在一台虚拟机或者临时服务器上完整走一遍流程。我在自己的电脑上装一个 Ubuntu 虚拟机全流程跑通大概二十分钟。这个过程会暴露几乎所有低级错误比如源没配好、分区空间不够、防火墙拦截。等你在虚拟机上熟练了再去操作生产服务器心理压力和实际失误率都会降很多。再说说安装过程中最不值得做的事情重复造轮子和过度优化。网上有很多人为了 MySQL 优化折腾各种编译参数、改各种内核参数配置写了一大堆最后性能提升有限还引入了奇奇怪怪的坑。对于中小业务场景官方默认配置跑起来完全够用。真实的需求往往很简单装好、能连、数据不丢、查询不慢。把这四件事做好比什么都强。我自己在多次安装和排障过程中感受到最深的一点是很多问题不是 MySQL 本身的 bug而是环境问题、权限问题、版本认知偏差。Ubuntu 22.04 上跑 MySQL 8.0这套组合已经足够成熟稳定绝大多数报错都能在官方文档和日志里找到答案。遇到问题时先冷静下来看日志、确认版本、确认权限按照这个顺序排查基本不会走投无路。最后分享一个小技巧把安装过程中执行的每一条命令和对应的报错都记录成笔记。别嫌麻烦下次遇到同样的问题翻自己的笔记比重新上网搜索快得多。我的本子上就记着好几条从 MySQL 官方文档里摘出来的关键参数比如mysqld --initialize-insecure的用法、caching_sha2_password的兼容性说明这些平时用不到但用到的时候能省你一整个下午的排查时间。如果你在安装过程中遇到上面没提到的其他问题顺着日志文件去排查是最通用的方法。只要 MySQL 能写日志那就没有解决不了的问题。
返回列表