Ubuntu 20.04下用apt安装MySQL 8.0及安全配置实战

发布时间:2026/9/13 16:28:24
Ubuntu 20.04下用apt安装MySQL 8.0及安全配置实战 1. 为什么选择apt方式装MySQL省心才是王道先说明一下这篇文章不是给那些需要定制特殊功能、编译参数极度苛刻的极客写的。如果你的需求只是在一台Ubuntu 20.04服务器或者开发机上快速、稳定、可维护地跑一个数据库服务那apt绝对是最优解没有之一。很多人一听到“装MySQL”第一反应就是去官网下载tar包然后各种初始化、改权限、配my.cnf折腾一晚上可能连root都登不进去。实际上在Ubuntu生态里apt源的MySQL包是经过官方团队适配和测试的依赖关系处理得明明白白安装完基本上下一步就能用省掉的这些操作成本和时间成本放到项目交付上价值是实打实的。我这两年给客户部署项目凡是数据量不大、非大规模集群场景基本全是apt一把梭。它能解决什么问题简单说就是让一个不太熟悉MySQL的人也能在两三分钟内拥有一个干净、安全、可用的数据库环境。这篇文章适合谁看刚接触Linux的运维新人、刚转后端开发的大学生、还有那些被Windows习惯束缚想回归Linux怀抱的老朋友们。2. 准备工作先把系统环境捋顺别让源把你坑了2.1 系统要求与版本确认开始之前请先确认你的系统版本是Ubuntu 20.04.x别拿18.04的命令硬套。检查命令很简单lsb_release -a输出里应该有一行是 Description: Ubuntu 20.04.x LTS。只要是20.04的小版本不管后面小版本号是多少本文的所有命令逻辑都适用。另外记得确认你有sudo权限。MySQL的安装和配置几乎每一步都需要root权限没有一个可用sudo账号后面会遇到很多莫名其妙的权限报错。可以先测试一下sudo whoami如果输出root说明权限OK继续往下走。2.2 apt源检查与换源建议求稳必做这一步非常关键决定了你下载速度是几秒钟还是几分钟。我遇到过太多在国内服务器上直接apt update卡在某个源上半天不动的情况。排查发现默认的archive.ubuntu.com源在国内网络环境下极不稳定尤其访问高峰时段经常超时。我建议在安装之前先把源替换成国内镜像源。清华源、阿里云源、中科大源都是比较稳妥的选择。手把手操作一下先把原源备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后编辑源文件sudo vim /etc/apt/sources.list写入以下内容以清华源为例deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse保存退出后执行sudo apt update sudo apt upgrade -y这个操作不仅能让后续安装提速还能让你的系统保持在较新的软件包状态减少依赖冲突的可能性。2.3 检查系统里是否存在残留MySQL很多时候你是一个人在一台机器上装MySQL但偶尔也会碰到接手别人机器的情况系统里可能残留了旧版本的MySQL或者MariaDB。这时候直接装新包大概率会报错或者端口冲突。先查一下dpkg -l | grep -E mysql|mariadb如果有输出建议先卸载干净注意数据备份。执行的卸载命令如下仅当有残留时执行sudo apt purge mysql-server mysql-client mysql-common mariadb-server mariadb-client -y sudo apt autoremove -y还有一点容易被忽略——检查3306端口是否被占用sudo lsof -i:3306如果这条命令没有任何输出说明端口空闲可以放心往下装。3. 核心安装步骤一步步把MySQL跑起来3.1 安装mysql-server包现在正式进入安装环节。Ubuntu 20.04的默认源里带的是MySQL 8.0这也符合当前主流的生产版本要求。执行sudo apt update sudo apt install mysql-server -y这个过程会自动安装mysql-client、libmysqlclient等依赖包不需要你手动一个一个装。等待进度条跑完正常情况下MySQL服务就已经在后台启动了。可以用下面命令验证服务状态sudo systemctl status mysql如果显示 active (running)说明安装成功服务已经在跑。3.2 检查端口与初次登录服务起来之后先确认监听端口sudo netstat -tlnp | grep 3306正常情况下会输出类似这样的内容tcp6 0 0 :::3306 :::* LISTEN 12345/mysqld这里注意一件事MySQL 8.0默认监听的是IPv6的:::3306但IPv4的0.0.0.0:3306也在监听范围内不影响使用。如果只看tcp4找不到3306不用紧张这是8.0默认配置的原因。初次登录时Ubuntu的apt源安装会保留一套独立的root鉴权方式它走的是auth_socket认证插件也就是你系统当前登录的sudo用户可以直接以root身份进入MySQL不需要密码。命令行直接输入sudo mysql如果你看到熟悉的 mysql 提示符恭喜你已经成功进入了MySQL控制台。3.3 安全初始化更换root密码与配置安全项这里我要说句掏心窝子的话很多人装完MySQL就直接把我那个默认的auth_socket留着用觉得反正别人不能随便登系统。这种做法在本地开发机上勉强说得通但一旦这台机器要对外提供服务或者账号里存的是真实业务数据就是给自己挖坑。最好在安装完成之后立刻执行安全初始化脚本sudo mysql_secure_installation这个交互式脚本会依次问你几个问题我逐个说一下该怎么选、为什么要这么选是否设置密码插件如果你用的是MySQL 8.0它默认支持caching_sha2_password和mysql_native_password两种插件。脚本会提示VALIDATE PASSWORD COMPONENT密码强度校验组件选y开启。强度等级建议选1MEDIUM既不会太松又不会因为太长而难记。选2STRONG的话要求大小写字母、数字、特殊字符全部包含服务器上自己用会有点烦。设置root密码这里输入你想要设置的密码即可。注意密码策略如果是MEDIUM要求至少8位且包含大小写和数字。是否删除匿名用户选y。匿名用户存在就像一个不设防的后门必须删。是否禁止root远程登录选y。默认情况下root只允许从localhost连接这是防止远程暴力破解的关键。如果你需要远程管理建议创建一个专用账号而不是让root暴露在公网。是否删除test数据库选y。test库任何人都能读写生产环境留它就是个安全隐患。是否重新加载权限表选y。让刚才的设置立即生效。脚本跑完之后再执行 sudo mysql 就进不去了因为root认证方式已经变成了密码认证。正确登录方式是mysql -u root -p输入刚才设置的密码进入成功。4. 安装后的基础配置这几项必须动手装完能连上只是万里长征第一步。真正让MySQL贴合业务环境还需要修改几个核心配置项。这些配置倾注了我踩过无数坑后得出的经验一次配好后面少走弯路。4.1 配置字符集为utf8mb4为什么单独把字符集拿出来说因为我见过太多次因为字符集导致中文乱码的bug了。MySQL 8.0的默认字符集已经是utf8mb4了但有些旧版本的配置或者业务迁移过来后仍然可能带着老的utf8或latin1设置导致存入的数据出现问号。打开配置文件sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf在[mysqld]段下加一行character-set-server utf8mb4 collation-server utf8mb4_unicode_ci然后重启服务sudo systemctl restart mysql登录进去验证一下SHOW VARIABLES LIKE character_set_server;输出应该是utf8mb4。这里补充一句utf8mb4比utf8多占用一点空间但它支持完整的Unicode包括表情符号和生僻字现代应用推荐无脑用它。4.2 修改bind-address与远程访问配置MySQL默认只监听本机如果你要在其他机器上用Navicat、DBeaver之类工具连接需要修改监听地址。改之前想清楚你的MySQL服务到底需不需要暴露给其他机器如果需要建议只允许特定IP访问而不是无脑改成0.0.0.0。在mysqld.cnf中bind-address 0.0.0.0重启MySQL后3306端口就会对全网卡开放。然后进入MySQL创建一个允许远程连接、权限受限的账号CREATE USER dev% IDENTIFIED BY 你的密码; GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO dev%; FLUSH PRIVILEGES;这里GRANT的权限按需授不要直接GRANT ALL。我之前帮人排查过一个事故就是因为开发账号权限过大一条误执行的DELETE把订单表清了大半教训非常深刻。4.3 配置日志与慢查询慢查询日志是排查性能问题最直接的线索。你可以把慢查询阈值设置为1秒超过1秒的SQL就会被记录下来。编辑mysqld.cnfslow_query_log 1 slow_query_log_file /var/log/mysql/slow-query.log long_query_time 1 log_queries_not_using_indexes 1重启之后将来如果系统变慢第一件事就是查看这个日志sudo tail -f /var/log/mysql/slow-query.log哪条SQL拖垮了数据库一目了然。5. 常见问题与排查技巧实录5.1 忘记root密码怎么办这是每个人都可能遇到的事不用羞愧。如果你在Ubuntu上忘了root密码处理方式如下先停掉MySQL服务sudo systemctl stop mysql然后以跳过权限表的方式启动sudo mysqld_safe --skip-grant-tables 这样启动之后任何密码都能以root身份登入。然后执行mysql -u root进入控制台后先刷新权限表使密码认证重新生效FLUSH PRIVILEGES;然后修改root密码。注意MySQL 8.0的修改方式和旧版本不同加密方式有区别ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY 新密码; FLUSH PRIVILEGES;最后把临时启动的mysqld进程杀掉再正常启动服务sudo pkill mysqld sudo systemctl start mysql用新密码登录即可。5.2 3306端口被占用MySQL启动失败有时你明明没装过MySQL但3306却被其他进程占了。排查思路很直接sudo lsof -i:3306输出会告诉你哪个进程在占用。如果是之前没卸载干净的mysqld残留进程直接kill掉sudo kill -9 进程号如果占用是因为其他应用比如自己开发的聊天服务、某个缓存组件那就需要改MySQL的默认端口在mysqld.cnf里修改port3307改完别忘重启后续连接时用-P 3307参数指定端口。5.3 apt安装MySQL后无法使用密码登录root安装完成后出现 ERROR 1045 (28000): Access denied 这种报错大多数情况是认证插件的原因。Ubuntu包库自带的MySQL 8.0root用户默认使用auth_socket插件而不是密码认证。安全初始化脚本只在交互中设置了密码但可能没切换认证插件。解决方案有两种方案一保留auth_socket方便本机管理sudo mysql本机直接以系统root身份进入不需要密码。方案二改成密码认证便于远程管理sudo mysql进入后执行ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY 你的密码; FLUSH PRIVILEGES;之后再执行 mysql -u root -p 输入密码就能登录。我个人更推荐方案二因为方案一会让人误以为MySQL没设置密码如果这台机器要交给别人维护会非常混乱。5.4 apt源下载速度慢或报404这个问题在换了源之后基本消失。但偶尔会遇到某个软件包在镜像源上还没有同步的情况尤其是刚发布的版本。建议先执行sudo apt update如果还是404可以临时切换到阿里云源试一下。再不行就回退到官方源等镜像同步完成。需要注意的是切勿混用多个源里的二进制包可能导致依赖库不一致排查起来极其痛苦。5.5 版本认知为什么安装出来是8.0而不是5.7这是很多从CentOS转过来的老哥容易疑惑的点。Ubuntu 20.04的官方源里mysql-server默认就是8.0版本。5.7版本的MySQL在20.04源里已经没有了因为8.0才是社区支持的长期维护版本。如果你确实希望用5.7必须添加MySQL官方的APT仓库手动指定版本。但我的建议是除非你有非常理由旧项目兼容、特定插件依赖否则直接用8.0就好。8.0在性能、安全、JSON支持方面都比5.7有本质提升且语法基本向下兼容。6. 日常维护与性能观察安装完不是结束6.1 开启mysqld服务开机自启Ubuntu的apt包在安装时默认将MySQL设置为了开机自启但还是检查一下比较稳妥sudo systemctl enable mysql如果输出类似于Created symlink说明自启配置已生效。6.2 查看MySQL运行状态的几个高频命令我把日常维护中最高频的几个命令贴出来都是实战中反复用到的# 查看服务状态 sudo systemctl status mysql # 查看错误日志 sudo tail -f /var/log/mysql/error.log # 查看进程 ps -ef | grep mysqld # 查看数据库占用空间 mysql -u root -p -e SELECT table_schema, ROUND(SUM(data_lengthindex_length)/1024/1024, 2) AS Size(MB) FROM information_schema.tables GROUP BY table_schema;6.3 设置简单备份策略不管你的项目多小数据库备份这关躲不开。我用得最顺手的是逻辑备份加定时任务的方式。先创建一个备份脚本sudo vim /usr/local/bin/mysql_backup.sh写入#!/bin/bash BACKUP_DIR/backup/mysql DATE$(date %Y%m%d_%H%M%S) DB_USERroot DB_PASSWORD你的密码 DATABASES$(mysql -u$DB_USER -p$DB_PASSWORD -e SHOW DATABASES; | grep -Ev ^(Database|information_schema|performance_schema|sys)$) mkdir -p $BACKUP_DIR for db in $DATABASES; do mysqldump -u$DB_USER -p$DB_PASSWORD --single-transaction --routines --triggers $db $BACKUP_DIR/${db}_${DATE}.sql done find $BACKUP_DIR -name *.sql -mtime 7 -exec rm {} \;给脚本添加执行权限sudo chmod x /usr/local/bin/mysql_backup.sh然后配置每天凌晨自动备份sudo crontab -e写入一行0 2 * * * /usr/local/bin/mysql_backup.sh每天凌晨两点自动执行备份保留7天既简单又能救急。7. 实用工具推荐命令行之外的几个好帮手严格来说这部分和apt安装本身关联不大但我觉得装完MySQL之后一个顺手的管理工具能让效率翻倍。命令行里的mysql操作对老手来说是效率工具对新手来说就是折磨。建议安装phpMyAdmin或MySQL Workbench。前者适合Web端管理后者是官方桌面客户端。Ubuntu下直接安装MySQL Workbenchsudo apt install mysql-workbench -y如果你在本地Windows或者macOS上装了客户端远程连Ubuntu服务器的MySQL时记得防火墙放行3306端口。如果开了UFW防火墙执行sudo ufw allow from 你的客户端IP to any port 3306这里务必指定IP不要图省事直接对全网段开放。安全领域最怕的就是“临时开放后期忘关”。最后再分享一个我反复使用的小经验我在多次部署中发现每次装完MySQL之后顺手把 /var/log/mysql/error.log 里的ERROR和WARNING全部扫一遍特别有用。有些问题当时不显山不露水但会在某次重启后突然爆发比如权限目录错误、InnoDB日志大小不匹配、字符集告警等等。早发现早处理远比到时候慌慌张张去排查好得多。apt方式装MySQL整个过程走下来核心就几个词源稳定、依赖自动、配置用心、安全到位。只要把这四件事做好你的MySQL基本可以无脑跑上好几年不用大折腾。希望这篇文章能帮到你至少在安装这条路上少走两步冤枉路。