2. MySQL 多实例

重点:

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 mysqluseradd -r -g 306 -u 306 -d /data/mysql mysql

2.5.1.2)准备数据目录,建议使用逻辑卷

// 可选做, 后面的脚本 mysql_install_db 可自动生成此目录// 创建目录mkdir /data/mysql -pchown 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 mysqlchown -R root:root /usr/local/mysql/

2.5.1.4)准备配置文件

// 拷贝模板配置文件cd /usr/local/mysqlcp -b support-files/my-default.cnf /etc/my.cnfvim /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 -ycd /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_logfile1drwx------ 2 mysql mysql     4096 Jun  1 16:44 mysqldrwx------ 2 mysql mysql     4096 Jun  1 16:44 performance_schemadrwx------ 2 mysql mysql     4096 Jun  1 16:44 test

2.5.1.6)准备服务脚本,并启动服务

// 配置开机自启服务cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqldchkconfig --add mysqldservice mysqld start// 如果有对应的 service 文件可以执行下面cp /usr/local/mysql/support-files/systemd/mariadb.service/usr/lib/systemd/system/systemctl daemon-reloadsystemctl enable --now mariadb

2.5.1.7)定义 PATH 路径

echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.shbash /etc/profile.d/mysql.sh// "推荐"echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profilesource /etc/profile

2.5.1.8)安全初始化

mysql_secure_installation回车y输入密码重复密码yyyymysql -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/functionsDIR=`pwd`MYSQL_VERSION=5.6.51NAME="mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64.tar.gz"FULL_NAME=${DIR}/${NAME}# URL=http://mirrors.163.com/mysql/Downloads/MySQL-5.6URL=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 wgetwget $URL/$NAME || { action "下载失败,异常退出" false;exit 10; }yum install -y -q libaio perl-Data-Dumper autoconfif [ -f ${FULL_NAME} ];thenaction "安装文件存在"elseaction "安装文件不存在" falseexit 3fiif [ -e /usr/local/mysql ];thenaction "Mysql 已经安装" falseexit 3elsetar xf ${FULL_NAME} -C /usr/local/srcln -sv /usr/local/src/mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64 /usr/local/mysqlif id mysql;thenaction "mysql 用户已经存在,跳过创建用户过程"elseuseradd -r -s /sbin/nologin mysqlfiif id mysql;thenchown -R mysql.mysql /usr/local/mysql/*if [ ! -d /data/mysql ];thenmkdir -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/mysqldchmod a+x /etc/init.d/mysqldcat > /etc/my.cnf <<EOF[mysqld]socket=/data/mysql/mysql.sockuser=mysqlsymbolic-links=0datadir=/data/mysqlinnodb_file_per_table=1[client]port=3306socket=/data/mysql/mysql.sock[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/tmp/mysql.sockEOFln -sv /usr/local/mysql/bin/mysql /usr/bin/mysql/etc/init.d/mysqld startchkconfig --add mysqldelseaction "MySQL数据目录已经存在" falseexit 3fififi// 2. 运行脚本[root@centos7 ~] bash install_mysql5.6.sh// 3. 验证[root@centos7 ~] cat /etc/my.cnf[mysqld]socket=/data/mysql/mysql.sockuser=mysqlsymbolic-links=0datadir=/data/mysqlinnodb_file_per_table=1[client]port=3306socket=/data/mysql/mysql.sock[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/tmp/mysql.sock[root@centos7 ~] lsinstall_mysql5.6.sh my.cnf mysql-5.6.47-linux-glibc2.12-x86_64.tar.gz

// 验证服务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.gzDIR=`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} ];thenecho "install file is exist"elseecho "install file isn't exist"exit 3fiif [ -h /usr/local/mysql ];thenecho "MySQL already install"exit 3elsetar xvf ${FULL_NAME} -C /usr/local/src/ln -sv /usr/local/src/mysql-5.6.50-linux-glibc2.12-x86_64 /usr/local/mysqlif id mysql;thenecho "mysql user is exist,skip create user"elseuseradd -r -u 306 -d /data/mysql mysqlfiif id mysql;thenchown -R mysql.mysql /usr/local/mysql/if [ ! -d /data/mysql ];thenmkdir -pv /data/mysql && chown -R mysql.mysql /data/mysql//usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql -basedir=/usr/local/mysqlcp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqldchmod a+x /etc/init.d/mysqldcp ${DIR}/my.cnf /etc/my.cnfln -sv /usr/local/mysql/bin/mysql /usr/bin/mysql/etc/init.d/mysqld startchkconfig --add mysqldelseecho "MySQL data dir already exist"exit 3fififi[root@centos8 ~] vim my.cnf[mysqld]socket=/data/mysql/mysql.sockuser=mysqlsymbolic-links=0datadir=/data/mysqlinnodb_file_per_table=1[client]port=3306socket=/data/mysql/mysql.sock[mysqld_safe]log-error=/var/log/mysqld.logpid-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/ mysqlchown -R root.root /usr/local/mysql/

2.5.3.4)准备环境变量

echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.shbash /etc/profile.d/mysql.sh"推荐"echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profilesource /etc/profile

2.5.3.5)准备配置文件

cp /etc/my.cnf{,.bak}vim /etc/my.cnf[mysqld]datadir=/data/mysqlskip_name_resolve=1socket=/data/mysql/mysql.sock        log-error=/data/mysql/mysql.logpid-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 -pmysqld --initialize --user=mysql --datadir=/data/mysqlgrep password /data/mysql/mysql.log2023-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.logQ.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.logQ.xer?jWC8;Omysqladmin -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/functionsSRC_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=123456COLOR='echo -e \E[01;31m'END='\E[0m'check (){if [ $UID -ne 0 ]; thenaction "当前用户不是root,安装失败" falseexit 1ficd  $SRC_DIRif [ !  -e $MYSQL ];then$COLOR"缺少${MYSQL}文件"$END$COLOR"请将相关软件放在${SRC_DIR}目录下"$ENDexitelif [ -e /usr/local/mysql ];thenaction "数据库已存在,安装失败" falseexitelsereturnfi}install_mysql(){$COLOR"开始安装MySQL数据库..."$ENDyum  -y -q install libaio numactl-libstar xf $MYSQL -C /usr/local/MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'`ln -s  /usr/local/$MYSQL_DIR /usr/local/mysqlchown -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.shln -s /usr/local/mysql/bin/* /usr/bin/cat > /etc/my.cnf <<-EOF[mysqld]server-id=`hostname -I|cut -d. -f4`log-bindatadir=/data/mysqlsocket=/data/mysql/mysql.sock                                                                                                   log-error=/data/mysql/mysql.logpid-file=/data/mysql/mysql.pid[client]socket=/data/mysql/mysql.sockEOF[ -d /data ] || mkdir /datamysqld --initialize-insecure --user=mysql --datadir=/data/mysqlcp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqldchkconfig --add mysqldchkconfig mysqld onservice 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/nullsleep 3mysqladmin  -uroot  password $MYSQL_ROOT_PASSWORD &>/dev/nullaction "数据库安装完成"}checkinstall_mysql

2.5.4.2)在线 安装脚本( online )

史诗级最强 Shell 脚本

[root@centos7 ~] cat install_online_mysql5.7or8.0_for_centos.sh#!/bin/bash. /etc/init.d/functionsSRC_DIR=`pwd`MYSQL='mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz'# URL=http://mirrors.163.com/mysql/Downloads/MySQL-5.7URL=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.0COLOR='echo -e \E[01;31m'END='\E[0m'MYSQL_ROOT_PASSWORD=mageducheck (){if [ $UID -ne 0 ]; thenaction "当前用户不是root,安装失败" falseexit 1ficd $SRC_DIRrpm -q wget || yum -y -q install wgetwget $URL/$MYSQLif [ ! -e $MYSQL ];then$COLOR"缺少${MYSQL}文件"$END$COLOR"请将相关软件放在${SRC_DIR}目录下"$ENDexitelif [ -e /usr/local/mysql ];thenaction "数据库已存在,安装失败" falseexitelsereturnfi}mkdir /data/mysql -pinstall_mysql(){$COLOR"开始安装MySQL数据库..."$ENDyum  -y -q install libaio numactl-libs libaio &> /dev/nullcd $SRC_DIRtar xf $MYSQL -C /usr/local/MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'`ln -s /usr/local/$MYSQL_DIR /usr/local/mysqlchown -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.shln -s /usr/local/mysql/bin/* /usr/bin/cat > /etc/my.cnf <<-EOF[mysqld]server-id=`hostname -I|cut -d. -f4`log-bindatadir=/data/mysqlsocket=/data/mysql/mysql.sock                                               log-error=/data/mysql/mysql.logpid-file=/data/mysql/mysql.pid[client]socket=/data/mysql/mysql.sockEOFmysqld --initialize --user=mysql --datadir=/data/mysqlcp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqldchkconfig --add mysqldchkconfig mysqld onservice 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/nullaction "数据库安装完成"}checkinstall_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/srcdu -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 Socketmake -j 8 && make install// 验证编译安装目录    ( 注意: /usr/local/src 为源码存放目录 )ll /apps/mysql        ( 程序最终存放目录 )

2.6.5)准备 PATH 环境变量

echo 'PATH=/apps/mysql/bin:$PATH' > /etc/profile.d/mysql.shbash /etc/profile.d/mysql.sh'推荐'echo 'PATH=/apps/mysql/bin:$PATH' > /etc/profilesource /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.gzcp /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 mysqldservice 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 firewalldsetenforce 0// 启用 Dockersystemctl enable --now docker----// 3) 安装 Docker-Composecurl -L https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-composedocker-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 多实例 就是在一台服务器上同时开启多个不同的服务端口(如:33063307 等),同时运行多个 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=3306datadir=/mysql/3306/datasocket=/mysql/3306/socket/mysql.socklog-error=/mysql/3306/log/mysql.logpid-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/bashport=3306mysql_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" ];thenprintf "Starting MySQL...\n"${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null &elseprintf "MySQL is running...\n"exitfi}function_stop_mysql(){if [ ! -e "$mysql_sock" ];thenprintf "MySQL is stopped...\n"exitelseprintf "Stoping MySQL...\n"${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdownfi}function_restart_mysql(){printf "Restarting MySQL...\n"function_stop_mysqlsleep 2function_start_mysql}case $1 instart)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.sockMariaDB [(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 stopStoping MySQL...Enter password:// 当然, 我们也可以将密码写入到 mysqld 服务文件中    ( 不安全 )vim /mysql/3308/bin/mysqldmysql_pwd="P@ssw0rd"// 重复上述过程,  分别在 3306, 3307 的启动脚本中填写密码信息[root@centos8 ~] /mysql/3308/bin/mysqld startMySQL is running...// 再次关闭实例, '无需再手动输入密码啦'[root@centos8 ~] /mysql/3308/bin/mysqld stopStoping 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

大功告成~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux ---- Shell编程之函数与数组

目录 一、函数 1、函数的基本格式 2、查看函数列表 3、删除函数 4、函数的传参数 5、函数返回值 实验&#xff1a; 1.判断输入的ip地址正确与否 2. 判断是否为管理员用户登录 6、函数变量的作用范围 7、函数递归&#xff08;重要、难点&#xff09; 实验&#xff1…

《Q年文峰》GPT应用的交互式非线性体验

Phoncent博客创始人庄泽峰把自己的小说《Q年文峰》做成GPT应用&#xff0c;显然这是一件值得探索且具有创新意义的事情。 因为传统的阅读体验是线性的&#xff0c;读者只能按照固定的情节顺序进行阅读&#xff0c;而把小说制作成GPT应用后&#xff0c;读者阅读小说的方式是非线…

分布式id-雪花算法

一、雪花算法介绍 Snowflake&#xff0c;雪花算法是有Twitter开源的分布式ID生成算法&#xff0c;以划分命名空间的方式将64bit位分割成了多个部分&#xff0c;每个部分都有具体的不同含义&#xff0c;在Java中64Bit位的整数是Long类型&#xff0c;所以在Java中Snowflake算法生…

203.移除链表元素(力扣LeetCode)

文章目录 203.移除链表元素题目描述原链表删除元素虚拟头节点 203.移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head …

Ubuntu20.04添加桌面启动、侧边栏启动和终端启动

桌面启动 新建XX.desktop文件 在桌面新建一个XX.desktop文件&#xff0c;以QtCreator为例。 &#xff08;注意这里不能使用sudo&#xff0c;因为这样会把文件的权限归为root&#xff0c;导致后续设置可执行程序不方便&#xff09; gedit qtcreator.desktop在XX.desktop文件中…

【DeepLearning-9】YOLOv5模型网络结构中加入MobileViT模块

一、神经网络的前中后期 在神经网络中&#xff0c;特别是在深度卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;“网络早期&#xff08;低层&#xff09;”、“网络中期&#xff08;中层&#xff09;”和“网络后期&#xff08;高层&#xff09;”通常指的是网络结构中…

【云原生】初识Docker,安装以及了解操作命令

一、为什么要使用容器&#xff1f; 背景&#xff1a;以前开发、测试、生产为不同的环境&#xff0c;痛点是发现开发测试以后没问题&#xff0c;但是在生产环境无法运行。给测试、开发、运维人员造成了大量的工作。最终结果是发版更新速度也跟不上&#xff0c;效率低 我认为使…

翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一 GPT-4 Vision 的 7 个实际用例 Pre-requisites:先决条件&#xff1a; 订阅 ChatGPT Plus 以访问 GPT-4 Vision。如果您不熟悉 Streamlit&#xff0c;请按照安装步骤操作。 1. 绘制您的应…

尚无忧球馆助教系统源码,助教小程序源码,助教源码,陪练系统源码

特色功能&#xff1a; 不同助教服务类型选择 助教申请&#xff0c;接单&#xff0c;陪练师入住&#xff0c;赚取外快 线下场馆入住 设置自己服务 城市代理 分销商入住 优惠券 技术栈&#xff1a;前端uniapp后端thinkphp 独立全开源

.NET高级面试指南专题一【委托和事件】

在C#中&#xff0c;委托&#xff08;Delegate&#xff09;和事件&#xff08;Event&#xff09;是两个重要的概念&#xff0c;它们通常用于实现事件驱动编程和回调机制。 委托定义&#xff1a; 委托是一个类&#xff0c;它定义了方法的类型&#xff0c;使得可以将方法当作另一个…

HarmonyOS鸿蒙ArkTS,封装http网络请求

HarmonyOS鸿蒙ArkTS&#xff0c;封装http网络请求 前提&#xff1a; 要想使用http请求&#xff0c;系统必须要具备ohos.permission.INTERNET权限&#xff0c;在model.json5文件中的module模块下添加如下请求权限&#xff1a; 在module.json5文件中 配置 "requestPermi…

LeetCode 热题 100 | 矩阵

目录 1 73. 矩阵置零 2 54. 螺旋矩阵 3 48. 旋转图像 4 240. 搜索二维矩阵 II 菜鸟做题第二周&#xff0c;语言是 C 1 73. 矩阵置零 解题思路&#xff1a; 遍历矩阵&#xff0c;寻找等于 0 的元素&#xff0c;记录对应的行和列将被记录的行的元素全部置 0将被记录的…

k8s 进阶实战笔记 | Scheduler 调度策略总结

文章目录 Scheduler 调度策略总结调度原理和过程调度策略nodeSelect亲和性和反亲和性NodeAffinify亲和验证PodAffinity 亲和验证PodAntiAffinity 反亲和验证污点与容忍跳过 Scheduler 调度策略 调度策略场景总结 Scheduler 调度策略总结 调度原理和过程 Scheduler 一直监听着…

【心得】java JNDI配合RMI实现注入个人笔记

目录 JNDI RMI 基本概念 RMI 基本逻辑 恶意利用 JNDI注入RMI实现攻击 JNDI Java Naming and Directory Interface Java 命令和目录接口 让配置参数 和 代码 解耦的规范或者思想 低耦合 高内聚 Name 命名 java对象 通过 命名 绑定到 容器环境 java对象和一个特定的…

REVIT二次开发万能刷

将这两个参数赋予其他参数 步骤2 将来做个可以调控的版本 using System; using System.Collections.Generic; using System.Lin

华为机考入门python3--(4)牛客4-字符串分隔

分类&#xff1a;字符串 知识点&#xff1a; 复制符号* 复制3个0 0*3 000 字符串截取 截取第i位到j-1位 str[i:j] 题目来自【牛客】 input_str input().strip()# 先补齐 if len(input_str) % 8 ! 0: input_str 0 * (8 - len(input_str) % 8) # 每8个分 out…

uniapp微信小程序-请求二次封装(直接可用)

一、请求封装优点 代码重用性&#xff1a;通过封装请求&#xff0c;你可以在整个项目中重用相同的请求逻辑。这样一来&#xff0c;如果 API 发生变化或者需要进行优化&#xff0c;你只需在一个地方修改代码&#xff0c;而不是在每个使用这个请求的地方都进行修改。 可维护性&a…

JAVA学习笔记三

1.java执行流程分析 2.什么是编译 javac Hello.java 1.有了java源文件&#xff0c;通过编译器将其编译成JVM可以识别的字节码文件 2.在该源文件目录下&#xff0c;通过javac编译工具对Hello.java文件进行编译 3.如果程序没有错误&#xff0c;没有任何提示&#xff0c;但在…

Linux下的进程操作

进程概念 ps -elf&#xff1a;查看操作系统的所有进程&#xff08;Linux命令&#xff09; ctrl z&#xff1a;把进程切换到后台 crtl c&#xff1a;结束进程 fg&#xff1a;把进程切换到前台 获取进程进程号和父进程号 函数原型&#xff1a; pid_t getpid(void); //pid_t…

文件上传之大文件分块上传进度控制处理

在分块上传内容结束以后的事件监听&#xff0c;我们会实现 unlinkSync 删除临时文件操作&#xff0c;那么试想一下&#xff0c;在这个事件监听中&#xff0c;我们是否可以通过totalChunks以及currentChunk获取当前上传的进度情况呢&#xff1f; 后端 upload上传接口&#xff…