Ubuntu安装MySQL 8.0:官方仓库部署与安全加固全指南

📅 2026/8/13 12:19:38
Ubuntu安装MySQL 8.0:官方仓库部署与安全加固全指南
1. 为什么在Ubuntu上安装MySQL值得单独聊聊如果你刚接触Linux服务器或者从Windows环境迁移过来第一次在Ubuntu上装MySQL大概率会一头雾水。这感觉就像你拿到了一把万能钥匙却不知道哪扇门是你要开的。网上教程千千万有让你用apt直接装的有让你去官网下.deb包的还有让你编译源码的。更头疼的是装完之后root密码在哪服务怎么启动远程连不上怎么办这些问题官方文档不会手把手教你大多数教程也只给命令不给解释。我自己在运维和开发环境里部署过不下百次MySQL从Ubuntu 16.04一路装到最新的24.04 LTS。我发现一个“正确”的安装远不止把软件跑起来那么简单。它关乎后续的稳定性、安全性以及维护的便利性。比如你是用Ubuntu仓库里那个可能不是最新版的MySQL还是用Oracle官方提供的仓库安装最新版安装过程中系统为你默默创建的mysql用户和组权限是怎么设置的默认的数据目录/var/lib/mysql如果磁盘空间不够了怎么办这篇文章我就以最新的Ubuntu 22.04 LTS或24.04 LTS为背景抛开那些笼统的步骤带你走一遍我认为最清晰、最可控的安装路径——使用Oracle官方APT仓库安装MySQL 8.0。我会解释每一个命令背后的意图安装完成后必须做的几件安全加固小事以及如何避免那些我早期踩过的、让人折腾半天的“坑”。无论你是要在本地搭建开发环境还是在云服务器上部署生产数据库这套流程都能给你一个干净、可靠的起点。2. 安装前的关键决策选择哪个软件源在Ubuntu上安装软件第一件事不是敲命令而是决定从哪里获取软件包。这个选择直接影响你得到的数据版本、更新频率和安全性。主要就两条路Ubuntu官方仓库和MySQL官方仓库。Ubuntu官方仓库apt install mysql-server这是最省事的方法。Ubuntu在自己的软件源里打包好了MySQL通常是MariaDB或某个版本的MySQL你不需要添加任何额外的仓库。它的最大优点是稳定和集成度高因为Ubuntu团队已经对这个版本的MySQL进行了测试确保与当前系统兼容。但缺点也很明显版本通常不是最新的。例如在Ubuntu 22.04 LTS中默认提供的可能就是MySQL 8.0的一个较早的次要版本如8.0.33而官方可能已经发布了8.0.38。对于数据库来说新版本往往意味着性能优化、安全补丁和新功能如果你追求最新特性或需要修复某个特定版本的bug这就成了障碍。MySQL官方APT仓库这是Oracle官方为Debian/Ubuntu系Linux维护的软件源。你需要手动将这个仓库的地址添加到系统的软件源列表里。这么做的“麻烦”换来的是直接、及时地从官方获取最新版本。你可以安装最新的GA通用可用性版本甚至是开发版。同时官方仓库还提供了完整的配套工具如MySQL Workbench、MySQL Router、MySQL Shell等。对于生产环境或需要特定版本特性的开发环境我强烈推荐这种方式。注意有些教程会教你下载.deb包手动安装。这虽然也行但后续的升级、依赖管理会变得非常麻烦不推荐。用包管理器APT才是Linux下的正道。所以我的选择很明确为了获得更好的可控性和最新的安全更新我们使用MySQL官方APT仓库进行安装。下面我们就来具体操作。3. 一步步走通官方仓库安装流程这个过程可以分解为四个清晰的阶段准备系统、添加仓库并安装、进行安全初始化、最后做基本验证。我们一步一步来。3.1 第一步系统更新与依赖检查在安装任何新软件之前更新本地软件包列表并升级现有软件是一个好习惯。这能确保你的安装器APT拥有最新的源信息并且系统环境是最新的。打开你的终端执行sudo apt update sudo apt upgrade -ysudo apt update是刷新Ubuntu从各个配置的软件源包括我们即将添加的MySQL源获取的软件包索引。sudo apt upgrade -y则是将所有已安装的软件包升级到最新版本-y参数表示自动确认所有提示让过程更流畅。接下来安装一个可能会用到的工具wget它用于从网络下载文件。虽然很多系统已经预装但确认一下没坏处。sudo apt install wget -y3.2 第二步添加MySQL官方APT仓库这是核心步骤。我们不再使用Ubuntu自带的那个“旧”版本。下载仓库配置包。 MySQL官方提供了一个.deb包这个包的作用不是安装MySQL本身而是将MySQL的官方APT仓库地址和GPG密钥添加到你的系统中。我们使用wget从MySQL官网下载它。这里以MySQL 8.0为例截至撰写时8.0是稳定的GA版本。wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb请注意上面的版本号0.8.29-1可能会更新。最稳妥的方法是访问 MySQL APT Repository下载页面 查看最新的.deb包链接。如果你下载时版本号已变替换命令中的文件名即可。安装仓库配置包。sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb运行这个命令时会弹出一个蓝色的文本界面ncurses界面。在这个界面里你可以用方向键选择要安装的MySQL产品版本比如MySQL Server 8.0、工具组件等。如果你是新手或者没有特殊需求直接按上下键选择“Ok”然后按回车确认即可。它会使用默认的推荐配置。再次更新软件包列表。 既然我们添加了新的软件源就必须让APT知道这个新源里有什么。sudo apt update执行后你应该能在更新信息中看到“从repo.mysql.com获取...”这样的字样这说明MySQL官方仓库已经成功添加。3.3 第三步安装MySQL服务器仓库配置好安装就简单了。sudo apt install mysql-server -y这个mysql-server包现在是从我们刚刚添加的MySQL官方仓库里获取的。安装过程会持续几分钟APT会自动处理所有依赖比如会同时安装mysql-client、mysql-common等必要的包。安装过程中你可能不会看到设置root密码的提示这与旧版本或Ubuntu仓库的包不同。这是因为MySQL 8.0采用了新的安全策略初始密码管理留到安装后的一个专门的安全脚本来处理这样更安全。安装完成后MySQL服务mysqld会自动启动。你可以用以下命令验证服务状态sudo systemctl status mysql如果看到绿色的“active (running)”字样并且下面没有红色的错误日志说明MySQL服务已经成功运行在后台了。3.4 第四步运行安全初始化脚本最关键的一步MySQL安装包附带了一个名为mysql_secure_installation的脚本。这个脚本会引导你完成一系列安全加固操作这是生产环境部署的必做步骤即使是开发环境也强烈建议执行。在终端中输入sudo mysql_secure_installation脚本会启动一个交互式问答流程。下面我逐一解释每个问题该如何选择验证密码强度组件Securing the MySQL server deployment. Connecting to MySQL using a blank password. VALIDATE PASSWORD COMPONENT can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD component? Press y|Y for Yes, any other key for No:建议回答Y这个组件会强制你设置一个符合一定强度规则的root密码比如长度、包含数字大小写字母等。对于生产环境开启它能避免设置过于简单的密码。对于本地开发环境如果你觉得麻烦可以选N但养成好习惯总是对的。设置密码强度策略等级如果上一步选了YThere are three levels of password validation policy: LOW Length 8 MEDIUM Length 8, numeric, mixed case, and special characters STRONG Length 8, numeric, mixed case, special characters and dictionary file Please enter 0 LOW, 1 MEDIUM, 2 STRONG:建议选择1 (MEDIUM)中等强度是一个比较平衡的选择要求密码至少8位且包含数字、大小写字母和特殊字符。这已经能抵御大多数暴力破解。设置root用户密码 接下来会要求你为root用户输入并确认新密码。请务必设置一个强密码并牢记。输入密码时屏幕上不会有任何显示星号也没有这是正常的盲输即可。移除匿名用户By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? (Press y|Y for Yes, any other key for No) :必须回答Y匿名用户允许任何人无需密码连接数据库这是巨大的安全漏洞必须删除。禁止root用户远程登录Normally, root should only be allowed to connect from localhost. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) :必须回答Y这个设置意味着root用户只能从本机localhost登录MySQL。这是最佳安全实践。如果需要远程管理你应该创建一个具有所需权限的普通用户而不是开放root远程登录。删除测试数据库By default, MySQL comes with a database named test that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) :建议回答Y删除名为test的默认数据库减少不必要的攻击面。重新加载权限表Reload privilege tables now? (Press y|Y for Yes, any other key for No) :必须回答Y以上所有关于用户和权限的更改需要重新加载权限表才能立即生效。至此MySQL服务器已经以一个比较安全的状态安装并配置完成了。4. 安装后的基础验证与连接安装和安全配置都做完了我们得验证一下它是否真的能用了。4.1 验证服务状态与开机自启首先再次确认服务运行状态sudo systemctl status mysql除了看状态我们还可以设置MySQL服务在系统启动时自动运行避免服务器重启后需要手动启动数据库。sudo systemctl enable mysql执行这个命令后你可以看到类似“Created symlink ...”的提示表示开机自启的符号链接已经建立。4.2 使用root用户登录MySQL现在尝试用我们刚才设置的root密码登录MySQL命令行客户端。mysql -u root -p回车后系统会提示你输入密码-p参数的意思。输入你刚才设置的root密码。如果一切顺利你会看到MySQL的命令行提示符mysql这证明你的安装、服务启动和密码认证都是成功的。4.3 执行一个简单的测试命令在mysql提示符下输入以下命令查看服务器版本和当前时间SELECT VERSION(), NOW();你会看到类似这样的输出-------------------------------- | VERSION() | NOW() | -------------------------------- | 8.0.38 | 2024-05-27 10:30:00 | -------------------------------- 1 row in set (0.00 sec)这不仅能确认连接正常还能看到你安装的MySQL具体版本号。最后输入exit或\q退出MySQL命令行。5. 你可能遇到的三个典型“坑”及解决方案即使按照教程一步步来由于系统环境差异你还是可能遇到问题。下面是我总结的几个最常见的问题和解决办法。5.1 坑一安装过程中APT报错“无法定位软件包 mysql-server”问题现象在执行sudo apt install mysql-server -y时提示“E: 无法定位软件包 mysql-server”。根因分析这几乎可以肯定是软件源repository没有添加成功或未生效。可能的原因有添加仓库配置包.deb文件后没有执行sudo apt update。下载的.deb包版本不对或损坏。网络问题导致添加源失败。排查与解决首先务必确认执行了更新确保在安装mysql-server之前已经运行了sudo apt update并且输出中没有关于MySQL源的错误信息。检查源列表查看MySQL源是否真的被添加了。可以查看/etc/apt/sources.list.d/目录下是否有mysql.list文件。ls -la /etc/apt/sources.list.d/ cat /etc/apt/sources.list.d/mysql.list这个文件内容应该包含repo.mysql.com的地址。重新添加仓库如果文件不存在或内容不对最干脆的解决办法是清理后重来。# 移除可能出错的配置 sudo dpkg -P mysql-apt-config sudo rm -f /etc/apt/sources.list.d/mysql* # 重新下载并安装配置包请使用最新的.deb包名 wget 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 # 再次更新 sudo apt update # 再次尝试安装 sudo apt install mysql-server -y5.2 坑二忘记root密码或mysql_secure_installation未设置密码问题现象安装后直接用mysql -u root能登录无需密码或者运行mysql_secure_installation时跳过了密码设置现在不知道密码或想重置。解决方案我们需要以“跳过权限检查”的模式启动MySQL然后修改root密码。停止MySQL服务sudo systemctl stop mysql以安全模式启动MySQL跳过权限表加载sudo mysqld_safe --skip-grant-tables --skip-networking 这个命令会在后台启动一个MySQL进程--skip-grant-tables让你可以无密码登录--skip-networking禁止网络连接以保证安全。使用root用户无密码登录mysql -u root在MySQL命令行中刷新权限并修改密码MySQL 8.0修改密码的语法与5.7不同-- 先刷新权限确保能使用ALTER USER语句 FLUSH PRIVILEGES; -- 修改root用户的密码请将‘YourNewStrongPassword123!’替换成你的新密码 ALTER USER rootlocalhost IDENTIFIED BY YourNewStrongPassword123!; -- 退出 exit;关闭安全模式的MySQL进程并正常启动服务# 找到mysqld_safe的进程ID并结束它 sudo pkill mysqld_safe sudo pkill mysqld # 正常启动MySQL服务 sudo systemctl start mysql现在就可以用新密码登录了mysql -u root -p5.3 坑三远程客户端无法连接数据库问题现象在本地用mysql -u root -p可以登录但用Navicat、DBeaver或者另一台服务器的MySQL客户端连接时提示“Host ‘xxx.xxx.xxx.xxx’ is not allowed to connect to this MySQL server”。根因分析这是由两个层面的配置共同导致的。用户权限MySQL的用户是由“用户名”和“主机名”共同定义的。‘root’‘localhost’和‘root’‘%’是两个不同的用户。默认安装后只有‘root’‘localhost’这个用户它只允许从本机连接。‘%’是一个通配符表示任意主机。MySQL绑定地址MySQL服务默认只监听本地回环地址127.0.0.1不监听服务器的公网或内网IP。解决方案需要“两步走”。第一步检查并修改MySQL绑定地址编辑MySQL的主配置文件/etc/mysql/mysql.conf.d/mysqld.cnf有时可能在/etc/mysql/my.cnf。sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf找到bind-address这一行。默认可能是bind-address 127.0.0.1如果你想允许所有IP连接生产环境慎用可以将其改为bind-address 0.0.0.0如果只想允许特定网段可以保留127.0.0.1并通过系统防火墙如UFW开端口。修改后保存退出并重启MySQL服务。sudo systemctl restart mysql第二步创建一个允许远程登录的用户绝对不要直接允许root远程登录用root登录本地MySQL执行-- 创建一个新用户your_username和‘YourPassword123!’请替换 CREATE USER your_username% IDENTIFIED BY YourStrongPassword123!; -- 授予这个用户对所有数据库的所有权限根据实际情况缩小权限范围 GRANT ALL PRIVILEGES ON *.* TO your_username% WITH GRANT OPTION; -- 刷新权限使更改生效 FLUSH PRIVILEGES;完成这两步后远程客户端应该就能使用your_username和对应的密码进行连接了。记得在服务器的防火墙如ufw中开放3306端口。sudo ufw allow 3306/tcp6. 基础管理与维护命令备忘安装完成后日常免不了要和MySQL服务打交道。这里列几个最常用的系统级命令帮你快速上手管理。服务管理sudo systemctl start mysql启动服务。sudo systemctl stop mysql停止服务。sudo systemctl restart mysql重启服务修改配置后常用。sudo systemctl status mysql查看服务状态最常用。sudo systemctl enable mysql设置开机自启。sudo systemctl disable mysql取消开机自启。查看日志MySQL的日志对于排错至关重要。错误日志通常位于/var/log/mysql/error.log。查看最新错误sudo tail -f /var/log/mysql/error.log配置文件主配置文件通常由多个片段组成。/etc/mysql/my.cnf主配置文件它通常会包含其他目录下的配置文件。/etc/mysql/mysql.conf.d/mysqld.cnf服务器核心配置如端口、数据目录、绑定地址等。/etc/mysql/conf.d/存放自定义配置的目录你可以在这里创建.cnf文件来覆盖默认设置这比直接修改主文件更安全便于管理。数据目录默认情况下MySQL的所有数据库文件表结构、数据都存放在/var/lib/mysql/下。在规划服务器磁盘时要确保这个分区有足够空间。7. 安全加固与性能初调建议一个刚安装好的MySQL就像毛坯房能住但不舒服也不安全。除了运行mysql_secure_installation还有几件事值得一做。1. 考虑修改默认端口非必须但可增加安全性将默认的3306端口改为一个非标准端口可以避免一些简单的自动化扫描攻击。在配置文件/etc/mysql/mysql.conf.d/mysqld.cnf中的[mysqld]部分添加一行port 33066重启服务后连接时需要指定端口mysql -u root -p -P 33066。2. 为应用创建专属数据库和用户永远不要让你的应用程序直接使用root账户连接数据库。这违反了“最小权限原则”。正确的做法是-- 登录MySQL后 CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER myapp_userlocalhost IDENTIFIED BY AnotherStrongPassword!; GRANT ALL PRIVILEGES ON myapp_db.* TO myapp_userlocalhost; FLUSH PRIVILEGES;这样你的应用就用myapp_user这个只能操作myapp_db数据库的账户来连接即使密码泄露影响范围也有限。3. 调整基础性能参数针对开发测试或小内存机器MySQL 8.0的默认配置比较保守。对于开发机或内存较小的VPS可以适当调整以提升性能。在/etc/mysql/conf.d/目录下创建一个新文件比如my-custom.cnfsudo nano /etc/mysql/conf.d/my-custom.cnf添加以下内容根据你的内存调整这里以1GB内存的机器为例[mysqld] # 缓冲池大小通常是系统内存的50%-70%这里设为256M innodb_buffer_pool_size 256M # 连接数默认151开发环境可以调低 max_connections 100 # 查询缓存MySQL 8.0已移除无需设置 # 临时表大小 tmp_table_size 64M max_heap_table_size 64M保存后重启MySQL服务使配置生效。这些调整能有效改善在资源有限环境下的响应速度。对于生产环境参数调优是一个复杂得多的过程需要根据具体负载进行。走完以上所有步骤你在Ubuntu上得到的就不仅仅是一个“能跑”的MySQL而是一个经过基本安全加固、配置清晰、你知道如何管理和排错的数据库服务环境。这为后续的任何开发或部署工作打下了一个可靠的基础。