Ubuntu 24.04安装MySQL 8.0保姆级教程:从apt到远程连接

发布时间:2026/10/5 11:08:49
Ubuntu 24.04安装MySQL 8.0保姆级教程:从apt到远程连接 1. 动手前先看清Ubuntu 24.04与MySQL 8.0的版本组合怎么选1.1 标题里的24.02其实是24.04先对齐版本认知先纠正一个容易误导新手的细节教程标题里写的ubuntu 24.02其实是笔误目前Ubuntu的长期支持版本是24.04 LTS代号Noble Numbat发布于2024年4月。如果你打开系统设置的关于页面看到的多半是24.04.1、24.04.2之类的更新序列号并没有24.02这个版本号。这一点对安装MySQL本身影响不大但建议大家先确认系统版本再动手避免在未知环境里排查问题时多走弯路。确认版本的命令很简单打开终端执行lsb_release -a cat /etc/os-release这两条命令会告诉你发行版名称、版本号和代号。我在这台24.04 LTS上实测lsb_release -a输出的Description是Ubuntu 24.04.1 LTS。为什么强调LTS因为长期支持版本意味着安全更新和维护周期有保障MySQL在这类系统上的兼容性和踩坑资料也最齐全普通个人服务器和生产环境都建议选它而不是每隔9个月就换一批的非LTS版本。1.2 四种安装路径对比为什么这条教程选择官方APT源在Ubuntu上装MySQL 8.0至少有条路可走其一直接用Ubuntu官方软件源里的mysql-server包这也是本教程采用的方式其二从MySQL官网下载APT仓库配置包装官方源里的版本其三用Docker跑MySQL容器其四下载通用Linux二进制包手动解压配置。把四条路摆在一起看各自取舍就很清楚了安装方式适合人群优点需要注意的坑Ubuntu官方源apt install mysql-server新手、绝大多数常规场景一条命令搞定依赖自动处理和系统集成好版本可能比官网慢半拍但8.0.x一直在正常推送MySQL官网APT仓库对版本有明确要求、需要第一时间升级的人能指定安装8.0.x的某个具体小版本需要额外添加GPG密钥和源多几步配置Docker容器隔离环境、多实例并存、想避免污染宿主机的场景干净、可重复、拉起来就走数据卷、网络模式要额外理解进程管理方式不同通用二进制包特殊目录需求、离线安装环境目录自己说了算不依赖系统包管理初始化、开机自启、依赖库全要手动处理工程量最大这条教程选官方APT源核心原因只有一个对新手来说系统包管理器是故障率最低的路径。你不需要关心MySQL的用户和组是否创建、二进制文件放在哪个目录、启动脚本有没有注册apt会自动把这些琐事处理完。它也许不是最灵活的路径但一定是最省心的路径。等你用熟了一个月再回头折腾官网源或者二进制包都不迟。1.3 安装前的三项检查避免装到一半翻车正式执行安装命令之前我习惯先做三项检查避免中途报错或装完发现系统里已有残留版本。第一检查APT源是否正常。如果你之前折腾过其他软件源可能残留了失效的源地址。先跑一次sudo apt update正常情况下应该能看到若干条Hit或Get信息末尾没有红色报错。如果出现Failed to fetch之类的提示先解决源的问题再继续否则后面安装MySQL时会有隐患。第二确认系统里没有已经装过的MySQL或MariaDB。特别是MariaDB它与MySQL兼容性极强很多新手之前可能装过却忘了两个数据库共存会占用3306端口冲突非常隐蔽。检查命令dpkg -l | grep -E mysql|mariadb ss -lntp | grep 3306如果第一行有输出说明装过相关包第二行有输出说明3306端口已经被占。有残留就先处理掉sudo apt remove --purge mysql-server可以彻底卸载生产环境务必先备份数据。第三确保系统时间正确。MySQL对证书、日志时间戳都比较敏感时间偏差过大可能导致一些莫名其妙的问题。看一眼date输出如果和北京时间差太多执行sudo timedatectl set-timezone Asia/Shanghai矫正时区。这一步不是必须的但属于提前动手、后面少折腾的典型操作。三项检查都通过了下面进入正式安装环节。2. 命令行逐条走一遍从apt update到MySQL首次登录2.1 核心安装命令更新索引、安装mysql-server、确认版本检查完成后安装本身其实只有两步命令。第一步更新软件源索引第二步安装mysql-server元包sudo apt update sudo apt install mysql-server -y注意这里装的是mysql-server而不是mysql-client或mysql因为mysql-server会连带把客户端工具一起装上。-y参数的意思是自动确认安装过程中弹出的所有询问如果你不习惯去掉它手动按Y也行无非是多一次交互。安装过程中APT会下载大概几百MB的包取决于当前源里的版本耗时通常在十秒到几分钟不等取决于服务器带宽。装完以后先确认一下到底装上了什么版本mysql --version我在这台机器上的输出是mysql Ver 8.0.39-0ubuntu0.24.04.1 for Linux on x86_64 (Ubuntu)。8.0.39是个很新的维护版本这意味着MySQL团队一直在通过Ubuntu的apt源持续推送小版本更新安全性有保障。有些教程喜欢折腾MySQL 8.4 LTS或者从官网装指定小版本但如果你是第一次在Ubuntu上部署MySQL官方源里的8.0.x就是最稳的起点——它是目前生态兼容性最好的大版本PHP、Java、Python的各种驱动都优先适配它。2.2 服务启动与三连验证systemctl、ss、mysqladminUbuntu 24.04继承了systemd的整套管理体系MySQL安装完成后通常会自动启动但为了稳妥还是按顺序手动过一遍。先看服务状态sudo systemctl status mysql如果输出里有绿色的active (running)说明服务正常。如果没启动执行sudo systemctl start mysql然后再次确认状态。注意Ubuntu上MySQL的服务名统一叫mysql不是mysqld用systemctl status mysqld会提示找不到服务这是新手最容易卡住的地方之一。服务启动了还得确认端口真的在监听。用ss命令看本地套接字和TCP端口sudo ss -lntp | grep 3306输出里应该能看到LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* users:((mysqld,pidxxxx,fdxx))这表示mysqld进程正在监听3306端口。注意这里默认监听的是127.0.0.1也就是只允许本机连接。远程访问的配置我会在第4部分详细展开现在先不要急着改。最后用mysqladmin这个命令行工具做一次健康检查它能直接和MySQL服务器握手并返回运行状态比任何猜都靠谱sudo mysqladmin ping正常情况会输出mysqld is alive。这套三连验证状态、端口、ping几乎能覆盖90%的启动问题以后你自己排查MySQL故障也可以沿用先看systemd状态再查端口最后用mysqladmin测连通性。2.3 装完后默认长什么样配置文件、数据目录、日志位置安装完成后了解几个关键文件的位置能让你在后续配置和排错时少走弯路。Ubuntu官方源安装的MySQL默认路径是这样的配置文件目录在/etc/mysql/其中/etc/mysql/mysql.conf.d/mysqld.cnf是核心配置bind-address、port、datadir等关键参数都在这里。数据目录在/var/lib/mysql/所有数据库的物理文件都存放在这里。它的属主是mysql:mysql日常备份、迁移都要围绕这个目录做文章。错误日志在/var/log/mysql/error.log这是排查启动失败、崩溃问题的第一现场。如果服务异常先打开这个文件看最后几十行。socket文件在/var/run/mysqld/mysqld.sock本机通过socket连MySQL时会用到如果以后遇到socket连接失败类报错大概率跟这个文件有关。这些路径用一次就要记住因为后面所有修改配置—重启服务—查看日志的循环都绕不开这套文件体系。别急着改任何配置先把服务跑通、能登录进数据库再逐步做安全加固。3. 安全初始化与root认证方式解开sudo才能进MySQL的结3.1 mysql_secure_installation的每一项到底在问什么很多新手装完MySQL后输入mysql -u root -p却提示要密码或者输入了密码仍然报错根源在于还没跑安全初始化脚本。执行sudo mysql_secure_installation这个交互式脚本会连续问你几个问题我逐一翻译一下它到底在问什么以及该怎么回答。第一个问题关于密码强度校验插件VALIDATE PASSWORD COMPONENT。它会问你是否启用密码校验组件选y的话后面会限制密码必须包含大小写、数字、特殊字符强度分三级。我的建议是y尤其是服务器会暴露在公网上的场景。如果你只是在虚拟机里自己玩嫌麻烦选n跳过也没关系。选y之后它会让你选密码强度等级0是只检查长度1要求混合字符2要求更复杂的组合。生产环境至少选1。第二个问题是设置root密码。如果你之前启用了密码校验组件这里输入的密码必须满足强度要求。这里有一个细节在Ubuntu的官方apt安装方式下root用户默认使用的是auth_socket插件认证根本不需要密码所以哪怕你在这一步设置了密码Linux系统用户直接用sudo mysql进场时依然不会要求密码。这个机制我下一节单独讲。如果你希望root以后也走密码登录按脚本提示设置并记住密码即可。接下来的几个问题比较直接是否移除匿名用户Remove anonymous users选y。匿名用户意味着任何人都能建立连接留着纯属风险点。是否禁止root远程登录Disallow root login remotely选y。root只允许从本机登录是数据库安全的基本盘。业务需要远程访问时单独建一个最小权限用户后面第4部分会讲。是否移除测试数据库Remove test database and access to it选y。test库是对所有用户开放的留着没有任何生产价值。是否立即重新加载权限表Reload privilege tables now选y。让前面的改动立即生效。3.2 auth_socket机制Ubuntu默认认证为什么这么设计跑完安全初始化脚本后你会发现一个让很多人困惑的现象用mysql -u root -p登录输入刚设置的密码却报错但用sudo mysql又直接进去了。这不是你密码敲错了而是Ubuntu的MySQL默认给root配置的认证插件是auth_socket。auth_socket的工作原理很简单只要你是操作系统的root用户或者和MySQL进程属于同一个系统用户组就可以直接通过socket文件登录MySQL的root账户完全不需要密码。这是Ubuntu发行版出于安全考虑做的改动既然系统root已经能绕过所有文件权限MySQL就没必要再要一道密码了而且这样避免了用户把root密码设置成弱密码、或者把密码写到脚本里的坏习惯。验证当前root用户用的认证插件登录后执行SELECT user, host, plugin FROM mysql.user WHERE user root;正常情况下能看到root对应的plugin是auth_socket。这也解释了为什么在很多教程里别人输入mysql -u root -p就能进去而你不能——因为大家的认证插件不同。如果你想恢复输入密码登录root的习惯可以把root的认证方式改成经典的caching_sha2_password这是MySQL 8.0默认推荐的密码认证插件ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY 你想要的强密码; FLUSH PRIVILEGES;执行完以后再执行mysql -u root -p并输入密码就能正常登录了。我要提醒的是安全意识改成密码认证后sudo mysql的无密码快捷登录方式会失效每次都要输一次root密码。这本身是好事但务必把密码放到密码管理器里别写进项目代码或明文脚本——我在实际运维中见过太多把数据库密码硬编码在application.properties里、然后仓库一泄露全盘皆输的案例。3.3 把root改回密码认证一条SQL的取舍与风险控制上面那条ALTER USER语句看起来很轻巧但背后有个取舍问题root改成密码认证之后操作系统的root用户通过sudo无密码进入MySQL这条逃生通道就关闭了。万一你忘了root密码恢复手段会麻烦很多。所以我的建议是分场景对待纯本地开发、虚拟机学习环境保持auth_socket默认状态用sudo mysql进root日常操作最简单。以后创建业务用户、授权、备份全部用sudo mysql执行反正本地环境无风险。云服务器、生产或准生产环境root必须改成强密码认证并且把密码保管好。建议同时创建一个具有全部管理权限但取消远程登录的备份root用户形成冗余。不管选哪种都要记住root只服务管理操作业务代码一律使用独立账号连接数据库。这样即使业务账号泄露影响范围也被限制在应用自身的数据集内不至于拖垮整个实例。4. 从本机到远程业务用户、bind-address与防火墙的三步放行4.1 不为业务创建独立用户你会后悔的MySQL安装好、root能登录之后下一步是创建业务用户。很多新手图省事直接用root账号连数据库跑业务我强烈建议不要这样做。理由很朴素业务代码一旦被SQL注入、或配置文件泄露攻击者拿到的是一个拥有全部权限的管理员账号可以删库、改配置、读其他库的数据而独立业务用户只拥有当前库的必要权限损失上限低得多。创建用户的完整流程如下。先用root登录MySQLsudo mysql然后创建用户并指定密码这里我用blog这个示例库名和bloguser示例用户名CREATE USER bloguserlocalhost IDENTIFIED BY 这里是强密码; CREATE DATABASE IF NOT EXISTS blog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON blog.* TO bloguserlocalhost; FLUSH PRIVILEGES;逐条解释CREATE USER里的bloguserlocalhost表示只允许从本机连接。后面如果要远程连接需要再创建一个bloguser%或指定IP的用户。CREATE DATABASE里的utf8mb4字符集和utf8mb4_unicode_ci排序规则是MySQL 8.0下处理中文、表情符号的最佳实践。用utf8很容易在存中文时遇到长度超限或乱码的问题直接用utf8mb4从源头规避。GRANT ALL PRIVILEGES ON blog.*的意思是只授权blog这个库的所有权限不含其他库也不含GRANT OPTION即不能授权给其他人。这是业务账号的最小充分权限。最后FLUSH PRIVILEGES让权限改动即时生效。完成之后用新账号验证一下mysql -u bloguser -p blog能正常进入blog库说明用户创建和授权都成功了。以后代码里连接数据库就用这组账号和密码。4.2 远程连接三步曲改监听、放行端口、授权本机能连之后接下来最常见的需求是从另一台机器连过来。远程连接有三个必要条件MySQL监听所有地址、防火墙放行3306端口、账号被允许从远程主机登录。这三步缺一不可而且顺序错了容易让人误以为某个环节坏了。第一步修改监听地址。编辑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表示监听所有网卡接口。保存后重启MySQLsudo systemctl restart mysql重启后执行sudo ss -lntp | grep 3306能看到监听地址变成了0.0.0.0:3306说明第一步完成。这一步变更会让MySQL暴露在外部网络所以务必配合强密码和防火墙规则。第二步放行防火墙端口。Ubuntu默认防火墙ufw如果处于开启状态外部流量是进不来的。查看防火墙状态并放行3306sudo ufw status sudo ufw allow 3306/tcp如果你只想让某个IP段访问可以精准放行sudo ufw allow from 192.168.1.0/24 to any port 3306 proto tcp这一步视你的网络环境而定云服务器还有安全组规则也要把3306端口加入白名单本地局域网则主要靠ufw。第三步给用户添加远程访问权限。重新创建一个允许任意主机连接的账号或给已有账号添加远程访问能力CREATE USER bloguser% IDENTIFIED BY 这里是强密码; GRANT ALL PRIVILEGES ON blog.* TO bloguser%; FLUSH PRIVILEGES;%是通配符表示任意IP都能用这个账号连接。生产环境更稳妥的做法是精确到IP比如bloguser192.168.1.10只给固定的开发机放行。个人项目图省事用%也不是不行但前提是密码足够强、防火墙有严格控制。三步全部完成后在另外一台机器上测试mysql -h 你的服务器IP -u bloguser -p blog能正常连上就说明远程访问配置成功。如果你用的是云服务器最后一步排查点通常在安全组而不是系统防火墙这个细节我在不少项目里被问过。4.3 连接报错速查10061、1045、2002分别是什么远程连接失败时客户端会返回一个错误码。根据我积累的经验最常见的三个错误码分别代表不同层面的问题对照排查非常高效。错误码错误信息关键字含义排查方向2002Cant connect to local MySQL server through socket客户端连不上本地socketMySQL服务是否启动、socket路径对不对10061Cant connect to MySQL server on x.x.x.x (10061)TCP连接被拒绝MySQL是否监听正确地址、防火墙/安全组是否放行、服务是否在运行1045Access denied for user xxxxxx用户名或密码错误、或主机未被授权密码是否正确、账号的host匹配范围是否包含当前来源IP举个例子你在办公室电脑上执行mysql -h 123.123.123.123 -u bloguser -p blog如果立刻返回10061多半是防火墙或安全组拦截如果返回1045说明网络已经通了问题出在账号授权或密码上。这样分层排查十分钟内基本能定位问题。有一点补充MySQL 8.0默认使用caching_sha2_password认证插件老版本客户端或旧驱动可能不支持会出现Authentication plugin caching_sha2_password cannot be loaded的报错。解决办法是让用户改用mysql_native_password插件或者升级客户端驱动。对于新项目我倾向于升级驱动而不是降低安全级别。如果确实要兼容老程序可以执行ALTER USER bloguser% IDENTIFIED WITH mysql_native_password BY 这里是强密码;这会降低认证安全性属于应急手段用完最好换回caching_sha2_password。5. 装完不是结束开机自启、日志定位与几个高频坑5.1 开机自启与启停习惯systemctl的正确用法MySQL启动不是只跑一次就完了服务器重启之后它必须能自动拉起。Ubuntu官方的mysql-server包在安装时已经自动配置了开机自启但你仍然需要知道如何手动管理它。日常运维中最常用的四组命令sudo systemctl start mysql # 启动 sudo systemctl stop mysql # 停止 sudo systemctl restart mysql # 重启修改配置后必用 sudo systemctl status mysql # 查看状态此外确认开机自启是否开启systemctl is-enabled mysql输出enabled说明自启已配置。如果输出disabled手动开启sudo systemctl enable mysql一个小建议修改完MySQL配置后用restart而不是start因为start在服务已经运行时什么都不做配置不会生效。另外不要把mysql服务名写成mysqld在Ubuntu 24.04下这是两个不同的单元写错会直接提示Unit mysqld.service could not be found。服务级排错时养成先看status再看日志的习惯。systemctl status mysql会输出最近的日志片段如果不足以定位再翻/var/log/mysql/error.log。这个顺序能让你快速判断问题是出在配置加载阶段还是运行阶段。5.2 日志是最好的老师错误日志怎么读MySQL的日志系统里排错最常用的是错误日志。它默认路径是/var/log/mysql/error.log记录了从启动到运行过程中的所有异常信息。常见问题的日志特征如下启动失败日志里出现Permission denied一般是数据目录/var/lib/mysql的属主不是mysql执行sudo chown -R mysql:mysql /var/lib/mysql修复。日志里出现Cant create/write to file /tmp/xxx 可能是/tmp目录空间不足或权限问题清理临时文件并检查目录权限。日志里反复出现Aborting多和内存不足或配置错误有关检查innodb_buffer_pool_size是否设置得过大。看日志的时候我习惯直接看最后几十行sudo tail -n 50 /var/log/mysql/error.logtail -f可以持续跟踪日志输出适合在复现问题的时候实时观察。5.3 直接能用的基线配置建议字符集、时区、缓冲池MySQL在Ubuntu 24.04上安装完成后默认配置已经比较可用但有几个参数建议按实际需求调一下。字符集和排序规则建议统一为utf8mb4。MySQL 8.0默认字符集已经是utf8mb4了不过为了显式声明和防止未来配置漂移可以在mysqld.cnf的[mysqld]段下加上character-set-server utf8mb4 collation-server utf8mb4_unicode_ci保存后重启生效然后登录数据库验证SHOW VARIABLES LIKE character_set_server; SHOW VARIABLES LIKE collation_server;时区设置方面如果业务和数据的展示都在中国时区把它设置成08:00或Asia/Shanghai可以避免时间差问题。在配置文件中加default-time-zone 08:00重启后生效。注意修改时区需要MySQL进程有操作时区表的权限个别情况下你会看到时区加载失败这时需要执行mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql导入时区表。缓冲池调整是新手最容易忽略的一步。innodb_buffer_pool_size是InnoDB最重要的内存参数它决定了数据和索引缓存在内存中的容量。默认值一般是128MB对个人服务器来说太小。经验公式是给物理内存的60%-70%比如2GB内存的机器设置成1GB左右比较合适。修改还是在这个文件里innodb_buffer_pool_size 1G设置过大的后果是操作系统内存吃紧导致OOM所以不要贪心。改完后用SHOW VARIABLES LIKE innodb_buffer_pool_size;确认生效。如果你经常遇到中文乱码还应该检查客户端的连接字符集。登录后执行SHOW VARIABLES LIKE character_set_client;如果不是utf8mb4可以在连接串里加上?characterEncodingutf8Java、SET NAMES utf8mb4命令行等参数统一连接端和服务器端的字符集。这一步能避免大量数据库里看是好的、程序读出来乱码的诡异问题。6. 高频问题的处理与一个实用建议6.1 密码忘记、端口冲突、服务起不来的快速自救手册即便按部就班走完全程也难免遇上意外。我把实际运维中最高频的三个问题的自救流程整理在这里。第一个是密码忘记。如果root走的是auth_socket认证直接用sudo mysql进场重置密码就行如果root已经改成密码认证且密码遗忘了办法是临时跳过认证启动MySQL先停止服务在配置文件中加一行skip-grant-tables重启后免密登录重置密码然后删掉这一行再重启。具体操作sudo systemctl stop mysql sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 在 [mysqld] 段下添加skip-grant-tables sudo systemctl start mysql mysql -u root # 重置密码后删除上面新增的配置行再执行 sudo systemctl restart mysql注意skip-grant-tables状态下MySQL不做任何权限校验任何人都能免密进入务必只在内网或本机使用重置完立即删除该配置。第二个是端口冲突。3306被另一个MySQL实例或MariaDB占用导致服务起不来用sudo ss -lntp | grep 3306看是谁占用了端口然后停掉冲突服务或改其中一个的port参数。确认当前MySQL端口配置grep -E ^port /etc/mysql/mysql.conf.d/mysqld.cnf第三个是服务启动失败且日志为空。先确认是否有多个配置文件互相覆盖/etc/mysql/my.cnf通常会include目录下的所有*.cnf如果你在多个文件里设置了同一参数后者会覆盖前者。排查时用mysqld --validate-config校验配置它会直接报告配置错误sudo mysqld --validate-config如果配置正确但服务还是起不来多半是数据目录权限或磁盘空间问题按前面日志小节的方法处理。6.2 让日常使用更舒服几个顺手就能用的习惯按这套流程走完你的Ubuntu 24.04上应该已经有一个能本机登录、能远程访问、字符集和时区都正确的MySQL 8.0了。最后分享几个我个人觉得提升使用体验的小习惯。第一个习惯是给mysql客户端做一个简洁的登录别名。在~/.bashrc或~/.zshrc里加一行alias mysql-localmysql -u bloguser -p blog之后本地连接就是这个库一行的事情。远程连接的别名也可以做成带-h参数的版本省得每次敲一长串。别把密码写进别名终端历史记录里留明文密码是坏习惯。第二个习惯是定期备份。哪怕只是个人项目一个应急的备份脚本也值得花十分钟写出来。我常用的最简方案mysqldump -u bloguser -p blog /path/to/backup/blog_$(date %F).sql配合cron定时任务每天凌晨跑一次。恢复时执行mysql -u bloguser -p blog 备份文件.sql。数据安全这件事平时越简单灾难时越管用。第三个习惯是关注小版本更新。Ubuntu apt源会自动推送MySQL小版本修复养成定期sudo apt update sudo apt upgrade的习惯就能自动吃到安全补丁。升级后在低峰期重启一次服务让新版本生效。数据库这类基础软件稳定性和安全性永远高于新功能。我在多台Ubuntu 24.04服务器上反复跑过这套流程最常翻车的不是命令本身而是认证插件和防火墙这两道隐形门。先把root认证机制搞明白再把远程连接的三步曲走通其他问题基本都能在日志和错误码里找到答案。这大概是整个保姆级流程里最有价值的部分不只是让你装好还让你知道以后出了问题往哪里看、怎么改。