资讯动态

Ubuntu 22.04 安装 MySQL 全流程指南:从选型到排错

发布时间:2026/10/3 3:31:38 来源:尧图企业网站定制
如果你正打算在 Ubuntu 22.04 上装 MySQL我猜你多半已经撞过几个坑——要么是默认源里的版本装完发现行为不对要么是服务起不来报一堆 socket 错误要么是本地工具连不上报各种认证和 SSL 问题。这篇文章我把自己的完整实操流程、选型思路和踩坑记录全部整理出来从环境检查、三种安装方式的对比到安全初始化、配置调优再到远程访问和常见故障排查每一步都给出具体命令和解释照着做基本不会走弯路。1. 安装前先把环境摸清楚1.1 确认系统版本与架构这一步虽然基础但真不能跳过。很多人在网上抄了一段命令装上之后才发现系统版本或者 CPU 架构跟教程对不上然后一脸懵。我先建议你执行下面两条命令确认环境再动手lsb_release -a uname -mlsb_release -a会输出发行版版本号这里我们要确认是 Ubuntu 22.04.xx LTS。uname -m输出硬件架构大多数服务器和桌面机是x86_64如果是 ARM 的云主机输出一般会是aarch64。这两个信息决定了后面用哪个版本的安装包尤其是去官方仓库下载时选错架构是装不上的。顺手还可以看一眼内存和磁盘free -h df -h /var/lib/mysqlMySQL 的数据目录默认在/var/lib/mysql装之前就得确认这块分区剩余空间够用别装到一半磁盘满了。内存这里顺便看方便后面调innodb_buffer_pool_size。1.2 检查并清理历史残留如果你之前装过 MySQL、MariaDB 或者 Percona残留的配置和数据文件会干扰新安装表现可能是端口被占、服务起不来、socket 路径混乱。先查一下dpkg -l | grep -E mysql|mariadb|percona有输出就说明系统里有相关包。如果确定不需要旧数据建议彻底清理sudo apt purge mysql-server mysql-client mysql-common -y sudo apt purge mariadb-server mariadb-client -y sudo apt autoremove -y sudo rm -rf /var/lib/mysql /etc/mysql注意/var/lib/mysql是数据目录rm -rf之前一定要确认里面没有你要保留的数据库。删错了就真的找不回来了。如果只是想升级或者重装、但数据还得要那就别删数据目录只 purge 软件包就行装新版本的时候 MySQL 会复用原来的数据目录不过跨大版本升级时建议先备份再操作。1.3 三条安装路线到底怎么选Ubuntu 22.04 上装 MySQL主流路线有三种我分别说清楚适用场景免得你选错安装方式优点缺点适合场景apt 直接安装命令短依赖自动解决和系统集成好版本跟着 Ubuntu 源走通常不是最新快速部署、学习测试、懒人首选官方 APT 仓库安装版本可选更新及时官方维护要多几步添加源的流程生产环境、需要指定小版本的场景Docker 容器运行隔离干净迁移方便不影响宿主机数据卷和网络要自己管理多一层抽象开发环境、微服务架构、多实例需求我个人建议生产环境优先用官方 APT 仓库。不是说 Ubuntu 源里的 MySQL 不能用而是官方仓库能让你自己控制安装哪个小版本。比如你想装 8.0.36 而不是系统源里的 8.0.35只有官方仓库能精确控制。如果只是本地开发或者学语法apt install mysql-server一条命令就很香省时省力。2. 实操一步步把 MySQL 装上2.1 一条 apt 命令搞定快速方案先更新索引再安装sudo apt update sudo apt install mysql-server -yUbuntu 22.04 的默认源里是 MySQL 8.0不是 5.7这点和旧版 Ubuntu 不一样装完不用惊讶为什么版本号是 8.0.x。整个安装过程基本全自动不会弹窗让你输密码因为 Ubuntu 里 MySQL 的 root 用户默认走的是auth_socket认证本地直接sudo mysql就能进根本不需要密码。这个设计我们后面专门讲很多人第一次用会懵。装完之后先别急着配置确认服务已经起来了sudo systemctl status mysql如果显示active (running)就说明 OK。如果没起来别慌先看日志sudo tail -n 50 /var/log/mysql/error.log这一步能排查掉一半的启动问题。日志在/var/log/mysql/error.log路径别记错。2.2 用官方仓库安装指定版本更可控上面那种方式固然快但版本完全由 Ubuntu 仓库决定。有时候你照着网上教程操作人家的默认配置文件路径和你系统里不一样就是因为版本差异。想要更可控就用官方 APT 仓库。先去 MySQL 官方下载页拿最新的 APT 仓库配置包当前稳定版本一般是mysql-apt-config_0.8.xx-x_all.deb这种命名。下载后安装wget https://repo.mysql.com//mysql-apt-config_0.8.33-1_all.deb sudo dpkg -i mysql-apt-config_0.8.33-1_all.deb执行dpkg -i的时候会弹出一个蓝底配置界面让你选择要安装的 MySQL 版本。默认是 MySQL 8.0直接选 Ok 确认就行。这一步本质上是把 MySQL 官方的软件源写进/etc/apt/sources.list.d/之后apt update就能看到官方仓库里的包了。然后再安装sudo apt update sudo apt install mysql-server -y注意如果apt update时报 GPG 签名错误通常是系统缺少 MySQL 官方仓库的签名公钥。解决办法是把仓库配置里signed-by指向的 keyring 文件补上或者重新安装一次mysql-apt-config包它会自动把密钥装好。还有个小技巧安装完成后可以查看具体版本确认装对了mysql --version输出像mysql Ver 8.0.36 for Linux on x86_64这样版本号就是你装到的实际版本。2.3 服务启动与状态检查无论是哪种方式装完MySQL 在 Ubuntu 上默认都是一个名为mysql的 systemd 服务不是mysqld。日常管理就记住这几条sudo systemctl start mysql # 启动 sudo systemctl stop mysql # 停止 sudo systemctl restart mysql # 重启 sudo systemctl enable mysql # 设置开机自启 sudo systemctl status mysql # 查看状态装完默认是开机自启的enable这步通常不需要手动做。有些教程里让你直接执行service mysql start这个命令在 Ubuntu 上也能用底层还是走 systemd。检查服务是不是真的在干活我习惯用三个手段sudo systemctl status mysql ps -ef | grep mysqldstatus显示的是 systemd 视角ps看到的是真实进程。有时候 systemd 说 active但端口没监听这时候再查一下端口sudo ss -tlnp | grep 3306正常会看到LISTEN 0 151 127.0.0.1:3306这样的输出。注意默认 MySQL 只监听127.0.0.1也就是说只能本机连这是安全默认配置后面改远程访问时再放开。3. 安全初始化与日常配置3.1 mysql_secure_installation 全程详解装完 MySQL 第一件事就是跑安全初始化脚本这是官方提供的向导用来处理初始账号、匿名用户、测试库这些安全问题sudo mysql_secure_installation这个脚本会一步步问你问题我一个个说首先是问你要不要装密码校验插件。建议选Y它能强制要求密码强度避免你设个123456就上线。如果你嫌烦也可以选N但生产环境我不建议你这么干。然后会提示你设置 root 密码。不过这里有个特殊情况如果你前面没改过 root 的认证方式这里会提示 root 用的是auth_socket你可以选择留在auth_socket模式或者切换到密码认证。具体选择我下一节说。后面几个问题处理逻辑很简单移除匿名用户选Y。匿名用户等于让任何人无密码接近你的数据库没理由留着。禁止 root 远程登录选Y。root 只允许本地登录这是底线。远程访问用后面创建的专用账号。删除 test 测试库选Y。测试库默认所有人都能访问删掉干净。重载权限表选Y。让上面的修改立刻生效。跑完这个脚本MySQL 的基本安全姿势就到位了。3.2 root 用户 auth_socket 认证的前因后果很多刚从 CentOS 转到 Ubuntu 的人会在这里卡很久因为明明没设密码mysql -u root -p却怎么都登不进去而直接执行sudo mysql却能秒进。这不是你操作错了是 Ubuntu 上 MySQL 默认给 root 配了auth_socket认证不是密码认证。auth_socket的机制很简单MySQL 不去验证密码而是验证当前操作系统用户是不是 root 或者是不是通过 sudo 过来的。只要系统层面你是 rootMySQL 就认你。这样设计的初衷是好的——本地 root 访问数据库够安全不用记密码也杜绝了远程爆破 root 的口子。但实际使用中很多人需要让 root 也能用密码登录比如要用 Navicat 或者程序连库。这时候需要把认证方式改掉sudo mysql进入 MySQL 后执行ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY 你的强密码; FLUSH PRIVILEGES;这样 root 就从auth_socket切到了caching_sha2_password之后就能用密码登录了。注意 MySQL 8.0 默认的密码认证插件就是caching_sha2_password不是 5.7 时代的mysql_native_password很多老客户端连不上 8.0 就是这个原因后面故障章节再细说。3.3 配置文件里的关键参数MySQL 的主配置文件在/etc/mysql/mysql.conf.d/mysqld.cnfUbuntu 上用这个路径跟 CentOS 的/etc/my.cnf不太一样。别改错了文件改完重启才生效。我每次部署都会重点调这几个参数[mysqld] character-set-server utf8mb4 collation-server utf8mb4_unicode_ci max_connections 200 wait_timeout 600 interactive_timeout 600 innodb_buffer_pool_size 1G逐个解释。character-set-server和collation-server设置数据库默认字符集为utf8mb4。现在都什么年代了别再用latin1iOS 的表情、生僻字这些utf8都不够用必须utf8mb4。这个在生产环境尤其重要建库的时候忘了指定字符集后面改起来非常麻烦。max_connections是最大连接数。开发环境默认 151 够用但生产环境一旦有连接池、多个应用实例默认值分分钟被打满。我见过最典型的案例就是 Java 连接池配置了 50 个连接加上运维自己查数的连接151 就爆了。建议先改到 200 或更高同时观察实际连接数再微调。wait_timeout和interactive_timeout是空闲连接超时。默认 28800 秒也就是 8 小时太长了连接池里的空闲连接会占着资源不还。调到 600 秒左右比较合理连接池会自动重连对应用影响不大但能把连接数降下来。innodb_buffer_pool_size是最关键的性能参数它决定 InnoDB 用多少内存做数据缓存。一个常见误区是觉得 MySQL 默认配置就行实际上默认只有 128MB对稍微有点数据量的库都远远不够。建议设为物理内存的 60% 到 70%。比如 8G 内存的机器设 5G。改完配置记得重启sudo systemctl restart mysql验证一下配置有没有生效mysql -u root -p -e SHOW VARIABLES LIKE innodb_buffer_pool_size;能查到刚才设置的值就说明配置已经加载了。4. 远程访问与客户端工具连接4.1 放开监听地址默认 MySQL 只监听本地回环地址网卡上的 3306 端口对外是完全不开放的。这是好事是安全基线。但你总归要远程连不然光靠 SSH 到服务器上敲终端的日子太难受。改监听地址找到配置文件这一段bind-address 127.0.0.1改成bind-address 0.0.0.00.0.0.0表示监听所有网络接口。如果你只想让某一个内网 IP 能连也可以写成具体的 IP 地址比如192.168.1.10这种写法更精准我生产环境通常这么干而不是无脑0.0.0.0。改完重启sudo systemctl restart mysql sudo ss -tlnp | grep 3306如果看到监听地址变成了0.0.0.0:3306说明已经放开了。4.2 创建专用账号并授权远程访问绝对不要用 root。项目需求谁就用谁的名字建账号权限最小化这是数据库管理的铁律。进入 MySQL创建用户并授权CREATE USER demo% IDENTIFIED BY StrongPass_2024; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON demo_db.* TO demo%; FLUSH PRIVILEGES;%表示允许从任意主机连如果只想让某个网段连可以写192.168.1.%这样更安全。上面GRANT只给了demo_db数据库的常见增删改查权限没有给全局权限。当然应用初始化需要有建表权限所以加了CREATE和DROP但PROCESS、SUPER这种危险权限一个都没给。如果你的场景是多个数据库都要访问可以改成GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO demo%;但*.*是全局授权务必想清楚再给。授权完查一下确认SHOW GRANTS FOR demo%;4.3 防火墙与 Navicat 连接实战监听地址放开后别忘了服务器上还有一层防火墙。Ubuntu 上最常用的是 ufwsudo ufw allow 3306/tcp sudo ufw status如果ufw status显示inactive那说明防火墙没启用但别高兴太早云服务器的话还有安全组这一层。云厂商控制台里入方向规则要放行 3306否则本地防火墙怎么放都没用。这是新手最容易忽略的服务器上规则全对客户端就是连不上最后查出来是安全组没放。客户端工具连接时MySQL 8.0 有俩坑第一个坑是 SSL。MySQL 8.0 默认开启 SSL很多老版本客户端或特定编程语言的连接库会在 handshake 阶段报SSL connection error。如果你的网络环境或者生产链路上不需要加密可以在连接参数里禁掉 SSL比如 Navicat 的高级设置里关闭 SSL或者命令行加mysql -h 192.168.1.100 -u demo -p --ssl-modeDISABLED注意这会降低传输安全性公网环境不建议这么搞内网测试无所谓。第二个坑是caching_sha2_password认证。MySQL 8.0 默认启用这个新插件但 8.0.4 之前的老客户端、老版本 JDBC 驱动根本不认识它连的时候会报Authentication plugin caching_sha2_password cannot be loaded。解决办法有两个升级客户端驱动到 8.0 以上版本或者为了迁就老客户端把用户切回mysql_native_passwordALTER USER demo% IDENTIFIED WITH mysql_native_password BY StrongPass_2024;我的建议是能升级客户端就升级客户端mysql_native_password是旧时代的认证方式密码哈希强度低新项目没必要迁就。实在有历史包袱再用第二种。连接池也需要提一嘴。很多应用用 HikariCP、Druid 这样的连接池连 MySQL 8.0连接串里记得显式指定useSSLfalseallowPublicKeyRetrievaltrue如果是测试环境不想用 SSL。allowPublicKeyRetrieval这个参数在 MySQL 8.0 的 caching_sha2_password 认证下基本是必须的不然客户端拿不到公钥会报错说 RSA public key retrieval 不可用。这是 JDBC 连接 MySQL 8.0 的老大难问题先把这个参数写上就省事了。5. 踩坑实录与故障排查5.1 服务起不来的排查思路服务起不来的原因五花八门但排查顺序是有规律可循的。第一步永远先看错误日志sudo tail -n 100 /var/log/mysql/error.log我见过的情况里最常见的是这几种数据目录权限不对。MySQL 进程是以mysql用户跑的如果/var/lib/mysql的所有者不对进程就没有读写权限起不来。修复方式sudo chown -R mysql:mysql /var/lib/mysql磁盘写满。日志里如果出现No space left on device那就是磁盘满了。MySQL 启动时要在数据目录里建临时文件空间不够直接失败。清理磁盘后重启一般能恢复。配置文件里写了不存在的路径或者参数值不合法。比如innodb_buffer_pool_size写成了小于 128M 或者非法格式InnoDB 初始化直接终止。这种错误日志里会有明确的unknown variable或者Server startup terminated之类提示。还有一种是端口被占。如果之前装过别的 MySQL 实例或者有应用自己监听了 3306新进程 bind 端口失败也会起不来。排查sudo ss -tlnp | grep 3306看看是谁占着端口。5.2 ERROR 2002 连不上 socket这个报错大概是 MySQL 新手最常见的错误之一ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/run/mysqld/mysqld.sock (2)看到这个报错第一反应不一定是 MySQL 没启动。先分情况检查如果服务已经起来了但 socket 文件不存在多半是/var/run/mysqld目录权限或属主不对。这个目录是系统启动时动态创建的有时候人为操作会把它搞没或者属主变成了 rootsudo mkdir -p /var/run/mysqld sudo chown mysql:mysql /var/run/mysqld sudo systemctl restart mysql如果是服务根本没起来那先回到 5.1 节排查启动问题。另外还有一种情况是 socket 路径不一样。有人改了配置文件里的socket路径但客户端连接的时没注意默认mysqld.sock就会出现找不到 socket。此时用mysql_config --socket或者查看my.cnf确认实际路径。5.3 caching_sha2_password 导致的认证失败MySQL 8.0 的认证失败一半以上跟密码本身没关系是caching_sha2_password这个插件在作祟。报错通常是Authentication plugin caching_sha2_password cannot be loaded或者客户端直接提示access denied但密码明明是对的。老客户端、老语言库、老运维工具只要是 8.0.4 之前时代的产物基本都不认识这个新插件。Java 的 JDBC 驱动 8.0 之前、Python 的mysql-python、PHP 的老版本 mysqli全会踩这个坑。排查确认是这个问题用新客户端进去查一下用户认证方式SELECT user, host, plugin FROM mysql.user WHERE user demo;如果输出caching_sha2_password而这个用户是程序用的且程序没法升级那就只能把用户认证方式切回mysql_native_password代码在 4.3 节给过了。如果这个用户是临时排查用的建议直接把用户删了重建用新的默认认证。我的个人经验是在自己电脑上准备一套新版的 MySQL 客户端工具遇到老程序连不上数据库时先用新工具连上去看看具体报错别在程序配置里瞎改。很多所谓的数据库连接失败根本不是网络问题就是认证插件不兼容。5.4 忘记 root 密码的急救流程忘记 root 密码是最容易让人慌的场景尤其生产环境。但 MySQL 8.0 在 Ubuntu 上有两条路可以走。第一条路如果系统能 sudo而 root 账号没有改成密码认证还是auth_socket那就直接sudo mysql这是最快的方式根本不需要密码。进去之后用ALTER USER重设密码就行操作在 3.2 节已经写了。第二条路root 账号已经被改成了密码认证密码又忘得干干净净。这时候要走skip-grant-tables模式绕开权限校验启动 MySQL。流程如下sudo systemctl stop mysql sudo mkdir -p /var/run/mysqld sudo chown mysql:mysql /var/run/mysqld sudo mysqld_safe --skip-grant-tables 注意mysqld_safe以后台方式启动启动完成后用任意身份登录mysql -u root进去第一件事是刷新权限表不然ALTER USER会报权限不足FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 新密码;改完密码退出然后重启服务恢复正常模式sudo killall mysqld_safe sudo killall mysqld sudo systemctl start mysqlmysqld_safe是 MySQL 的一个守护包装进程正常生产环境很少直接用它但急救的时候非常好使。操作完记得确认服务已经切回正常模式别留着skip-grant-tables裸奔那等于数据库没有门锁任何人连上来都能为所欲为。踩过几次坑之后我有一个习惯装完 MySQL 的第一时间就把 root 改成密码认证然后把密码写进自己本地的密码管理工具里顺手导出一份干净的基础配置作为基线存档。这样等真出问题时排查路径清晰恢复动作也快不用每次都在网上海搜一通拿命验证那些半对半错的一键修复命令。希望这份实操笔记能帮你少走点弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑