努力
加油

想在已有MySQL 8.0的宝塔服务器上再装一个5.7版本,该怎么操作?

在宝塔面板(BT Panel)环境中,同时运行 MySQL 5.7 和 MySQL 8.0 是完全可行的,但需要遵循严格的端口隔离、文件路径隔离以及权限管理原则。

以下是基于生产环境最佳实践的操作指南,分为“标准推荐方案”和“高风险手动方案”两部分。强烈建议采用方案一。


⚠️ 核心注意事项(必读)

  1. 不要直接覆盖安装:切勿在同一套二进制文件中强行替换版本,这会导致服务崩溃或数据损坏。
  2. 端口冲突:MySQL 默认使用 3306 端口。如果两个实例都监听 3306,必然冲突。必须为其中一个实例修改默认端口(如 3307)。
  3. 配置文件隔离:每个 MySQL 实例必须有独立的 my.cnf 配置文件和数据目录。
  4. 权限问题:确保新安装的 MySQL 用户拥有对应数据目录的读写权限。

✅ 方案一:通过宝塔面板插件/扩展安装(推荐,最稳定)

宝塔官方并不直接提供“双 MySQL 共存”的一键按钮,但可以通过以下方式实现:

方法 A:使用宝塔第三方插件(如“多版本 PHP/MySQL 管理器”类插件)

部分社区维护的宝塔插件支持多版本共存。你可以前往宝塔插件市场搜索关键词:“MySQL 多版本”、“PHP 多版本”等,寻找评分高、更新及时的插件。

注意:此方法依赖插件作者维护,可能存在兼容性问题,请谨慎评估风险。

方法 B:使用宝塔的“软件商店”中的“MySQL 5.7”与“MySQL 8.0”分别部署(不推荐用于同一服务器)

宝塔软件商店通常只允许安装一个主 MySQL 实例。如果你尝试再次点击“安装”,它会提示已存在。因此,此路径不通。


✅ 方案二:手动编译/二进制安装 + 宝塔集成(专业推荐)

这是最可控、最稳定的方式。我们将 MySQL 5.7 作为独立服务安装在非默认路径下,并通过系统 systemd 管理,最后让宝塔能够识别并监控它。

步骤 1:准备环境

登录服务器,切换到 root 用户:

sudo -i

步骤 2:下载并解压 MySQL 5.7 二进制包

假设我们使用通用的 Linux Glibc 包(以 CentOS 7 / Ubuntu 为例):

# 创建安装目录
mkdir -p /usr/local/mysql57

# 下载 MySQL 5.7.36(示例版本,请根据需求选择)
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz

# 解压
tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/mysql57
mv /usr/local/mysql57/mysql-5.7.36-linux-glibc2.12-x86_64/* /usr/local/mysql57/
rm -rf /usr/local/mysql57/mysql-5.7.36-linux-glibc2.12-x86_64

步骤 3:创建专用用户和数据目录

# 创建 mysql57 用户
useradd -r -s /bin/false mysql57

# 创建数据目录
mkdir -p /data/mysql57/data
mkdir -p /data/mysql57/logs
mkdir -p /data/mysql57/tmp

# 设置权限
chown -R mysql57:mysql57 /data/mysql57
chown -R mysql57:mysql57 /usr/local/mysql57
chmod 750 /data/mysql57/data

步骤 4:初始化 MySQL 5.7

cd /usr/local/mysql57/bin

# 初始化数据库,生成随机密码
./mysqld --initialize --user=mysql57 --basedir=/usr/local/mysql57 --datadir=/data/mysql57/data

# 记下输出的临时密码!稍后登录需要用到。

步骤 5:创建配置文件 my.cnf

创建 /etc/my57.cnf,内容如下(关键配置):

[mysqld]
port = 3307                # ⚠️ 关键:使用不同端口,避免与主 MySQL 3306 冲突
basedir = /usr/local/mysql57
datadir = /data/mysql57/data
socket = /tmp/mysql57.sock # ⚠️ 关键:独立 socket 文件
pid-file = /var/run/mysqld/mysqld57.pid
log-error = /data/mysql57/logs/error.log
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
lower_case_table_names = 1 # 根据需求设置大小写敏感

[client]
port = 3307
socket = /tmp/mysql57.sock
default-character-set = utf8mb4

步骤 6:创建 Systemd 服务文件

创建 /etc/systemd/system/mysql57.service:

[Unit]
Description=MySQL 5.7 Independent Service
After=network.target

[Service]
Type=forking
User=mysql57
Group=mysql57
ExecStart=/usr/local/mysql57/bin/mysqld_safe --defaults-file=/etc/my57.cnf
ExecStop=/usr/local/mysql57/bin/mysqladmin -u root -S /tmp/mysql57.sock shutdown
Restart=on-failure
LimitNOFILE = 5000

[Install]
WantedBy=multi-user.target

重载 systemd 并启动:

systemctl daemon-reload
systemctl enable mysql57
systemctl start mysql57
systemctl status mysql57

此时,MySQL 5.7 已在后台运行,监听端口 3307。


🛠️ 步骤 7:让宝塔面板“感知”到新的 MySQL 5.7

宝塔面板默认只监控 /usr/local/mysql 下的实例。为了让你在宝塔中也能看到和管理这个 5.7 实例,需要进行以下操作:

方法 A:软链接法(简单粗暴,但不推荐用于生产)

将宝塔监控的路径指向新实例,但这会干扰原 MySQL 的管理。

方法 B:修改宝塔监控脚本(高级)

  1. 找到宝塔的 MySQL 监控脚本,通常位于 /www/server/panel/plugin/mysql_multi/ 或类似路径(取决于宝塔版本和插件)。
  2. 如果没有相关插件,你需要手动在宝塔“软件商店”中安装“MySQL 5.7”插件,但该插件通常会尝试接管默认安装。

更实用的做法是:
由于宝塔主要功能是网站管理和数据库连接池,你实际上只需要知道如何连接即可。你可以通过以下方式在宝塔中使用 MySQL 5.7:

  1. phpMyAdmin 连接:

    • 打开 phpMyAdmin。
    • 在连接设置中,主机填写 127.0.0.1,端口填写 3307。
    • 用户名/密码使用初始化时生成的临时密码或后续设置的密码。
  2. 代码连接:
    在你的 PHP/Python/Java 项目中,直接配置连接参数:

    // PHP PDO 示例
    $dsn = 'mysql:host=127.0.0.1;port=3307;dbname=testdb;charset=utf8mb4';
    $pdo = new PDO($dsn, 'root', 'your_password');
  3. 宝塔数据库列表显示问题:
    宝塔面板首页的“数据库”标签页默认只显示主 MySQL(3306)管理的数据库。要查看 5.7 的数据库,请使用 phpMyAdmin 或通过命令行:

    mysql -u root -p -P 3307 -S /tmp/mysql57.sock
    SHOW DATABASES;

🔐 步骤 8:安全加固

  1. 修改 root 密码:

    mysql -u root -p -P 3307 -S /tmp/mysql57.sock
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPassword123!';
    FLUSH PRIVILEGES;
    exit;
  2. 防火墙放行:
    如果需要通过远程访问 MySQL 5.7,需在宝塔“安全”面板中添加规则,放行 3307 端口。

  3. 备份策略:
    使用 mysqldump 对 5.7 实例进行独立备份:

    mysqldump -u root -p -P 3307 -S /tmp/mysql57.sock --all-databases > /backup/mysql57_full_backup.sql

❌ 为什么不推荐其他方法?

方法 风险 说明
直接卸载原 MySQL 再装 5.7 极高 会导致所有基于 8.0 的网站和服务中断,且可能残留配置问题。
Docker 容器化部署 中 如果你熟悉 Docker,这是最优雅的方案。可以完全隔离环境,不影响主机。但需要额外学习 Docker 命令,且宝塔对 Docker 内 MySQL 的管理支持有限。
修改默认端口但不分离路径 高 极易造成文件权限混乱,导致启动失败。

💡 替代方案:使用 Docker(更现代、更干净)

如果你愿意接受 Docker,这是目前最推荐的“多版本共存”方案:

# 拉取 MySQL 5.7 镜像
docker pull mysql:5.7

# 运行容器
docker run -d 
  --name mysql57 
  -p 3307:3306 
  -e MYSQL_ROOT_PASSWORD=YourSecurePassword 
  -v /data/docker/mysql57/data:/var/lib/mysql 
  -v /data/docker/mysql57/config:/etc/mysql/conf.d 
  mysql:5.7

# 这样,你的主机上 3306 端口仍是宝塔管理的 MySQL 8.0,而 3307 端口是独立的 MySQL 5.7 容器。

优势:

  • 完全隔离,互不影响。
  • 易于迁移和备份。
  • 不会污染主机文件系统。
  • 宝塔依然可以正常管理其自身的 MySQL 8.0。

总结

  1. 若追求稳定且不想引入新技术栈:采用方案二,手动安装 MySQL 5.7 到独立路径,使用 3307 端口,通过 Systemd 管理,并在应用层指定连接参数。
  2. 若追求简洁和可维护性:强烈建议使用 Docker 部署 MySQL 5.7,映射到 3307 端口。
  3. 绝对禁止:在同一套二进制文件中切换版本,或在不隔离端口的情况下重复安装。

请根据你的技术能力和业务连续性要求选择合适的方案。对于生产环境,Docker 方案通常是最佳实践。