如何在宝塔中同时运行MySQL 5.7和MySQL 8.0?

在宝塔面板中同时运行 MySQL 5.7 和 8.0 是可行的,但需要手动配置(因为宝塔默认只允许安装一个版本)。以下是详细步骤:


✅ 前提条件

  • 服务器为 Linux(推荐 CentOS 7+/Ubuntu 18.04+)
  • 已安装宝塔面板(且拥有 root 权限)
  • 磁盘空间充足(两个实例需独立数据目录)
  • 注意:两个实例必须使用不同的端口、数据目录、socket 文件

🔧 方案一:通过源码编译安装 MySQL 8.0(推荐)

此方式最灵活,可避免与系统包冲突。

步骤 1:准备环境

# 安装依赖
yum install -y cmake gcc gcc-c++ ncurses-devel openssl-devel 
    libaio libaio-devel bison perl wget tar

# 创建专用用户(安全最佳实践)
useradd -r -s /sbin/nologin mysql8
mkdir -p /data/mysql8
chown -R mysql:mysql /data/mysql8

步骤 2:下载并编译 MySQL 8.0

cd /opt
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.17-x86_64.tar.xz
tar -xJf mysql-8.0.36-linux-glibc2.17-x86_64.tar.xz
mv mysql-8.0.36-linux-glibc2.17-x86_64 mysql8

# 初始化(指定不同端口和数据目录)
cd /opt/mysql8/bin
./mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql8 --datadir=/data/mysql8/data 
         --port=3307 --socket=/tmp/mysql8.sock

# 设置启动脚本
cp support-files/mysql.server /etc/init.d/mysqld8
chmod +x /etc/init.d/mysqld8

步骤 3:修改配置文件 /etc/my.cnf

[client]
port = 3307
socket = /tmp/mysql8.sock

[mysqld]
port = 3307
socket = /tmp/mysql8.sock
datadir = /data/mysql8/data
basedir = /opt/mysql8
pid-file = /var/run/mysqld/mysqld8.pid
bind-address = 0.0.0.0
skip-name-resolve
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

[mysql]
port = 3307
socket = /tmp/mysql8.sock
default-character-set = utf8mb4

⚠️ 确保 3307 未被占用(可用 netstat -tlnp | grep 3307 检查)

步骤 4:启动服务

# 创建日志目录
mkdir -p /var/log/mysql8
chown mysql:mysql /var/log/mysql8

# 启动
/etc/init.d/mysqld8 start

# 查看状态
/etc/init.d/mysqld8 status

步骤 5:首次登录 & 重置密码

# 临时免密登录
mysql -u root -h 127.0.0.1 -P 3307 -S /tmp/mysql8.sock

# 登录后执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的强密码';
FLUSH PRIVILEGES;
EXIT;

步骤 6:开机自启

chkconfig --add mysqld8
chkconfig mysqld8 on

🔄 验证双版本共存

# 测试 MySQL 5.7(宝塔默认,通常端口 3306)
mysql -u root -p -P 3306

# 测试 MySQL 8.0(新装,端口 3307)
mysql -u root -p -P 3307 -S /tmp/mysql8.sock

✅ 若两者均能正常连接,说明成功!


💡 补充建议

项目 建议
端口分配 5.7 → 3306,8.0 → 3307(或更高不冲突端口)
数据库管理 宝塔无法直接管理第二个实例,需用命令行或 phpMyAdmin(需指定端口)
phpMyAdmin 编辑 www/server/phpmyadmin/config.inc.php,添加多连接配置;或使用 Adminer 更灵活
备份策略 分别对两个实例制定 mysqldump 定时任务
性能监控 可使用 pt-stress, mysqld_exporter + Prometheus 分别监控

❌ 常见错误排查

问题 解决方案
Address already in use 更换端口(如 3308),并同步修改 my.cnf 和启动参数
Can't connect to local MySQL server through socket 检查 socket 路径是否正确,确认 mysqld 是否用该 socket 启动
Access denied for user 'root'@'localhost' 8.0 初始无密码,首次登录后立即设置密码并刷新权限
宝塔界面看不到 8.0 正常现象——宝塔仅管理主实例,次实例需命令行操作

需要我提供:

  • 自动化部署脚本(一键安装双版本)?
  • PHP 应用如何切换连接不同版本数据库的配置示例?
  • Docker 方案(更隔离、易维护)?

欢迎告诉我你的具体需求 😊

云服务器