要在一台刚装好的 Ubuntu 上跑起 MySQL 8,真正需要的命令不超过十条。装只是第一步,装完不改的两处配置会让你的数据库要么连不上、要么裸奔在公网——这篇把顺序、每条命令的含义和踩坑点一次讲清。
下面的流程在 Ubuntu 22.04 与 24.04 上都验证过,MySQL 版本是 8.0.x。不确定自己源里是哪个版本,先跑 apt policy mysql-server 看一眼。
一、安装与启动
sudo apt update
sudo apt install -y mysql-server
sudo systemctl enable --now mysql # 开机自启 + 立即启动
systemctl status mysql # 看到 active (running) 就成了
mysql --version # 确认版本
Ubuntu 的 mysql-server 包会自动把 systemd 服务建好,服务名就叫 mysql(不是 mysqld)。装完默认已经在监听 3306,只是只监听本机。
想装比源里更新的版本,去 MySQL 官网下 mysql-apt-config 的 deb 包装上,它会在 /etc/apt/sources.list.d/ 里加官方源,再 sudo apt update && sudo apt install -y mysql-server 就行。生产环境不建议追最新小版本,跟着 LTS 发行版走更省心。
二、安全初始化:这一步千万别跳过
sudo mysql_secure_installation
它会问一串问题,每个选项的实际含义如下:
| 提问 | 建议 | 说明 |
|---|---|---|
| 启用密码强度校验组件 | 是 | 拒绝 123456 这种弱口令,生产必开 |
| 密码强度等级 | MEDIUM(1) | LOW 只查长度,STRONG 还要字典/大小写/符号 |
| 删除匿名用户 | 是 | 匿名用户能让任意本地连接进来 |
| 禁止 root 远程登录 | 是 | root 只允许本机,应用一律用专用账号 |
| 删除 test 库 | 是 | 默认 test 库对所有人可写 |
| 重新加载权限表 | 是 | 让以上修改立即生效 |
Ubuntu 上有个和别的发行版不一样的点:root 默认用 auth_socket 插件认证。 意思是 root 不靠密码,而是靠「你是系统 root」——所以 mysql -u root -p 可能直接被拒,而 sudo mysql 能直接进:
sudo mysql # 这样能进,因为走了 socket 认证
想给 root 设成密码登录(有些运维脚本需要),进库后执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '你的强密码';
FLUSH PRIVILEGES;
反过来,如果只是为了本地管理,保持 auth_socket 反而更安全,不需要改。
三、建库建用户:别拿 root 给应用用
CREATE DATABASE appdb
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY '另一个强密码';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
三个细节值得记:
- 字符集用
utf8mb4而不是utf8。MySQL 的utf8是残缺的三字节实现,存不了 emoji 和部分生僻汉字;utf8mb4才是真 UTF-8。8.0 默认排序规则是utf8mb4_0900_ai_ci,比老的utf8mb4_general_ci更符合 Unicode 标准。 - 授权按最小权限给。应用通常不需要
DROP、ALTER,更不需要SUPER。 - MySQL 8 默认认证插件是
caching_sha2_password。老客户端(比如某些版本的 PHP mysqli、Navicat 11、Python 的旧 MySQLdb)连不上就是这个原因。应急办法是给用户改回mysql_native_password:
ALTER USER 'appuser'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';
但要注意这只是兼容退让,不是推荐做法——优先升级客户端。
四、开放远程连接:要改两处
只改一处是连不上的,这是新手最常卡的地方。
第一处:MySQL 自己只监听 127.0.0.1。
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
找到 bind-address,改成 0.0.0.0(监听所有网卡)或者你的内网 IP:
bind-address = 0.0.0.0
然后重启:sudo systemctl restart mysql,用 ss -lntp | grep 3306 确认已经监听在 0.0.0.0:3306 而不是 127.0.0.1:3306。
第二处:用户账号本身不允许远程。
MySQL 的用户是 '用户名'@'主机名' 二元组,'appuser'@'localhost' 和 'appuser'@'%' 是两个完全不同的账号。远程连要把主机部分改成允许来源:
CREATE USER 'appuser'@'%' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
第三处(容易被忘):防火墙和云安全组。
sudo ufw allow from 192.168.1.0/24 to any port 3306 # 只放行内网段,推荐
sudo ufw allow 3306/tcp # 放行全网,只在测试时临时用
sudo ufw reload
如果你用的是云服务器(腾讯云 / 阿里云 / 华为云),安全组是独立于系统防火墙的第二道墙,控制台里不开放 3306,系统里全放行也连不上。
最后用客户端验证:
mysql -h 服务器IP -P 3306 -u appuser -p
👉 端口通不通可以先不装客户端就测:HTTP 探测与 Ping 工具(在线免登录)、SSH 连通性检测、Linux 命令速查
五、五个高频报错的排查顺序
| 报错 | 真正原因 | 怎么查 |
|---|---|---|
ERROR 1698 (28000): Access denied for user 'root'@'localhost' |
root 走 auth_socket,不给密码登录 | 用 sudo mysql 进 |
ERROR 1130: Host 'x.x.x.x' is not allowed to connect |
用户主机部分是 localhost | 建 'user'@'%' 或指定来源 |
ERROR 2003 (HY000): Can't connect to MySQL server |
服务没起 / bind 没改 / 防火墙或安全组挡了 | 依次查 systemctl、ss -lntp、ufw status、云控制台 |
ERROR 1045 (28000): Access denied |
密码错,或客户端不支持 caching_sha2 | 重置密码 / 改认证插件 |
| 启动失败,journal 里报 datadir 权限 | /var/lib/mysql 属主不是 mysql |
sudo chown -R mysql:mysql /var/lib/mysql |
查日志永远是第一步:sudo journalctl -u mysql -n 50 --no-pager,或者看 /var/log/mysql/error.log。
六、忘记 root 密码怎么办
sudo systemctl stop mysql- 起一个跳过权限表的实例:
sudo mysqld_safe --skip-grant-tables --skip-networking & - 无密码进库:
sudo mysql -u root - 改密码:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
- 杀掉临时实例,正常启动:
sudo systemctl restart mysql
注意 --skip-networking 一定要带上,否则这几十秒里数据库是对全网无密码开放的。
七、彻底卸载
sudo systemctl stop mysql
sudo apt purge -y mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-*
sudo rm -rf /etc/mysql /var/lib/mysql
sudo apt autoremove -y
sudo apt autoclean
purge 和 remove 的区别是前者会连配置文件一起删;数据目录 /var/lib/mysql 不会被包管理器删除,重装想彻底干净就得手动删——删之前确认备份过。
小结
Ubuntu 装 MySQL 8 的顺序是:apt 安装 → mysql_secure_installation → 建 utf8mb4 库 → 建专用账号 → 改 bind-address 和账号 host → 放行防火墙与安全组。九成「装完连不上」的问题都出在最后两步只做了一半。
把数据库暴露到公网之前,先问自己一句:这个账号的密码扛得住暴力破解吗?改成强密码、限制来源 IP、关掉 root 远程,这三件事做完再开端口。