当前位置:首页 > 数据库 > 正文

一台电脑怎么装两个mysql数据库

可通过修改默认端口(如3306→3307)及数据目录,分两次安装;需为各实例配置独立 my.cnf,并设置环境变量

核心原理与前提条件

同一台物理机可并行运行多个MySQL实例的核心在于「差异化标识」——通过不同端口号+独立数据目录+专属配置文件的组合实现隔离,需满足以下基础条件:
充足硬件资源(建议单实例预留至少2GB内存)
操作系统级权限管理能力(Windows/Linux均可)
对MySQL内部机制有一定了解(如套接字通信、进程管理)


实施方案详解(以Windows为例)

环节 原生实例(Instance A) 新增实例(Instance B) 作用说明
监听端口 3306 3307 网络层唯一标识符
数据根目录 C:data_mysql_a D:data_mysql_b 存储数据的物理位置
配置文件 my-default.ini my-instanceB.ini 定义各实例专属参数
服务名称 MySQL MySQL_Second 系统服务管理器中的别名
PID文件 mysqld_a.pid mysqld_b.pid 进程跟踪文件
错误日志 error_a.log error_b.log 故障排查依据

分步操作指南

第一步:准备基础环境

  1. 获取安装介质
    从官网下载相同版本号的ZIP压缩包两次(例:mysql-8.0.35-winx64),分别解压至不同目录:

    X:mysql_base → 原始安装包
    X:mysql_backup → 备用副本
  2. 创建数据存储分区
    新建两个空文件夹作为数据目录:

    C:data_mysql_a (主实例)
    D:data_mysql_b (副实例)

    ️ 注意:后续所有涉及路径的操作均需保持此结构一致性

第二步:配置主实例(A)

  1. 复制基础配置文件模板
    X:mysql_basedatamy-default.ini复制到C:data_mysql_a目录下,重命名为my.ini

  2. 关键参数修改
    编辑C:data_mysql_amy.ini,重点修改项:

    [mysqld]
    basedir = "X:\mysql_base"          # 指向实际安装目录
    datadir = "C:\data_mysql_a"       # 数据存储位置
    port = 3306                        # 默认端口
    character-set-server=utf8mb4       # 字符集设置
    sql_mode=NO_ENGINE_SUBSTITUTION    # 禁用严格模式
  3. 初始化数据库
    以管理员身份打开CMD,执行:

    cd X:mysql_basebin
    mysqld --initialize-insecure --console --datadir="C:data_mysql_a"

    ️ 成功标志:末尾显示”ready for connect”

第三步:部署副实例(B)

  1. 生成独立配置文件
    复制my-default.iniD:data_mysql_b,改名为my.ini

    [mysqld]
    basedir = "X:\mysql_base"
    datadir = "D:\data_mysql_b"
    port = 3307                      # 变更端口号
    socket = "D:/tmp/mysql_b.sock"   # Unix域套接字路径
    log-error = "D:\data_mysql_b\error_b.log"
    pid-file = "D:\data_mysql_b\mysqld_b.pid"
  2. 二次初始化
    同样执行初始化命令:

    mysqld --initialize-insecure --console --datadir="D:data_mysql_b"
  3. 注册系统服务
    创建名为”MySQL_Second”的新服务:

    sc create MySQL_Second binPath= "X:mysql_basebinmysqld.exe" ^
        startParams= "--defaults-file=D:data_mysql_bmy.ini" ^
        displayName= "MySQL Second Instance" ^
        description= "Secondary MySQL Server"

第四步:启动与验证

  1. 启动双实例

    • 主实例:通过「服务」面板启动”MySQL”服务
    • 副实例:启动”MySQL_Second”服务
  2. 连接测试
    | 目标实例 | 连接命令 | 预期结果 |
    |———-|————————————–|————————|
    | A | mysql -h127.0.0.1 -P3306 -uroot | 进入主库命令行界面 |
    | B | mysql -h127.0.0.1 -P3307 -uroot | 进入副库命令行界面 |

  3. 可视化工具配置
    Navicat/DBeaver等工具需新建两个连接配置:

    Connection A: Host=localhost Port=3306
    Connection B: Host=localhost Port=3307

高级管理技巧

动态切换实例
在终端中使用USE语句前缀指定目标实例:

-查询主实例状态
mysql -S /var/run/mysqld/mysqld_a.sock -e "SHOW PROCESSLIST;"
-查询副实例状态
mysql -S /var/run/mysqld/mysqld_b.sock -e "SHOW GRANTS FOR 'root'@'%';"

资源监控
通过任务管理器观察两个mysqld.exe进程的资源占用情况,推荐使用Process Lasso进行智能限流。

自动重启策略
编写批处理脚本实现联级控制:

@echo off
REM 启动顺序:先主后副
net start MySQL
timeout /T 5
net start MySQL_Second
REM 停止顺序:先副后主
net stop MySQL_Second
timeout /T 5
net stop MySQL

FAQs

Q1: 启动副实例时报”Can’t connect to MySQL server on ‘localhost’ (10061)”怎么办?
诊断思路:

  1. 检查端口占用:netstat -ano | findstr 3307确认无其他程序占用
  2. 核对配置文件中的portsocket路径是否正确
  3. 查看错误日志D:data_mysql_berror_b.log获取具体报错信息
    典型修复方案:删除残留锁文件rm -f D:data_mysql_bauto.cnf后重新初始化

Q2: 如何让两个实例互相访问?
跨实例通信配置步骤:

  1. 在主实例创建远程用户:
    CREATE USER 'remote_user'@'%' IDENTIFIED BY 'SecurePass123!';
    GRANT ALL PRIVILEGES ON . TO 'remote_user'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
  2. 在副实例执行:
    CREATE USER 'cross_access'@'127.0.0.1' IDENTIFIED BY 'TempPass456';
    GRANT SELECT ON db_name. TO 'cross_access'@'127.0.0.1';
  3. 测试连接:mysql -h127.0.0.1 -P3307 -ucross_access -p
0