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实例相互独立

查看数据库文件

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

相关推荐
用户9718356334665 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪6 小时前
linux 拷贝文件或目录到指定的位置
linux
云技纵横6 小时前
Gap Lock 死锁实战:5 秒在本地复现 MySQL 间隙锁死锁
后端·mysql
无响应de神6 小时前
三、用户与权限管理
数据库·mysql
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux