Linux MySQL 多实例部署与配置实践

1 安装方式

1.1 软件源部署 - Rocky9 安装 mysql 8.0

查看mysql软件源

yum list mysql mysql-server

安装 mysql-server,会自动安装客户端包

yum install -y mysql-server

启动服务

systemctl enable --now mysqld.service

查看服务状态

systemctl status mysqld

查看端口

默认情况下,mysql可以使用root用户登录,密码为空

查看当前数据库的版本信息

sql 复制代码
select version();

修改 root 用户密码(为了方便实践密码设置为 root,生产上请使用强密码)

sql 复制代码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

使用密码登录验证

1.2 软件源部署 - Ubuntu24 安装 mysql8.0

查看mysql软件源

apt list mysql-server

安装mysql

apt install -y mysql-server

查看状态

systemctl status mysql.service

查看端口

默认情况下,mysql可以使用root用户登录,密码为空

修改 root 用户密码(为了方便实践密码设置为 root,生产上请使用强密码)

sql 复制代码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

退出后使用密码验证登录

1.3 二进制包部署-Ubuntu24 中安装 mysql 8.4

传统的二进制包安装需要进行三步:configure --- make --- make install。而mysql的二进制包是指己经编译完成(make已经做过了),以压缩包提供下载的文件,下载到本地之后释放到自定义目录,再进行配置即可。

1.3.1 环境准备

需提前配置软件源,安装相关依赖

apt install libaio-dev numactl libnuma-dev libncurses-dev

安装libaio1包,否则数据库初始化会报错

curl -O http://launchpadlibrarian.net/646633572/libaio1_0.3.113-4_amd64.deb

dpkg -i libaio1_0.3.113-4_amd64.deb

创建mysql组和用户

groupadd -r mysql

useradd -r -g mysql -s /sbin/nologin mysql

1.3.2 获取软件

二进制包下载地址:

https://downloads.mysql.com/archives/community/

下载链接:

https://downloads.mysql.com/archives/get/p/23/file/mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz

解压到指定目录,这个目录只能写 /usr/local/

1.3.3 设定环境变量

创建环境变量并加载

echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh

source /etc/profile.d/mysql.sh

查看效果

1.3.4 创建主配置文件

mkdir -p /usr/local/mysql/etc

创建 /usr/local/mysql/etc/my.cnf,并添加配置

bash 复制代码
[mysql]
port = 3306
socket = /usr/local/mysql/data/mysql.sock

[mysqld]
port = 3306
mysqlx_port = 33060
mysqlx_socket = /usr/local/mysql/data/mysqlx.sock
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /usr/local/mysql/data/mysql.sock
pid-file = /usr/local/mysql/data/mysqld.pid
log-error = /usr/local/mysql/log/error.log

1.3.5 创建数据目录

创建相关依赖目录并更改属主属组

mkdir /usr/local/mysql/data

mkdir /usr/local/mysql/log

chown -R mysql:mysql /usr/local/mysql/

chown -R mysql:mysql /usr/local/mysql*

1.3.6 密码初始化

如果使用 --initialize 选项会生成随机密码,要去 /data/mysql/mysql.log中查看

如果使用 --initialize-insecure -选项会生成空密码

本次采用使用密码初始化

cd /usr/local/mysql/

可以看到密码为:)LFg>Wc/L8iu

1.3.7 定制启动脚本

复制文件到系统目录下

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

重载配置文件

systemctl daemon-reload

启动mysqld服务

/etc/init.d/mysqld start

查看自动生成的服务管理文件

检测服务状态

查看端口连接

1.3.8 连接测试

使用之前初始化的密码登录mysql

执行sql报错,提示需要修改root密码

修改密码

alter user root@'localhost' identified by 'root';

使用新密码登录并验证

2 Mysql 多实例

2.1 基本概念

简介

多实例就是在一台服务器上运行多个 MySQL 服务端进程,每个进程监听一个端口(3306,3307,3308),维护一套属于其自己的配置和数据,客户端使用不同的端口来连接具体服端进程,从而实现对不同的实例的操作。可以用不同的 MySQL 版本实现多实例,也可以用相同的 MySQL 版本实现多实例。

优点

  • 节约硬件资源:在某些场景下(比如说测试,调研,新旧业务并存等),需要配置不同的 MySQL 数据库版本,而又没有足够多的服务器资源,则可以选择在一台服务器上用不同的版本实现多开来满足需求。

  • 便于对比:在一个完全相同的硬件环境中,运行不同的 MySQL 版本,使用相同的参数进行测试,调研时,可以最大程度的减少外部环境因素的影响,便于得出更准确的结论。

  • 便于管理:在一台服务器上运行多个实例,同理,只需要在这一台服务器上配置安全规则,就可以完成对多个实例的访问授权,而且对于数据库的备份,停启等工作,也只需要在这一台服务器上完成。

缺点

  • 资源抢占:一台服务器上运行多个服务实例,资源总量恒定,一个实例占用的资源无法被另一个实例所使用,在这种情况下,服务性能会受到影响,无法体现 MySQL 服务的实际性能。

  • 存在单点风险:一台服务器上部署多个服务实例,如果该服务器当机,则这多个服务实例都会受影响。

2.2 操作步骤

2.2.1 初始化多实例数据库

安装mariadb-server包,提供mysql相关命令

apt install -y mariadb-server

创建相关目录

mkdir -pv /mysql/{3306,3307}/{data,etc,socket,log,bin,pid}

为目录赋予用户权限

chown -R mysql:mysql /mysql/

生成两个实例的初始数据

mysql_install_db --user=mysql --datadir=/mysql/3306/data

mysql_install_db --user=mysql --datadir=/mysql/3307/data

2.2.2 3306实例数据库配置

创建配置文件 /mysql/3306/etc/my.cnf

bash 复制代码
[mysqld]
port=3306
datadir=/mysql/3306/data
socket=/mysql/3306/socket/mysql.sock
log-error=/mysql/3306/log/mysql.log
pid-file=/mysql/3306/pid/mysql.pid

创建mysql的启动脚本 /mysql/3306/bin/mysqld

bash 复制代码
PORT=3306
USER="root"
PWD="root"
CMD_PATH="/usr/bin"
BASE_DIR="/mysql"
SOCKET="${BASE_DIR}/${PORT}/socket/mysql.sock"
LOG_FILE="${BASE_DIR}/${PORT}/log/service.log"

# 日志记录函数
log() {
    local message="$1"
    local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    echo "$timestamp - $message" >> "$LOG_FILE"
}

mysql_start() {
    if [ ! -e "$SOCKET" ]; then
        log "Starting MySQL..."
        echo "Starting MySQL..."
        ${CMD_PATH}/mysqld_safe --defaults-file=${BASE_DIR}/${PORT}/etc/my.cnf &>/dev/null &
        local pid=$!
        sleep 2
        if ps -p $pid > /dev/null; then
            log "MySQL started successfully."
        else
            log "Failed to start MySQL."
            echo "Failed to start MySQL."
        fi
    else
        log "MySQL is running..."
        echo "MySQL is running..."
        exit
    fi
}

mysql_stop() {
    if [ ! -e "$SOCKET" ]; then
        log "MySQL is stopped..."
        echo "MySQL is stopped..."
        exit
    else
        log "Stopping MySQL..."
        echo "Stopping MySQL..."
        ${CMD_PATH}/mysqladmin -u ${USER} -p${PWD} -S ${SOCKET} shutdown
        local result=$?
        if [ $result -eq 0 ]; then
            log "MySQL stopped successfully."
        else
            log "Failed to stop MySQL."
            echo "Failed to stop MySQL."
        fi
    fi
}

mysql_restart() {
    log "Restarting MySQL..."
    echo "Restarting MySQL..."
    mysql_stop
    sleep 2
    mysql_start
}

usage_msg() {
    echo "Usage: ${BASE_DIR}/${PORT}/bin/mysqld {start|stop|restart}"
}

# 信号处理函数
trap 'mysql_stop; exit 1' SIGTERM SIGINT

case $1 in
    start)
        mysql_start;;
    stop)
        mysql_stop;;
    restart)
        mysql_restart;;
    *)
        usage_msg;;
esac

2.2.3 启动3306实例

加可执行权限

chmod +x /mysql/3306/bin/mysqld

启动mysql服务

/mysql/3306/bin/mysqld start

检测效果

2.2.4 3306实例服务启动脚本创建

关闭服务,并创建服务启动脚本

/mysql/3306/bin/mysqld stop

vim /etc/systemd/system/mysql3306.service

bash 复制代码
[Unit]
Description=MySQL 3306 Server
After=network.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/bin/mysqld_safe --defaults-file=/mysql/3306/etc/my.cnf
ExecStop=/usr/bin/mysqladmin -u root -pMagedu -S /mysql/3306/socket/mysql.sock shutdown
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

重载配置并启动服务

systemctl daemon-reload

systemctl start mysql3306

确认效果

2.2.5 3307实例部署

参考上述3306实例步骤

复制配置文件并修改

cp -a /mysql/3306/etc/my.cnf /mysql/3307/etc/my.cnf

sed -i "s#3306#3307#g" /mysql/3307/etc/my.cnf

复制数据库启动文件

cp -a /mysql/3306/bin/mysqld /mysql/3307/bin/mysqld

sed -i "s#3306#3307#g" /mysql/3307/bin/mysqld

复制服务文件并修改

cp -a /etc/systemd/system/mysql3306.service /etc/systemd/system/mysql3307.service

sed -i "s#3306#3307#g" /etc/systemd/system/mysql3307.service

重载配置并启动服务

systemctl daemon-reload

设置开机自启

systemctl enable --now mysql3306

systemctl enable --now mysql3307

2.2.6 数据库登录

因为本地主机存在多个mysql实例,没有办法直接通过mysql命令直接连接,需要通过sock 文件来连接到数据库

mysql -S /mysql/3306/socket/mysql.sock

2.2.7 设置登录密码

密码与脚本中定制的信息相匹配

mysqladmin -S /mysql/3306/socket/mysql.sock -uroot password 'root'

或登录执行sql

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('root');

2.2.8 创建数据库

登录3306实例,创建数据库db3306

查看数据库文件

登录3307实例,创建数据库db3307

可以看到数据库与3306实例相互独立

查看数据库文件

文件存储位置也是相互独立

相关推荐
郝学胜-神的一滴5 小时前
深入解析Linux下的`lseek`函数:文件定位与操作的艺术
linux·运维·服务器·开发语言·c++·软件工程
冲上云霄的Jayden5 小时前
ubuntu 22一步步 安装docker和配置使用国内源
linux·ubuntu·docker·国内源
王木风5 小时前
1分钟理解什么是MySQL的Buffer Pool和LRU 算法?
前端·mysql
迎風吹頭髮5 小时前
Linux服务器编程实践20-TCP服务 vs UDP服务:核心差异对比
linux·服务器·tcp/ip
ajassi20005 小时前
开源 Linux 服务器与中间件(二)嵌入式Linux服务器和中间件
linux·服务器·开源
ajassi20005 小时前
开源 Linux 服务器与中间件(一)基本介绍
linux·服务器·开源
赖small强6 小时前
深入理解 Linux NUMA:拓扑、分配策略与调优实践
linux·numa·pre-cpu·zone
javpy6 小时前
docker部署nacos报错 ‘env NACOS_AUTH_TOKEN must be set with Base64 String.‘
linux·docker·centos
Net_Walke6 小时前
【Linux系统】文件IO
linux·物联网·iot