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实例相互独立
查看数据库文件

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