在 Fedora 上装 MySQL:9.7 与 8.4 二选一,以及为什么它默认对全网开放
Fedora 上的 MySQL 有两个可选版本,但只能装一个,而且它的默认行为跟前两篇讲的数据库不一样。
仓库有两个版本,没有 8.0
Section titled “仓库有两个版本,没有 8.0”dnf list --available "mysql*server*.x86_64" 2>/dev/null | grep -E "server"mysql-server.x86_64 9.7.2-1.fc45 fedoramysql8.4-server.x86_64 8.4.11-1.fc45 fedora| 想要 | 装的包 | 版本 | 下载 / 安装 |
|---|---|---|---|
| MySQL 9.x(默认) | mysql-server | 9.7.2 | 21.7 MiB / 125.5 MiB |
| MySQL 8.4 LTS | mysql8.4-server | 8.4.11 | 19.3 MiB / 114.4 MiB |
没有 8.0。 想跑 8.0 只能走 MySQL 官方仓库或容器。
sudo dnf install mysql-servermysqld --version/usr/libexec/mysqld Ver 9.7.2 for Linux on x86_64 (Source distribution)注意路径是 /usr/libexec/mysqld,不是 /usr/sbin/mysqld——mysqld 在 PATH 里靠的是另一个包装脚本。
不用 initdb,直接起
Section titled “不用 initdb,直接起”这点和 PostgreSQL 相反。PostgreSQL 必须 postgresql-setup --initdb,MySQL 装完直接起就行,首次启动会自动初始化数据目录:
sudo systemctl enable --now mysqldsystemctl is-active mysqldactive两个单元:
systemctl list-unit-files | grep mysqldmysqld.service disabled disabled[email protected] disabled disabled[email protected] 同样是多实例模板。
验证能连(而且不需要密码)
Section titled “验证能连(而且不需要密码)”sudo mysql -u root -e "select version();"version()9.7.2看用户表:
sudo mysql -u root -e "select user,host,plugin from mysql.user;"mysql.infoschema localhost caching_sha2_passwordmysql.session localhost caching_sha2_passwordmysql.sys localhost caching_sha2_passwordroot localhost caching_sha2_password全部是本机账户,认证插件是 caching_sha2_password(MySQL 8 起的默认值,比老的 mysql_native_password 安全)。
差异点:3306 监听所有网卡
Section titled “差异点:3306 监听所有网卡”这是 MySQL 与 PostgreSQL、Valkey 最大的默认行为差异:
ss -lntp | grep 3306LISTEN 0 4096 *:3306 *:*LISTEN 0 70 *:33060 *:**:3306 是所有网卡,不是回环。33060 是 X Protocol(MySQL 8 起的另一套协议)。
对比一下三个数据库的默认姿态:
| 服务 | 默认监听 | 默认认证 |
|---|---|---|
| PostgreSQL 18 | 127.0.0.1:5432 | peer / ident,只有 postgres 用户能连 |
| Valkey 9.1 | 127.0.0.1:6379 | 无密码,但只听回环 |
| MySQL 9.7 | *:3306 | root 空密码,且全网可达 |
实验机上还有一层保护——防火墙只开了这三项:
sudo firewall-cmd --list-servicesdhcpv6-client mdns ssh3306 不在里面,所以外面实际连不进来。但不能依赖这个:一旦有人为了「方便」执行 firewall-cmd --add-port=3306/tcp,服务立刻就对全网开放了。
Unix socket 在哪
Section titled “Unix socket 在哪”ss -lx | grep mysql/var/lib/mysql/mysql.sock/var/lib/mysql/mysqlx.sock注意位置变了:不在传统的 /var/lib/mysql/mysql.sock→/run/mysqld/mysqld.sock,而是数据目录下。老脚本里写死 /var/run/mysqld/mysqld.sock 的会连不上。
多版本并存怎么办
Section titled “多版本并存怎么办”| 方案 | 做法 | 说明 |
|---|---|---|
| 多实例 | [email protected] + 不同 datadir / port / socket | 同版本多实例 |
| 官方仓库 | MySQL 官方 yum 源提供 8.0 / 8.4 / 9.x | 可并存,需手动切 |
| 容器 | podman run -d -p 3307:3306 docker.io/library/mysql:8.0 | 最省事,版本随取随用 |
容器方案在多版本场景下最直接:
podman run -d --name mysql80 -p 3307:3306 \ -e MYSQL_ROOT_PASSWORD=secret \ docker.io/library/mysql:8.0这样 9.7 在本机 3306、8.0 在 3307,互不干扰。原理见 Podman 上手。
sudo mysql -u root # 进交互式 shellsudo mysql -u root -e "show databases;"sudo mysql -u root -e "create database app;"mysqladmin -u root status # 运行状态sudo systemctl restart mysqld| 现象 | 原因 |
|---|---|
| 装完连不上 | 服务没起,systemctl start mysqld |
Access denied for user 'root' | 设过密码了,要 -p |
| 远程连不上 3306 | 防火墙没放行(服务本身是全网监听的) |
| 老脚本连 socket 失败 | socket 在 /var/lib/mysql/mysql.sock,不在 /run/mysqld/ |
| 同时装 8.4 报冲突 | 二者互斥,用容器或官方源 |
| 中文乱码 | 建库时没指定字符集,MySQL 8 默认 utf8mb4,检查客户端字符集 |
- PostgreSQL 数据库 — 16/17/18/19 的取舍与 peer 认证
- Valkey 内存数据库 — Fedora 已无 redis 包
- Podman 上手 — 用容器跑多版本数据库
- 防火墙 firewalld — 3306 该不该开
- 官方:MySQL 文档