重点:
MySQL 的 三种安装方式:包安装,二进制安装,源码编译安装。
MySQL 的 基本使用
MySQL 多实例
DDLcreate alter drop
DML insert update delete
DQL select
2.5)通用 二进制格式安装 MySQL
2.5.1)实战案例:通用 二进制格式安装 MySQL 5.6( 手动安装 )
官网下载二进制格式安装包
下载链接:MySQL :: Download MySQL Community Server (Archived Versions)
2.5.1.1)准备用户
// 创建用户组与用户
groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 -d /data/mysql mysql
2.5.1.2)准备数据目录,建议使用逻辑卷
// 可选做, 后面的脚本 mysql_install_db 可自动生成此目录
// 创建目录
mkdir /data/mysql -p
chown mysql:mysql /data/mysql
2.5.1.3)准备二进制程序
官方:MySQL :: Download MySQL Community Server (Archived Versions)
国内:Index of /MySQL/Downloads/MySQL-5.6/
国内:Index of mysql-local/Downloads/MySQL-5.6
// 例如: mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz
// 解压压缩包
tar xf mysql-VERSION-linux-glibc2.12-x86_64.tar.gz -C /usr/local
// 创建软链接
cd /usr/local && ln -sv mysql-VERSION mysql
chown -R root:root /usr/local/mysql/
2.5.1.4)准备配置文件
// 拷贝模板配置文件
cd /usr/local/mysql
cp -b support-files/my-default.cnf /etc/my.cnf
vim /etc/my.cnf
// mysql 语句块中添加以下三个选项
[mysqld]
datadir = /data/mysql # 数据存放目录
innodb_file_per_table = on # 在 mariadb5.5 以上版的是默认值, 可不加
skip_name_resolve = on # 禁止主机名解析, 建议使用
2.5.1.5)创建数据库文件
// "报错解决"
yum install perl-Data-Dumper.x86_64 -y
cd /usr/local/mysql/
// 执行脚本 ( "可能会出现报错情况" )
./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
// 验证
[root@centos7 mysql] ls /data/mysql/ -l ( 默认存放在 /var/lib/mysql 目录 )
total 110604
-rw-rw---- 1 mysql mysql 12582912 Jun 1 16:44 ibdata1
-rw-rw---- 1 mysql mysql 50331648 Jun 1 16:44 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Jun 1 16:44 ib_logfile1
drwx------ 2 mysql mysql 4096 Jun 1 16:44 mysql
drwx------ 2 mysql mysql 4096 Jun 1 16:44 performance_schema
drwx------ 2 mysql mysql 4096 Jun 1 16:44 test
2.5.1.6)准备服务脚本,并启动服务
// 配置开机自启服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start
// 如果有对应的 service 文件可以执行下面
cp /usr/local/mysql/support-files/systemd/mariadb.service
/usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable --now mariadb
2.5.1.7)定义 PATH 路径
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
bash /etc/profile.d/mysql.sh
// "推荐"
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile
source /etc/profile
2.5.1.8)安全初始化
mysql_secure_installation
回车
y
输入密码
重复密码
y
y
y
y
mysql -uroot -pP@ssw0rd123456
2.5.2)实战案例:一键安装 mysql-5.6 二进制包 脚本
2.5.2.1)( 在线安装 ) mysql-5.6 二进制包 脚本
// 1. 编写脚本
[root@centos7 ~] vim install_mysql5.6.sh
#!/bin/bash
. /etc/init.d/functions
DIR=`pwd`
MYSQL_VERSION=5.6.51
NAME="mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64.tar.gz"
FULL_NAME=${DIR}/${NAME}
# URL=http://mirrors.163.com/mysql/Downloads/MySQL-5.6
URL=https://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.6/
# URL=https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-5.6/
DATA_DIR="/data/mysql"
rpm -q wget || yum -y -q install wget
wget $URL/$NAME || { action "下载失败,异常退出" false;exit 10; }
yum install -y -q libaio perl-Data-Dumper autoconf
if [ -f ${FULL_NAME} ];then
action "安装文件存在"
else
action "安装文件不存在" false
exit 3
fi
if [ -e /usr/local/mysql ];then
action "Mysql 已经安装" false
exit 3
else
tar xf ${FULL_NAME} -C /usr/local/src
ln -sv /usr/local/src/mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64 /usr/local/mysql
if id mysql;then
action "mysql 用户已经存在,跳过创建用户过程"
else
useradd -r -s /sbin/nologin mysql
fi
if id mysql;then
chown -R mysql.mysql /usr/local/mysql/*
if [ ! -d /data/mysql ];then
mkdir -pv /data/mysql && chown -R mysql.mysql /data
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr/local/mysql/
cp /usr/local/src/mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64/support-files/mysql.server /etc/init.d/mysqld
chmod a+x /etc/init.d/mysqld
cat > /etc/my.cnf <
// 验证服务
netstat -nltp
// 登录
mysql
2.5.2.2)离线安装 mysql-5.6 二进制包的脚本
( 离线安装 ) mysql-5.6 二进制包的脚本
// 准备安装包, 脚本和 my.cnf 配置文件, "放在同一目录下"
[root@centos8 ~] vim install_mysql-5.6.sh
#!/bin/bash
# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz
DIR=`pwd`
NAME="/mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz"
FULL_NAME=${DIR}/${NAME}
DATA_DIR="/data/mysql"
yum install libaio perl-devel ncurses-compat-libs -y
# CentOS8 需要安装 ncurses-compat-libs 包提供 libncurses.so.5 库
if [ -f ${FULL_NAME} ];then
echo "install file is exist"
else
echo "install file isn't exist"
exit 3
fi
if [ -h /usr/local/mysql ];then
echo "MySQL already install"
exit 3
else
tar xvf ${FULL_NAME} -C /usr/local/src/
ln -sv /usr/local/src/mysql-5.6.50-linux-glibc2.12-x86_64 /usr/local/mysql
if id mysql;then
echo "mysql user is exist,skip create user"
else
useradd -r -u 306 -d /data/mysql mysql
fi
if id mysql;then
chown -R mysql.mysql /usr/local/mysql/
if [ ! -d /data/mysql ];then
mkdir -pv /data/mysql && chown -R mysql.mysql /data/mysql/
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql -basedir=/usr/local/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod a+x /etc/init.d/mysqld
cp ${DIR}/my.cnf /etc/my.cnf
ln -sv /usr/local/mysql/bin/mysql /usr/bin/mysql
/etc/init.d/mysqld start
chkconfig --add mysqld
else
echo "MySQL data dir already exist"
exit 3
fi
fi
fi
[root@centos8 ~] vim my.cnf
[mysqld]
socket=/data/mysql/mysql.sock
user=mysql
symbolic-links=0
datadir=/data/mysql
innodb_file_per_table=1
[client]
port=3306
socket=/data/mysql/mysql.sock
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/tmp/mysql.sock
[root@centos8 ~] ls
[root@centos8 ~] bash install_mysql-5.6.sh
2.5.3)实战案例:通用 二进制安装 MySQL 5.7 和 MySQL8.0
2.5.3.1)安装相关包( 手动安装 )
报错解决:mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file-CSDN博客
yum install libncurses* -
yum install libaio numactl-libs -y
2.5.3.2)用户和组
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
2.5.3.3)准备程序文件
国内:mysql-MySQL-5.7安装包下载_开源镜像站-阿里云
// 下载 MySQL 二进制包
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
// 解压
tar xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local
// 软链接
cd /usr/local/ && ln -s mysql-5.7.36-linux-glibc2.12-x86_64/ mysql
chown -R root.root /usr/local/mysql/
2.5.3.4)准备环境变量
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
bash /etc/profile.d/mysql.sh
"推荐"
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile
source /etc/profile
2.5.3.5)准备配置文件
cp /etc/my.cnf{,.bak}
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
skip_name_resolve=1
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
2.5.3.6)初始化数据库文件并提取 root 密码
2.5.3.6.1)方式 1:生成随机密码
mkdir /data/mysql -p
mysqld --initialize --user=mysql --datadir=/data/mysql
grep password /data/mysql/mysql.log
2023-12-30T09:40:49.213204Z 1 [Note] A temporary password is generated for root@localhost: Q.xer?jWC8;O // 注意生成 root 的初始密码
awk '/temporary password/{print $NF}' /data/mysql/mysql.log
Q.xer?jWC8;O
2.5.3.6.2)方式 2:生成 root 空密码( 省略 )
mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
2.5.3.7)准备服务脚本和启动
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start
2.5.3.8)修改口令
// 修改前面生成的随机密码为指定密码
awk '/temporary password/{print $NF}' /data/mysql/mysql.log
Q.xer?jWC8;O
mysqladmin -uroot -p'Q.xer?jWC8;O' password P@ssw0rd123456
# 修改前面生成的空密码为指定密码
mysqladmin -uroot password P@ssw0rd123456
2.5.3.9)测试登录
报错解决:mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file-CSDN博客
mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
mysql -uroot -pP@ssw0rd123456
完成
yum install libncurses* -y
// mysql -uroot -pP@ssw0rd123456
2.5.4)实战案例:一键安装 MySQL5.7 和 MySQL8.0 二进制包的脚本
2.5.4.1)离线 安装脚本( offline )
( 离线安装 ) MySQL5.7 和 MySQL8.0 二进制包的脚本
#!/bin/bash
# MySQL Download URL:
# https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz
#h ttp://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
# http://mirrors.163.com/mysql/Downloads/MySQL-8.0/mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz
. /etc/init.d/functions
SRC_DIR=`pwd`
MYSQL='mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz'
#MYSQL='mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz'
MYSQL_ROOT_PASSWORD=123456
COLOR='echo -e \E[01;31m'
END='\E[0m'
check (){
if [ $UID -ne 0 ]; then
action "当前用户不是root,安装失败" false
exit 1
fi
cd $SRC_DIR
if [ ! -e $MYSQL ];then
$COLOR"缺少${MYSQL}文件"$END
$COLOR"请将相关软件放在${SRC_DIR}目录下"$END
exit
elif [ -e /usr/local/mysql ];then
action "数据库已存在,安装失败" false
exit
else
return
fi
}
install_mysql(){
$COLOR"开始安装MySQL数据库..."$END
yum -y -q install libaio numactl-libs
tar xf $MYSQL -C /usr/local/
MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'`
ln -s /usr/local/$MYSQL_DIR /usr/local/mysql
chown -R root.root /usr/local/mysql/
id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; action "创建mysql用户"; }
echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
ln -s /usr/local/mysql/bin/* /usr/bin/
cat > /etc/my.cnf <<-EOF
[mysqld]
server-id=`hostname -I|cut -d. -f4`
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
[ -d /data ] || mkdir /data
mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
[ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; }
# MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
# mysqladmin -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null
sleep 3
mysqladmin -uroot password $MYSQL_ROOT_PASSWORD &>/dev/null
action "数据库安装完成"
}
check
install_mysql
2.5.4.2)在线 安装脚本( online )
史诗级最强 Shell 脚本
[root@centos7 ~] cat install_online_mysql5.7or8.0_for_centos.sh
#!/bin/bash
. /etc/init.d/functions
SRC_DIR=`pwd`
MYSQL='mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz'
# URL=http://mirrors.163.com/mysql/Downloads/MySQL-5.7
URL=https://repo.huaweicloud.com/mysql/Downloads/MySQL-5.7/
# MYSQL='mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz'
# URL=http://mirrors.163.com/mysql/Downloads/MySQL-8.0
COLOR='echo -e \E[01;31m'
END='\E[0m'
MYSQL_ROOT_PASSWORD=magedu
check (){
if [ $UID -ne 0 ]; then
action "当前用户不是root,安装失败" false
exit 1
fi
cd $SRC_DIR
rpm -q wget || yum -y -q install wget
wget $URL/$MYSQL
if [ ! -e $MYSQL ];then
$COLOR"缺少${MYSQL}文件"$END
$COLOR"请将相关软件放在${SRC_DIR}目录下"$END
exit
elif [ -e /usr/local/mysql ];then
action "数据库已存在,安装失败" false
exit
else
return
fi
}
mkdir /data/mysql -p
install_mysql(){
$COLOR"开始安装MySQL数据库..."$END
yum -y -q install libaio numactl-libs libaio &> /dev/null
cd $SRC_DIR
tar xf $MYSQL -C /usr/local/
MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'`
ln -s /usr/local/$MYSQL_DIR /usr/local/mysql
chown -R root.root /usr/local/mysql/
id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; action "创建 mysql 用户"; }
echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
ln -s /usr/local/mysql/bin/* /usr/bin/
cat > /etc/my.cnf <<-EOF
[mysqld]
server-id=`hostname -I|cut -d. -f4`
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
mysqld --initialize --user=mysql --datadir=/data/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
[ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; }
MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
mysqladmin -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null
action "数据库安装完成"
}
check
install_mysql
2.6)源码编译 安装 MySQL( 源码编译安装 )
建议:内存 4G 以上,CPU 核数越多越好
说明:本操作过程适用于以下版本
mysql-5.6.51.tar.gz
mariadb-10.2.18.tar.gz
2.6.1)安装相关依赖包
yum install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel perl-Data-Dumper -y
2.6.2)准备好用户和数据目录
useradd -r -s /sbin/nologin -d /data/mysql mysql
2.6.3)准备好数据库目录
mkdir /data/mysql -p
chown mysql.mysql /data/mysql
2.6.4)源码编译安装
编译安装说明
利用 cmake 编译,而利用传统方法。
cmake 的 重要特性 之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译。
编译选项:
https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html
2.6.4.1)下载并解压缩源码包
在官网 MySQL :: Download MySQL Community Server (Archived Versions) 下载源码包
上面我们下载的是编译后的二进制包。( 二进制安装使用的更为广泛一些 )
源码包很小才 30M 作用。
tar xvf mysql-5.6.51.tar.gz -C /usr/local/src
# mariadb-10.2.18.tar.gz
2.6.4.2)源码编译安装 MySQL
提示:如果出错,执行 rm -rf CMakeCache.txt
// 切换目录
cd /usr/local/src
du -sh mysql-5.6.51
// 使用 cmake 命令进行编译
cd mysql-5.6.51/
cmake . \
-DCMAKE_INSTALL_PREFIX=/apps/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc/ \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
// 编译安装 ( 注意: 主机 CPU 核数 )
lscpu | grep Socket
make -j 8 && make install
// 验证编译安装目录 ( 注意: /usr/local/src 为源码存放目录 )
ll /apps/mysql ( 程序最终存放目录 )
2.6.5)准备 PATH 环境变量
echo 'PATH=/apps/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
bash /etc/profile.d/mysql.sh
'推荐'
echo 'PATH=/apps/mysql/bin:$PATH' > /etc/profile
source /etc/profile
2.6.6)生成数据库文件
// 切换目录
cd /apps/mysql/
// 必须在 /apps/mysql 目录下执行 mysql_install_db 脚本 ( 否则会报错 )
scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
'验证'
ll /data/mysql/
2.6.7)准备配置文件
// 复制模板配置文件 ( -b 参数会备份被覆盖的文件 )
cp -b /apps/mysql/support-files/my-default.cnf /etc/my.cnf
// 针对旧版本或 mariadb-10.2.18.tar.gz
cp /apps/mysql/support-files/my-huge.cnf /etc/my.cnf
2.6.8)准备启动脚本,并启动服务
// 复制模板文件
cp /apps/mysql/support-files/mysql.server /etc/init.d/mysqld
// 设置开机自启
chkconfig --add mysqld
service mysqld start
// 验证
netstat -nltp
2.6.9)安全初始化
mysql_secure_installation
回车
y
输入密码
重复密码
y
y
y
y
mysql -uroot -pP@ssw0rd
2.7)基于 Dockcer 容器创建 MySQL
// 1) 低版本 Docker 安装
yum install docker -y
----
// < '推荐' >
// 2) 高版本 Docker 安装
curl -fsSL https://get.docker.com/ | sh
----
// 关闭防火墙
systemctl disable --now firewalld
setenforce 0
// 启用 Docker
systemctl enable --now docker
----
// 3) 安装 Docker-Compose
curl -L https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v
[root@centos8 ~] docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.30
[root@centos8 ~] docker images
[root@centos8 ~] docker ps -a
[root@centos8 ~] yum install mysql -y
[root@centos8 ~] mysql -uroot -p123456 -h127.0.0.1
2.8)MySQL 多实例
2.8.1)多实例 介绍和方案
2.8.1.1)多实例介绍
参考:https://www.cnblogs.com/yangliheng/p/5871215.html
简单地说,Mysql 多实例就是 在一台服务器上同时开启多个不同的服务端口(3306、3307),同时运行多个 Mysql 服务进程,这些服务进程通过不同的 Socket 监听不同的服务端口来提供服务。
这些 Mysql 多实例公用一套 Mysql 安装程序,一般使用不同的 my.cnf(也可以相同)配置文件,启动程序和数据文件。在提供服务时,多实例 Mysql 在逻辑上看来是 各自独立 的,它们根据配置文件的对应设定值,获得服务器相应数量的硬件资源。
打个比方,Mysql 多实例就相当于房子的多个卧室,每个实例可以看作一间卧室,整个服务器就是一套房子,服务器的硬件资源(cpu、mem、disk)、软件资源(centos操作系统)可以看作房子的卫生间、客厅,是房子的公用资源。
什么是数据库多实例
多实例 类似微信多开,多实例的不同端口号 类比微信多开的不同微信账号,数据库类比聊天窗口,表类比聊天记录。
MySQL 多实例 就是在一台服务器上同时开启多个不同的服务端口(如:3306、3307 等),同时运行多个 MySQL 服务进程,这些服务进程通过不同的 Socket 监听不同的服务端口来提供服务。
多实例可能是 MySQL 的不同版本,也可能是 MySQL 的同一版本实现。
多实例的好处
可有效利用服务器资源。当单个服务器资源有剩余时,可以充分利用剩余资源提供更多的服务,且可以实现资源的逻辑隔离节约服务器资源。例如公司服务器资源紧张,但是数据库又需要各自尽量独立的提供服务,并且还需要到主从复制等技术,多实例就是最佳选择。
多实例弊端
存在资源互相抢占的问题。比如:当某个数据库实例并发很高或者 SQL 查询慢时,整个实例会消耗大量的 CPU、磁盘I/O 等资源,导致服务器上面其他的数据库实例在提供服务的质量也会下降,所以具体的需求要根据自己的实际情况而定。
2.8.1.2)MySQL 多实例常见的 配置方案
单一的配置文件、单一启动程序多实例部署方式
MySQL 官方文档提到的单一配置文件、单一启动程序多实例部署方式
耦合度太高,一个配置文件不好管理。不是很推荐。
多配置文件、多启动程序部署方式
多配置文件、多启动程序部署方式是针对每个实例都有独立的配置文件和目录,管理灵活,此方案耦合度较低
工作开发和运维的统一原则:降低耦合度。所以建议的此方式。
2.8.2)实战案例 :CentOS 8 实现 MariaDB Yum 安装 多实例实现
Linux 小技巧:实现 MySQL 多实例
实战目的
CentOS 8 Yum 安装 MariaDB-10.3.17 并实现三个实例
环境要求
一台系统 CentOS 8.X 主机
前提准备
关闭 SELinux
关闭防火墙
时间同步
yum install ntpdate -y && ntpdate ntp.aliyun.com
systemctl disable --now firewalld
sed -ri.bak 's/^(SELINUX=).*/\1disabled/' /etc/selinux/config
setenforce 0
实现步骤
1. 安装 MariaDB
[root@centos8 ~] yum install mariadb-server -y
2. 准备三个实例的目录( 创建各个实例 独自的目录 )
// 创建各个实例独自的目录
[root@centos8 ~] mkdir -pv /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid}
// 授权目录 ( 都基于 mysql 用户运行 )
[root@centos8 ~] chown -R mysql.mysql /mysql
[root@centos8 ~] tree -d /mysql/
3. 生成数据库初始文件
[root@centos8 ~] mysql_install_db --user=mysql --datadir=/mysql/3306/data
[root@centos8 ~] mysql_install_db --user=mysql --datadir=/mysql/3307/data
[root@centos8 ~] mysql_install_db --user=mysql --datadir=/mysql/3308/data
4. 准备配置文件( 编写各个实例 独自的配置文件 )
[root@centos8 ~] vim /mysql/3306/etc/my.cnf
[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
// 重复上面步骤配置 3307, 3308 的配置文件
[root@centos8 ~] sed 's/3306/3307/' /mysql/3306/etc/my.cnf > /mysql/3307/etc/my.cnf
[root@centos8 ~] sed 's/3306/3308/' /mysql/3306/etc/my.cnf > /mysql/3308/etc/my.cnf
'验证'
[root@centos8 ~] cat /mysql/3307/etc/my.cnf
[root@centos8 ~] cat /mysql/3308/etc/my.cnf
5. 准备启动脚本
[root@centos8 ~] vim /mysql/3306/bin/mysqld
#!/bin/bash
port=3306
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/bin"
mysql_basedir="/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null &
else
printf "MySQL is running...\n"
exit
fi
}
function_stop_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit
else
printf "Stoping MySQL...\n"
${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
fi
}
function_restart_mysql()
{
printf "Restarting MySQL...\n"
function_stop_mysql
sleep 2
function_start_mysql
}
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac
// 重复上述过程, 分别建立 3307, 3308 的启动脚本
[root@centos8 ~] sed 's/3306/3307/' /mysql/3306/bin/mysqld > /mysql/3307/bin/mysqld
[root@centos8 ~] sed 's/3306/3308/' /mysql/3306/bin/mysqld > /mysql/3308/bin/mysqld
'授权'
[root@centos8 ~] chmod +x /mysql/3306/bin/mysqld
[root@centos8 ~] chmod +x /mysql/3307/bin/mysqld
[root@centos8 ~] chmod +x /mysql/3308/bin/mysqld
6. 启动服务
[root@centos8 ~] /mysql/3306/bin/mysqld start
[root@centos8 ~] /mysql/3307/bin/mysqld start
[root@centos8 ~] /mysql/3308/bin/mysqld start
[root@centos8 ~] netstat -nltp
7. 登录实例
[root@centos8 ~] /mysql/3308/bin/mysqld start
'两种连接方法'
[root@centos8 ~] mysql -h127.0.0.1 -P3308
[root@centos8 ~] mysql -uroot -S /mysql/3308/socket/mysql.sock
// 确认连接的端口
MariaDB [(none)]> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 3308 |
+---------------+-------+
1 row in set (0.001 sec)
MariaDB [(none)]>
// '测试多实例效果'
MariaDB [(none)]> create database test3308;
Query OK, 1 row affected (0.001 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| test3308 |
+--------------------+
5 rows in set (0.001 sec)
// 我们在 3308 实例创建的数据库
// 其他实例是看不到的, '数据库实例间相互独立.'
[root@centos8 ~] mysql -uroot -S /mysql/3307/socket/mysql.sock
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.001 sec)
8. 修改 root 密码
// 加上 root 的口令
[root@centos8 ~] mysqladmin -uroot -S /mysql/3306/socket/mysql.sock password 'P@ssw0rd'
[root@centos8 ~] mysqladmin -uroot -S /mysql/3307/socket/mysql.sock password 'P@ssw0rd'
[root@centos8 ~] mysqladmin -uroot -S /mysql/3308/socket/mysql.sock password 'P@ssw0rd'
// '或者' 登录 mysql, 执行如下 SQL 语句也可以
Mariadb> update mysql.user set password=password("P@ssw0rd") where user='root';
Mariadb> flush privileges;
// 重复步骤, 分别修改别外两个实例 3307, 3308 对应 root 口令
---
// '关闭实例', 需要手动输入 root 的密码
[root@centos8 ~] /mysql/3308/bin/mysqld stop
Stoping MySQL...
Enter password:
// 当然, 我们也可以将密码写入到 mysqld 服务文件中 ( 不安全 )
vim /mysql/3308/bin/mysqld
mysql_pwd="P@ssw0rd"
// 重复上述过程, 分别在 3306, 3307 的启动脚本中填写密码信息
[root@centos8 ~] /mysql/3308/bin/mysqld start
MySQL is running...
// 再次关闭实例, '无需再手动输入密码啦'
[root@centos8 ~] /mysql/3308/bin/mysqld stop
Stoping MySQL...
9. 测试连接
// 提示输入口令才能登录
[root@centos8 ~] mysql -uroot -p -S /mysql/3306/socket/mysql.sock
Enter password:
10. 开机启动
[root@centos8 ~] vim /etc/rc.d/rc.local
// 在最后一行加下面内容
for i in {3306..3308};do /mysql/$i/bin/mysqld start;done
'授权'
[root@centos8 ~] chmod +x /etc/rc.d/rc.local
'验证'
[root@centos8 ~] bash /etc/rc.d/rc.local
[root@centos8 ~] netstat -nltp
'重启验证'
[root@centos8 ~] reboot
[root@centos8 ~] netstat -nltp
大功告成~