ARTICLE DETAIL

资讯详情

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

Ubuntu 安装 MySQL 8.0 全指南:从配置到远程连接与 SSL 排查

Ubuntu 安装 MySQL 8.0 全指南:从配置到远程连接与 SSL 排查 很多人在 Ubuntu 上装 MySQL最常问的一句话是“为什么我 apt install 之后还是连不上”。这个问题背后往往不是安装本身的问题而是安装完成之后对服务状态、认证方式、网络绑定和客户端协议的理解还差一层。这篇文章我会把整个流程拆开揉碎从环境准备、几种安装方式的取舍、初始化配置、远程访问、SSL 连接错误、日常运维和杂项问题一路讲到卸载重装和几个真实项目里的使用场景。无论你是刚接触 Linux 的新手还是要把 MySQL 用在 JavaWeb 项目、数据库连接池或自动化脚本里的开发者都能在这里找到可以直接照做的步骤和排查思路。1. 装之前先搞清楚三件事版本、发行版、镜像源在跑任何安装命令之前先花两分钟确认环境能省下后面一晚上的折腾时间。1.1 Ubuntu 版本和 MySQL 版本怎么对应Ubuntu 的软件源里自带了 MySQL 的发行版但版本随系统版本变化Ubuntu 版本默认 MySQL 版本备注Ubuntu 20.04MySQL 8.0.x比较经典的组合资料最多Ubuntu 22.04MySQL 8.0.x当前主流稳定Ubuntu 24.04MySQL 8.0.x较新小版本认证插件和 TLS 行为上有变化如果你的项目依赖的是 MySQL 5.7 的某些行为比如mysql_native_password的默认方式、GROUP BY的处理直接 apt 安装的 8.0 可能会让你措手不及。我的建议是新项目认准 8.0老项目要在 5.7 上迁移的用 Docker 跑一个 5.7 容器做兼容测试避免污染宿主机。1.2 检查系统版本和架构在终端执行lsb_release -a uname -m输出示例Distributor ID: UbuntuDescription: Ubuntu 22.04.3 LTSRelease: 22.04Codename: jammy架构x86_64绝大多数情况架构决定了你后面下载离线 deb 包或二进制包时选哪个文件这是不少人忽略的第一步看到i386的包就别点了。1.3 apt 源一定要先换到国内镜像这一步不换的话Ubuntu 官方源在国内的下载速度经常只有几 KB/s你会在等待中怀疑人生。推荐阿里云或清华源二选一sudo cp /etc/apt/sources.list /etc/apt/sources.list.bakUbuntu 22.04 及以后直接编辑/etc/apt/sources.list把archive.ubuntu.com和security.ubuntu.com替换为mirrors.aliyun.com保存后sudo apt update这里有个高频问题ubuntu安装gcc失败。绝大多数情况不是 gcc 本体的问题而是源没更新、源地址陈旧甚至写错导致依赖解析失败。换源之后顺手把常见开发工具链一并装上sudo apt install -y build-essential这个包会自动带上 gcc、g、make后面编译任何东西都用得上。2. 两种主流安装方式对比与选型2.1 apt 直接安装适合绝大多数场景这是最省心、依赖管理最完善的方式sudo apt update sudo apt install -y mysql-server安装完成后sudo systemctl status mysql正常情况下你会看到active (running)。我的习惯是紧接着查一遍版本mysql --version再用mysql_secure_installation做基础安全加固。这一步会问你是否设置密码强度插件、是否移除匿名用户、是否禁止 root 远程登录等我的建议是全部选 yes尤其是移除匿名用户很多人数据库被黑就是因为匿名账户还开着。2.2 离线安装deb 包或二进制包适合内网服务器热搜里出现了linux离线安装mysql和rpm安装mysql说明很多人要在隔离网络里部署。Ubuntu 不吃 RPM要用.deb。去 MySQL 官网下载mysql-server_8.0.x-1ubuntuXX_amd64.deb这类文件然后sudo dpkg -i mysql-server_*.deb大概率会报依赖缺失此时执行sudo apt -f install -y让 apt 自动补齐依赖就行。如果内网连不到任何源那就要在一台能联网的同版本机器上提前导出依赖包sudo apt-get install --download-only mysql-server sudo cp /var/cache/apt/archives/*.deb /my-offline-debs/再把整个目录拷到内网机器上sudo dpkg -i *.deb一起装。二进制包mysql-8.0.x-linux-glibc2.17-x86_64-minimal.tar.xz适合自定义部署路径的场景但初始化、配置、开机自启都要你手工做新手不建议直接用容易栽在目录权限和数据目录初始化上。2.3 VMware 虚拟机里的额外提醒很多人在vmware虚拟机安装ubuntu之后面对两个容易混乱的问题“ubuntu安装虚拟显示驱动”和 MySQL 无关开虚拟机设置里的 3D 加速装上 open-vm-tools 就行别把显卡驱动和数据库故障混在一起排查。虚拟机建议至少分配 2GB 内存MySQL 8.0 默认配置跑起来大约占 300-500MB太小的内存会导致频繁 swap连接性能会很难看。另外热搜里有个 Windows 的错误码mysql e0434352这是 Windows 上安装 MySQL 时 .NET 相关组件失败的错误不是 Ubuntu 的。如果你看到的是错误代码: 0x80070424那是 Windows Installer 服务的问题也跟 Ubuntu 无关不要在 Ubuntu 的排查思路上浪费时间。3. 初始化配置从零开始把数据库调教到可用的状态apt 装完的 MySQLroot 账号默认使用auth_socket认证插件也就是说你在系统命令行用sudo mysql就能进去不需要密码。这设计本身是安全的但实际问题在于你的 JavaWeb 项目或连接池要用 root 远程连的时候就麻烦了。3.1 root 密码与认证方式修改sudo mysql进入 MySQL 后ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的强密码; FLUSH PRIVILEGES;如果你用的 MySQL 8.0.34 以上mysql_native_password仍然可用但官方已经在减弱它的地位。我更推荐直接用默认的caching_sha2_password只是 Python、老版本 JDBC 驱动这些客户端的兼容性要提前确认一下。3.2 字符集和时区几乎是必改项SHOW VARIABLES LIKE character_set%;发现utf8mb4没全上的话改配置文件/etc/mysql/mysql.conf.d/mysqld.cnf[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci default-time-zone08:00改完重启sudo systemctl restart mysql为什么要懂这些因为热搜里出现了mysql将字符串转为日期和mysql设置默认值为0这些操作的结果都会被字符集和时区影响。例如SELECT STR_TO_DATE(2024-01-15, %Y-%m-%d);在乱码的字符集下你看到的日文字段名可能都是乱掉的。时区不对的话NOW()返回的时间会和业务服务器对不上排查起来非常隐蔽。3.3 忘记密码的应急救援流程热搜有ubuntu 忘记登录密码这个分两种情况系统 Linux 账户密码忘了重启进恢复模式改 passwd。MySQL root 密码忘了这个在我的记忆里出现的频率更高处理方式是用skip-grant-tablessudo systemctl stop mysql sudo mysqld_safe --skip-grant-tables --skip-networking sudo mysql -u root然后FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY newpassword;改完直接重启 MySQL不要在生产环境长时间开着skip-grant-tables这个模式等于把数据库大门敞开。4. 远程访问与连接错误从 bind-address 到防火墙的完整链路4.1 绑定地址与用户授权默认情况下 MySQL 只监听127.0.0.1外部机器根本连不进来。这是很多人在 Windows 上用 Navicat 连虚拟机 Ubuntu 里的 MySQL 时“连不上”的头号原因。修改/etc/mysql/mysql.conf.d/mysqld.cnfbind-address 0.0.0.0同时给远程用户授权CREATE USER dev% IDENTIFIED BY password; GRANT ALL PRIVILEGES ON *.* TO dev%; FLUSH PRIVILEGES;我一般不用%全放开线上我建议写成具体 IPCREATE USER app192.168.1.100 IDENTIFIED BY password;这样即使密码泄露攻击者也只能从固定的 IP 来源访问。4.2 Ubuntu 防火墙 ufw 配置sudo ufw allow 3306/tcp sudo ufw enable sudo ufw status还要确认 VMware 虚拟机的网络模式NAT 模式下宿主机访问虚拟机的 3306 端口一般没问题桥接模式则看路由器是否做了隔离。4.3 Navicat / MySQL Workbench 连接报错的排查顺序报Cant connect to MySQL server on x.x.x.x (10060)先 ping 通不通再测端口telnet x.x.x.x 3306都没问题就看防火墙。报Access denied for user rootx.x.x.x说明网络通了是授权问题用前面说的 4.1 步骤给对用户和主机授权。报Authentication plugin caching_sha2_password cannot be loaded客户端太老要么升级客户端要么把用户的认证方式改回mysql_native_password。4.4 mysql ssl 连接错误这个坑值得专门讲热搜里mysql ssl连接错误出现了。这个错误很典型比如你在 JavaJDBC 连接串里写了jdbc:mysql://192.168.1.10:3306/mydb?useSSLtruerequireSSLtrue然后报一堆 TLS 相关错误。MySQL 8.0 默认自带自签名 SSL 证书服务端本身没问题问题几乎都出在客户端校验服务端证书这一步。解决办法有两条路简单粗暴连接串里改成useSSLfalse测试环境我经常这么干。相对正式把服务端的ca.pem拷贝到客户端并在 JDBC 连接串里指定jdbc:mysql://192.168.1.10:3306/mydb?useSSLtrueserverSslCert/path/to/ca.pem还有一个容易被忽略的问题MySQL 8.0 默认开启require_secure_transportOFF但如果全局变量是 ON普通连接会直接被拒。检查一下SHOW VARIABLES LIKE require_secure_transport;5. 运维与杂项存储引擎、连接池、系统服务、备份5.1 InnoDB 与存储引擎MySQL 8.0 的默认引擎是 InnoDB支持事务、行级锁、崩溃恢复。你在网上看到 MEMORY、MyISAM 的教程多半是老文章除非有特殊理由不然别换引擎。热搜里mysql的数据库连接池和mysql存储过程是两个高频场景连接池比如 HikariCP关心的是 MySQL 的max_connections和wait_timeoutSHOW VARIABLES LIKE max_connections; SHOW VARIABLES LIKE wait_timeout;默认max_connections是 151JavaWeb 项目并发上来后会报Too many connections。可以临时调大SET GLOBAL max_connections 300;但要永久生效还是要写进配置文件max_connections 300 wait_timeout 600存储过程方面MySQL 8.0 的写法DELIMITER // CREATE PROCEDURE get_user(IN uid INT) BEGIN SELECT * FROM users WHERE id uid; END // DELIMITER ;注意DELIMITER在命令行客户端里的用法在 Navicat 里反而不需要。这块很多人卡住是因为忘加DELIMITER触发器和存储过程里每一句都以分号结尾不加就会提前执行报语法错。5.2 自动备份与 SSH 传文件热搜里有ssh工具实现自动化传输ubuntu传输文件到windows这在实际运维里很实用。比如每天凌晨备份数据库然后把备份拉到 Windows 机器上存档mysqldump -u root -p mydb /backup/mydb_$(date %F).sql scp /backup/mydb_*.sql userwindows-ip:/D:/backup/如果是 Windows 主动去拉scp userubuntu-ip:/backup/mydb_2024-01-01.sql D:\backup\再配一条计划任务基本就是个轻量级备份方案了。更好的方案是用 cron 在 Ubuntu 上先压缩再传输0 2 * * * mysqldump -u root -ppassword mydb | gzip /backup/mydb_$(date \%F).sql.gz注意 cron 里的%要转义这是我踩过的坑。5.3 登录、环境变量与垃圾进程问题有时候用户在.bashrc里配错了环境变量导致命令找不到export PATH$PATH:/usr/local/mysql/bin检查当前配置echo $PATH which mysql如果which mysql找不到但/usr/bin/mysql存在说明 PATH 没加/usr/bin改完记得source ~/.bashrc。热搜里ubuntu环境变量配置错误说的就是这个场景。还有一类问题是mysql进程明明关了但端口还占着sudo lsof -i :3306 sudo kill -9 PID或者更彻底sudo systemctl stop mysql sudo pkill -9 mysqld5.4 完全卸载重装从源头清理干净如果你要彻底重来不要只 apt removesudo systemctl stop mysql sudo apt remove --purge -y mysql-server mysql-client mysql-common sudo apt autoremove -y sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysql但注意/var/lib/mysql是数据目录这行命令会把你所有数据库删掉执行前务必确认没有需要保留的数据。我一般在删除前先sudo cp -a /var/lib/mysql /var/lib/mysql.bak6. 真实项目中的几个关键场景6.1 用 Docker 跑 MySQL 的注意事项热搜里同时出现了ubuntu安装docker并运行python环境和 MySQL 相关的词。在 Ubuntu 上用 Docker 跑 MySQL 非常方便sudo docker run -d \ --name mysql8 \ -e MYSQL_ROOT_PASSWORDyourpass \ -p 3306:3306 \ -v /opt/mysql-data:/var/lib/mysql \ mysql:8.0这里有两个容易踩的坑端口映射做了但容器里的 MySQL 默认也只听127.0.0.1需要在-e MYSQL_ROOT_HOST%或容器内配置 bind-address 上做调整。数据卷挂载后容器删掉重来数据还在这本来是优点但如果你改了配置文件导致 MySQL 起不来数据目录里可能有残留的 ibdata1 损坏报错信息很容易让人误判成新问题。6.2 JavaWeb 项目完整案例里的 MySQL 使用细节一个典型的 JavaWeb 项目比如学生管理系统、博客系统JDBC 连接串和驱动版本高度相关MySQL 8.0 对应的驱动是com.mysql.cj.jdbc.Driver连接串建议写成jdbc:mysql://localhost:3306/dbname?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseserverTimezone不写的话高版本驱动会报 CST 时间错误这是我见过最多的新手错误之一。热搜里的mysql排序在项目里也很常见SELECT * FROM products ORDER BY price DESC, created_at ASC;注意 MySQL 8.0 对ORDER BY的排序规则默认受 collation 影响中文排序和拼音排序的效果在不同 collation 下不一样。如果业务上有特殊排序需求比如字典序想按拼音来别在 SQL 里硬刚直接用业务代码排序更可控。6.3 基础硬件与网络问题的再补充如果你是在虚拟机里跑又遇到ubuntu ssh无法连接先确认 SSH 服务是否装了sudo apt install -y openssh-server sudo systemctl enable ssh sudo systemctl status ssh然后再查 VMware NAT 网络和宿主机防火墙不用一上来就重装系统。热搜词里有ubuntu系统重装但在重装前90% 的系统级问题都可以用 20 分钟排查解决掉。7. 安装之后的加分项性能观察和中文支持7.1 中文输入法、搜狗输入法这些事和 MySQL 真没关系热搜里出现了ubuntu中文输入法怎么设置和ubuntu安装搜狗输入法这通常是因为用户在同一个安装教程页面里一路看下来的。这里我明确说一句装 MySQL 不需要装搜狗输入法但如果你在 MySQL 里用中文注释、中文数据字符集就必须是 utf8mb4。很多人从 Windows 过来注释里带中文装完 MySQL 后插入数据报Incorrect string value就是因为character_set_server还是latin1。解决方案就一条SET NAMES utf8mb4;再配合配置文件里的全局设置以后再也不会出现中文乱码。7.2 基础性能观察工具装完 MySQL日常观察性能不需要上重武器sudo mysqladmin -u root -p status sudo apt install -y sysstat iostat -x 1 2查看当前连接SHOW PROCESSLIST;看看有没有长时间Sending data或Waiting for table metadata lock的线程有的话优先 kill再逐步优化 SQL。热搜里mysql存储过程和mysql排序这两个词常常同时出现在一个性能问题帖子里其实大部分排序慢的问题都能靠联合索引解决先EXPLAIN再优化 SQLEXPLAIN SELECT * FROM orders WHERE user_id 10 ORDER BY created_at DESC;8. 最后的几点个人经验用 Ubuntu 这么多年MySQL 装在物理机和虚拟机上都经历过说几个容易在关键时刻救你一命的观察Ubuntu 24.04 上 MySQL 8.0 小版本升级后TLS 默认版本会变老旧的 JDBC 驱动8.0.20 之前那种经常会突然报javax.net.ssl.SSLHandshakeException。这不算兼容性 bug是 MySQL 在收紧安全基线。遇到这种问题最快的解决方案就是把驱动升级到最新而不是在连接串里各种改 SSL 参数硬扛。远程备份的方案无论你是用 scp、rsync 还是写脚本自动拉取都要先在本地验证一次“备份文件能不能恢复”。我见过太多定时任务每天准点执行半年之后一测才发现备份文件是坏的。验证方法很简单mysql -u root -p backup.sql跑一遍能进去再 drop 掉测试库就行。如果电脑性能比较差MySQL 8.0 的默认innodb_buffer_pool_size是 128MB你可以在配置里临时改成 64MB 先跑通流程后面再往大调。相反如果是一台 16GB 内存的服务器专门做业务库这把缓冲池调到 4-8GB查询性能会有肉眼可见的提升。热搜词里有个navicat for mysql 破解安装我不想展开讲这类灰色操作就提一句Navicat 是商业软件请通过正规渠道获取授权。如果你只是临时连一下数据库做管理用 MySQL 官方的 MySQL Workbench 或者开源的 DBeaver完全够用避免陷入来路不明安装包的坑。关于“卸载不掉”的问题比如ubuntu显卡驱动卸载不掉它和 MySQL 没有直接关系。但如果你在装 MySQL 时遇到.deb包卸载不掉通常是 dpkg 的数据库状态损坏了sudo dpkg --configure -a sudo apt -f install这两条能解决 80% 的 dpkg 异常。从零到能用普通人最容易走弯路的地方其实就三个没看版本、没改配置、没查日志。装完 MySQL 万一启动失败第一件事永远是一行命令sudo tail -f /var/log/mysql/error.log这里面的信息比任何论坛上的猜测都准确得多。日志里出现[ERROR] [MY-010584] No directory found, or wrong path这类目录问题十有八九是你自定义了 datadir 但忘了创建目录或授权chown -R mysql:mysql /你的目录就能解开。如果你是用mysql_secure_installation被validate_password组件卡住说密码策略太弱可以提前降低策略要求SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6;这是测试环境的做法生产库千万别这么干。最后再说一句实在话MySQL 在 Ubuntu 上的安装从来不是“敲三行命令就完事”的事真正的功底在安装完成之后——你懂不懂看日志、会不会定位权限问题、知不知道连接失败的每一层链路该怎么排查。把上面这些内容过一遍再碰到报错你心里就有底了不会动不动就想重装系统。
返回列表