MySQL多实例管理如何在一台主机上运行多个mysql

2025-07-24 20:50

本文主要是介绍MySQL多实例管理如何在一台主机上运行多个mysql,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读...

一、什么是MySQL多实例

多实例,就是在一台linux主机上运行多个MySQL,节约计算资源,区别在于不同的端口。

MySQL多实例管理如何在一台主机上运行多个mysql

例如
# 数据库实例1
/my_mysql/3306/          #目录
/my_mysql/3306/data      #数据文件夹
/my_mysql/3306/my.cnf    #配置文件
/my_mysql/3306/mysqld    #启动脚本
# 数据库实例2
/my_mysql/3307/data   
/my_mysql/3307/my.cnf 
/my_mysql/3307/mysqld
# 不同的应用程序,读取不同的mysql实例

大型企业读写分离架构:

MySQL多实例管理如何在一台主机上运行多个mysql

基于—个mysql应用,初始化三次,生成3个独立的mysql数据目录,即为三个mysql独立的实例

二、二进制方式安装MySQL

1.获取二进制代码包

wget https://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz

2.安装基础依赖

yum install ncurses-devel libaio-devel gcc make cmake -y

3.清空原安装内容(没有可忽略)

前面编译安装时已经启动MySQL,所以现在要先将它停掉(没有编译安装的可忽略);

MySQL多实例管理如何在一台主机上运行多个mysql

清空之前编译安装mysql,配置的环境的清理,清空PATH有关的mysql。

#进入文件
vim /etc/profile
#将以下这行注释掉
export PATH=/application/mysql/bin:$PATH
#停止当前linux的mysql,(如果存在mysql端口的话)
[root@mysql-01 tools]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!

4.创建mysql用户

# 这里无须重新创建
[root@mysql-01 tools]# id mysql
uid=1000(mysql) gid=1000(mysql) 组=1000(mysql)
[root@mysql-01 tools]#
# 没有创建mysql用户的需要创建

准备好mysql多实例的数据目录

mkdir -p /my_mysql/{3306,3307}
[root@mysql-01 tools]# tree /my_mysql/
/my_mysql/
├── 3306
└── 3307
2 directories, 0 files

5.解压缩二进制的mysql软件包

# -C 指定目录解压缩
[root@mysql-01 tools]# tar -zxvf mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz -C /application
#解压完成
[root@mysql-01 tools]# cd /application/
[root@mysql-01 application]# ls -lth
总用量 0
# 刚才解压缩的二进制mysql安装目录
drwxr-xr-x 13 root  root  191 7月   3 11:15 mysql-5.6.40-linux-glibc2.12-x86_64
#编译安装生成的mysql安装目录
drwxr-xr-x 14 mysql mysql 216 7月   2 16:36 mysql-5.6.40
# —个简单的软连接
lrwxrwxrwx  1 root  root   26 7月   2 16:13 mysql -> /application/mysql-5.6.40/

6.准备二进制mysql运行所需的环境

准备mysql多实例的,各个配置文件

3306

3307

准备各个启停管理脚本

数据初始化,生成mysql的初始化data数据

三、准备多实例配置文件

#看好路径
[root@mysql-01 mysql-5.6.40-linux-glibc2.12-x86_64]# pwd
/application/mysql-5.6.40-linux-glibc2.12-x86_64
[root@mysql-01 mysql-5.6.40-linux-glibc2.12-x86_64]# cd /my_mysql/
[root@mysql-01 my_mysql]# cd 3306
[root@mysql-01 3306]# pwd
/my_mysql/3306

3306实例的配置文件

#创建文件
vim my.cnf
[client]
[mysqld]
port=3306
sockeChina编程t=/my_mysql/3306/mysql.sock
basedir=/application/mysql-5.6.40-linux-glibc2.12-x86_64/
datadir=/my_mysql/3306/data
log-bin=/my_mysql/3306/mysql-bin
server-id=1
[mysqld_safe]
log-error=/my_mysql/3306/mysql_3306_error.log
pid-file=/my_mysql/3306/mysqld_3306.pid

同样修改3307的配置文件

#注意修改如下参数
#3306换成3307;server-id不能和3306实例重复
[root@mysql-01 3306]# cd ../3307
[root@mysql-01 3307]# vim my.cnf
[client]
[mysqld]
port=3307
socket=/my_mysql/3307/mysql.sock
basedir=/application/mysql-5.6.40-linux-glibc2.12-x86_64/
datadir=/my_mysql/3307/data
log-bin=/my_mysql/3307/mysql-bin
server-id=2
[mysqld_safe]
log-error=/my_mysql/3307/mysql_3307_error.log
pid-file=/my_mysql/3307/mysqld_3307.pid

四、MySQL(3306端口)启停脚本编程

注意!!!3307和3306 得区别开,需自行手动修改

[root@mysql-01 3307]# cd ../3306
[root@mysql-01 3306]# vim mysql_3306

将以下内容粘贴进去

#!/bin/bash
# MySQL服务管理脚本
port=3306
mysql_user="mysqlIXfSgl"
Cmdpath="/application/mysql-5.6.40-linux-glibc2.12-x86_64/bin/"
mysql_sock="/my_mysql/${port}/mysql.sock"
mysqld_pid_file_path="/my_mysql/${port}/mysqld_${port}.pid"
start() {
    if [ ! -e "$mysql_sock" ]; then
        printf "Starting MySQL...\n"
        /bin/sh ${Cmdpath}/mysqld_safe --defaults-file=/my_mysql/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
        sleep 3
    else
        printf "MySQL is running...\n"
        exit 1
    fi
}
stop() {
    if [ ! -e "$mysql_sock" ]; then
        printf "MySQL is stopped...\n"
        exit 1
    else
        printf "Stopping MySQL...\n"
        mysqld_pid=$(cat "$mysqld_pid_file_path")
        if kill -0 $mysqld_pid 2>/dev/null; then
            kill $mysqld_pid
            sleep 2
        fi
    fi
}
restart() {
    printf "Restarting MySQL...\n"
    stop
    sleep 2
    start
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    *)
        printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
        exit 1
        ;;
esac
#赋予权限
[root@mysql-01 3306]# chmod +x mysql_3306

五、MySQL(3307启停脚本)

跟上面操作类似

cd ../3307
vim mysql_3307
#!/bin/bash
# MySQL服务管理脚本
port=3307
mysql_user="mysql"
Cmdpath="/application/mysql-5.6.40-linux-glibc2.12-x86_64/bin/"
mysql_sock="/my_mysql/${port}/mysql.sock"
mysqld_pid_file_path="/my_mysql/${port}/mysqld_${port}.pid"
start() {
    if [ ! -e "$mysql_sock" ]; then
        printf "Starting MySQL...\n"
        /bin/sh ${Cmdpath}/mysqld_safe --defaults-file=/my_mysql/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
        sleep 3
    else
        printf "MySQL is running...\n"
        exit 1
    fi
}
stop() {
    if [ ! -e "$mysql_sock" ]; then
        printf "MySQL is stopped...\n"
        exit 1
    else
        printf "Stopping MySQL...\n"
        mysqld_pid=$(cat "$mysqld_pid_file_path")
        if kill -0 $mysqld_pid 2>/dev/null; then
            kill $mysqld_pid
            sleep 2
        fi
    fi
}
restart() {
    printf "Restarting MySQL...\n"
    stop
    sleep 2
    start
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    *)
        printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
        exit 1
        ;;
esac
#赋权
chmod +x mysql_3307

六、用户、组授权

降低权限,全部赋予给mysql

[root@mysql-01 3307]# chown -R mysql.mysql /my_mysql/

七、PATH配置

[root@mysql-01 ~]# vim /etc/profile
[root@mysql-01 ~]# tail -1 /etc/profile
export PATH=/application/mysql-5.6.40-linux-glibc2.12-x86_64/bin:$PATH
[root@mysql-01 ~]# source /etc/profile
[root@mysql-01 ~]# echo $PATH
/application/mysql-5.6.40-linux-glibc2.12-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[root@mysql-01 ~]# which mysql
/application/mysql-5.6.40-linux-glibc2.12-x86_64/bin/mysql

八、创建多个实例对应的数据目录

分别创建 3306 3307 两个实例的数据目录

mkdir js-p /my_mysql/3307/data
mkdir -p /my_mysql/3306/data

查看一下

[root@mysql-01 ~]# tree /my_mysql
/my_mysql
├── 3306
│   ├── my.cnf
│   └── mysql_3306
└── 3307
    ├── data
    ├── my.cnf
    └── mysql_3307
3 directories, 4 files

九、MySQL多实例初始化

先初始化3306的数据

ls /my_mysql/3306/data/
# 此时3306的data文件夹是空的,没有数据

执行初始化,生成mysql运行所需的初始数据

sudo /application/mysql-5.6.40-linux-glibc2.12-x86_64/scripts/mysql_install_db \
--defaults-file=/my_mysql/3306/my.cnf \
--basedir=/application/mysql-5.6.40-linux-glibc2.12-x86_64/ \
--datadir=/my_mysql/3306/data/ \
--user=mysql

出现2个ok后,表示正常

MySQL多实例管理如何在一台主机上运行多个mysql

此时会正确生成mysql的初始数据

[root@mysql-01 ~]# ls -l /my_mysql/3306/data
总用量 110600
-rw-rw---- 1 mysql mysql 12582912 7月   3 15:36 ibdata1
-rw-rw---- 1 mysql mysql 50331648 7月   3 15:36 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 7月   3 15:36 ib_logfile1
drwx------ 2 mysql mysql     4096 7月   3 15:36 mysql
drwx------ 2 mysql mysql     4096 7月   3 15:36 performance_schema
drwx------ 2 mysql mysql        6 7月   3 15:36 test

同样,生成3307数据

sudo /application/mysql-5.6.40-linux-glibc2.12-x86_64/scripts/mysql_install_db \
--defaults-file=/my_mysql/3307/my.cnf \
--basedir=/application/mysql-5.6.40-linux-glibc2.12-x86_64/ \
--datadir=/my_mysql/3307/data/ \
--user=mysql

跟上面相类似,出现两个OK表示初始化成功;

同样可以通过ls命令查看,这里不多赘述。

十、分别启动MySQL多实例

创建mysql的错误日志文件

touch /my_mysql/3306/mysql_3306_error.log
touch /my_mysql/3307/mysql_3307_error.log
# 以及对整个mysql目录再次授权
chown -R mysql.mysql /my_mysql/

确保当前没有其他mysql

netstat -tunlp |grep mysql

启动3306数据库

[root@mysql-01 ~]# /my_myChina编程sql/3306/mysql_3306 start
Starting MySQL...
[root@mysql-01 ~]#
# 用如下命令登录,使用sock套接字文件登录
mysql -S /my_mysql/3306/mysql.sock

同样,3307数据库也用以上相同方式创建,注意修改端口号即可;

至此,MySQL多实例分别启动完成。

另,可以自行在3306或3307其中一个里面通过create database xxx;创建一个数据库,然后根据show databases;查看来验证是否多实例启动成功。

再另,启动mysql的排错流程

准备配置文件是否有误

准备启停脚本 授权


chown -R mysql.mysql /my_mysql/

确保当前没有其他mysql
```bash
netstat -tunlp |grep mysql

启动3306数据库

[root@mysql-01 ~]# /my_mysql/3306/mysql_3306 start
Starting MySQL...
[root@mysql-01 ~]#
# 用如下命令登录,使用sock套接字文件登录
mysql -S /my_mysql/3306/mysql.sock

同样,3307数据库也用以上相同方式创建,注意修改端口号即可;

至此,MySQL多实例分别启动完成。

另,可以自行在3306或3307其中一个里面通过create database xxx;创建一个数据库,然后根据show databases;查看来验证是否多实例启动成功。

再另,启动mysql的排错流程

准备配置文件是否有误

准备启停脚本 授权

数据目录初始化

到此这篇关于MySQL多实例管理---在一台主机上运行多个mysql的文章就介绍到这了,更多相关mysql 运行多个mysql内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于MySQL多实例管理如何在一台主机上运行多个mysql的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155468

相关文章

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据