你这个场景的关键矛盾是:5.7 是用 18.04 的 deb-bundle 强行装在 22.04 上的(已经占了 mysql.service / 3306 / /var/run/mysqld/mysqld.sock),再走 apt install mysql-server 装 8.0 会直接冲突——mysql-common、/etc/mysql/、服务名全都撞。

所以 8.0 别走 apt 了,两条路选一个:


路线 A:本机再装一个 8.0(官方 glibc tarball 手动部署,推荐可控)

8.0 用 Oracle 提供的 “Generic Linux (glibc)” tarball,解压即用,和 5.7 的 deb 完全不打架。

1. 下载 8.0 二进制包

  1. cd /usr/local/src
  2. wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
  3. tar -xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
  4. mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql-8.0

2. 准备目录和用户

  1. # 可以复用已有的 mysql 用户,也可以单独建 mysql80
  2. sudo mkdir -p /var/lib/mysql80 /var/log/mysql /var/run/mysqld
  3. sudo chown -R mysql:mysql /var/lib/mysql80 /var/run/mysqld /var/log/mysql
  4. sudo chown -R mysql:mysql /usr/local/mysql-8.0

3. 独立的 /etc/my80.cnf(端口 / datadir / socket 全隔离)

  1. [mysqld]
  2. basedir = /usr/local/mysql-8.0
  3. datadir = /var/lib/mysql80
  4. socket = /var/run/mysqld/mysqld80.sock
  5. pid-file = /var/run/mysqld/mysqld80.pid
  6. log-error = /var/log/mysql/mysql80.err
  7. port = 3307
  8. user = mysql
  9. server-id = 80
  10. # 8.0 默认 caching_sha2_password,老驱动连不上可加这行
  11. # default_authentication_plugin=mysql_native_password

关键:port ≠ 3306、socket 文件名 ≠ mysqld.sock、datadir ≠ /var/lib/mysql(5.7 在那)

4. 初始化 8.0 数据目录

  1. /usr/local/mysql-8.0/bin/mysqld \
  2. --defaults-file=/etc/my80.cnf \
  3. --initialize \
  4. --user=mysql

临时 root 密码会打在 /var/log/mysql/mysql80.err 里,记下来。

5. 写独立的 systemd 单元 /etc/systemd/system/mysql80.service

  1. [Unit]
  2. Description=MySQL 8.0
  3. After=network.target
  4. [Service]
  5. Type=forking
  6. User=mysql
  7. Group=mysql
  8. ExecStart=/usr/local/mysql-8.0/bin/mysqld --defaults-file=/etc/my80.cnf
  9. LimitNOFILE=65535
  10. [Install]
  11. WantedBy=multi-user.target
  1. sudo systemctl daemon-reload
  2. sudo systemctl enable mysql80
  3. sudo systemctl start mysql80

6. 连接验证

  1. /usr/local/mysql-8.0/bin/mysql -u root -p -S /var/run/mysqld/mysqld80.sock
  2. # 或 TCP
  3. mysql -h 127.0.0.1 -P 3307 -u root -p

5.7 继续走默认的 mysql -u root -p(3306 / /var/run/mysqld/mysqld.sock),互不干扰。


路线 B:Docker 跑 8.0(最省事,对宿主机零污染)

如果你只是要用 8.0、不想折腾 tarball 和 systemd 单元,一句完事:

  1. docker run --name mysql80 \
  2. -p 127.0.0.1:3307:3306 \
  3. -v /var/lib/mysql80-docker:/var/lib/mysql \
  4. -e MYSQL_ROOT_PASSWORD=你的密码 \
  5. -d mysql:8.0

连接:mysql -h 127.0.0.1 -P 3307 -u root -p。宿主机 5.7 的 deb 服务完全不受影响,这也是 AskUbuntu 上同问的被采纳答法。


顺手提一句你 5.7 那边的隐患

mysql-server_5.7.42-1ubuntu18.04_amd64.deb-bundle.tar 是给 18.04 打的,在 22.04 跑依赖 libssl1.1 和 libtinfo5,22.04 默认是 libssl3——你能装上说明这俩你已经补过了,但如果哪天 5.7 起不来,先检查这俩 .so 还在不在。

💡 选哪个?想本机长期共存、两个实例都要 systemctl 管 → 路线 A;只想”能用 8.0 客户端/连一下”→ 路线 B 的 Docker 更干净,5.7 那个 18.04 deb 本来就是勉强跑的,少碰它。