跳转到内容
搜索 Fedora 文档

    浏览当前文档目录

    在 Fedora 上装 MySQL:9.7 与 8.4 二选一,以及为什么它默认对全网开放

    Fedora 上的 MySQL 有两个可选版本,但只能装一个,而且它的默认行为跟前两篇讲的数据库不一样。

    MySQL 全网卡监听与 PostgreSQL、Valkey 回环监听的默认姿态对比

    Terminal window
    dnf list --available "mysql*server*.x86_64" 2>/dev/null | grep -E "server"
    mysql-server.x86_64 9.7.2-1.fc45 fedora
    mysql8.4-server.x86_64 8.4.11-1.fc45 fedora
    想要装的包版本下载 / 安装
    MySQL 9.x(默认)mysql-server9.7.221.7 MiB / 125.5 MiB
    MySQL 8.4 LTSmysql8.4-server8.4.1119.3 MiB / 114.4 MiB

    没有 8.0。 想跑 8.0 只能走 MySQL 官方仓库或容器。

    Terminal window
    sudo dnf install mysql-server
    mysqld --version
    /usr/libexec/mysqld Ver 9.7.2 for Linux on x86_64 (Source distribution)

    注意路径是 /usr/libexec/mysqld,不是 /usr/sbin/mysqld——mysqld 在 PATH 里靠的是另一个包装脚本。

    这点和 PostgreSQL 相反。PostgreSQL 必须 postgresql-setup --initdb,MySQL 装完直接起就行,首次启动会自动初始化数据目录:

    Terminal window
    sudo systemctl enable --now mysqld
    systemctl is-active mysqld
    active

    两个单元:

    Terminal window
    systemctl list-unit-files | grep mysqld
    mysqld.service disabled disabled
    [email protected] disabled disabled

    [email protected] 同样是多实例模板。

    Terminal window
    sudo mysql -u root -e "select version();"
    version()
    9.7.2

    看用户表:

    Terminal window
    sudo mysql -u root -e "select user,host,plugin from mysql.user;"
    mysql.infoschema localhost caching_sha2_password
    mysql.session localhost caching_sha2_password
    mysql.sys localhost caching_sha2_password
    root localhost caching_sha2_password

    全部是本机账户,认证插件是 caching_sha2_password(MySQL 8 起的默认值,比老的 mysql_native_password 安全)。

    这是 MySQL 与 PostgreSQL、Valkey 最大的默认行为差异:

    Terminal window
    ss -lntp | grep 3306
    LISTEN 0 4096 *:3306 *:*
    LISTEN 0 70 *:33060 *:*

    *:3306 是所有网卡,不是回环。33060 是 X Protocol(MySQL 8 起的另一套协议)。

    对比一下三个数据库的默认姿态:

    服务默认监听默认认证
    PostgreSQL 18127.0.0.1:5432peer / ident,只有 postgres 用户能连
    Valkey 9.1127.0.0.1:6379无密码,但只听回环
    MySQL 9.7*:3306root 空密码,且全网可达

    实验机上还有一层保护——防火墙只开了这三项:

    Terminal window
    sudo firewall-cmd --list-services
    dhcpv6-client mdns ssh

    3306 不在里面,所以外面实际连不进来。但不能依赖这个:一旦有人为了「方便」执行 firewall-cmd --add-port=3306/tcp,服务立刻就对全网开放了。

    Terminal window
    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 的会连不上。

    方案做法说明
    多实例[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最省事,版本随取随用

    容器方案在多版本场景下最直接:

    Terminal window
    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 上手。

    Terminal window
    sudo mysql -u root # 进交互式 shell
    sudo 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,检查客户端字符集