2. MySQL 多实例

news2024/11/18 13:45:48

重点:

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 <<EOF

[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

EOF

            ln -sv /usr/local/mysql/bin/mysql /usr/bin/mysql

            /etc/init.d/mysqld start

            chkconfig --add mysqld

        else

            action "MySQL数据目录已经存在" false

            exit 3

        fi

    fi

fi


// 2. 运行脚本

[root@centos7 ~] bash install_mysql5.6.sh


// 3. 验证

[root@centos7 ~] cat /etc/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@centos7 ~] ls

install_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.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 多实例 就是在一台服务器上同时开启多个不同的服务端口(如: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=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

大功告成~

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

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

相关文章

深入理解ZooKeeper分布式锁

第1章&#xff1a;引言 分布式系统&#xff0c;简单来说&#xff0c;就是由多台计算机通过网络相连&#xff0c;共同完成任务的系统。想象一下&#xff0c;咱们平时上网浏览网页、看视频&#xff0c;背后其实都是一大堆服务器在协同工作。这些服务器之间需要协调一致&#xff…

拥有大规模犯罪联盟链的网络攻击中心

VexTrio 是一个网络犯罪集团&#xff0c;其历史至少可以追溯到 2017 年&#xff0c;该集团涉嫌利用复杂的字典域生成算法 (DDGA) 进行邪恶活动。 他们的恶意活动包括诈骗、风险软件、间谍软件、广告软件、隐匿垃圾程序 (PUP) 和露骨内容&#xff0c;其中 2022 年发生的一次引…

【广度优先搜索】【拓扑排序】【C++算法】913. 猫和老鼠

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 广度优先搜索 拓扑排序 逆推 LeetCode913. 猫和老鼠 两位玩家分别扮演猫和老鼠&#xff0c;在一张 无向 图上进行游戏&#xff0c;两人轮流行动。 图的形式是&#xff1a;graph[a] 是一个列…

067:Vue2 + vite 开发环境的搭建(含源文件包,运行即可)

第067个 查看专栏目录: VUE 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&#xff0c;watch&am…

【机组】单元模块实验的综合调试与驻机键盘和液晶显示器的使用方式

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 1. 综合实验的调试 1.1 实验…

YOLOv8改进 | Conv篇 | 结合Dual思想利用HetConv创新一种全新轻量化结构CSPHet(参数量下降70W)

一、本文介绍 本文给大家带来的改进机制是我结合Dual的思想利用HetConv提出一种全新的结构CSPHet,我们将其用于替换我们的C2f结构,可以将参数降低越75W,GFLOPs降低至6.6GFLOPs,同时本文结构为我独家创新,全网无第二份,非常适合用于发表论文,该结构非常灵活,利用Dual卷…

调用阿里通义千问大语言模型API-小白新手教程-python

阿里大语言模型通义千问API使用新手教程 最近需要用到大模型&#xff0c;了解到目前国产大模型中&#xff0c;阿里的通义千问有比较详细的SDK文档可进行二次开发,目前通义千问的API文档其实是可以进行精简然后学习的,也就是说&#xff0c;是可以通过简单的API调用在自己网页或…

【GitHub项目推荐--推荐一个开源的任务管理工具(仿X书/X钉)】【转载】

推荐一个开源的任务管理工具&#xff0c;该工具会提供各类文档协作功能、在线思维导图、在线流程图、项目管理、任务分发、即时 IM&#xff0c;文件管理等等。该开源项目使用到 Vue、Element-UI、ECharts 等技术栈。 开源地址&#xff1a;www.github.com/kuaifan/dootask 预览地…

ES的一些名称和概念总结

概念 先看看ElasticSearch的整体架构&#xff1a; 一个 ES Index 在集群模式下&#xff0c;有多个 Node &#xff08;节点&#xff09;组成。每个节点就是 ES 的Instance (实例)。每个节点上会有多个 shard &#xff08;分片&#xff09;&#xff0c; P1 P2 是主分片, R1 R2…

Flink实现数据写入MySQL

先准备一个文件里面数据有&#xff1a; a, 1547718199, 1000000 b, 1547718200, 1000000 c, 1547718201, 1000000 d, 1547718202, 1000000 e, 1547718203, 1000000 f, 1547718204, 1000000 g, 1547718205, 1000000 h, 1547718210, 1000000 i, 1547718210, 1000000 j, 154771821…

数学建模-------误差来源以及误差分析

绝对误差&#xff1a;精确值-近似值&#xff1b; 举个例子&#xff1a;从A到B&#xff0c;应该有73千米&#xff0c;但是我们近似成了70千米&#xff1b;从C到D&#xff0c;应该是1373千米&#xff0c;我们近似成了1370千米&#xff0c;如果使用绝对误差&#xff0c;结果都是3…

Docker容器部署OpenCV,打造高效可移植的计算机视觉开发环境

推荐 海鲸AI-ChatGPT4.0国内站点&#xff1a;https://www.atalk-ai.com 前言 在计算机视觉领域&#xff0c;快速部署和测试算法是研究和开发的关键。OpenCV作为一个强大的开源计算机视觉库&#xff0c;广泛应用于各种图像处理和视频分析任务。然而&#xff0c;配置OpenCV环境可…

compose部署tomcat

1.部署tomcat 1.1.下载相关镜像tomcat8.5.20 $ docker pull tomcat:8.5.20 1.2 在/data目录下创建tomcat/webapps目录 mkdir -p /data/tomcat/webapps 注意&#xff1a;这里是准备将宿主机的/data/tomcat/webapps映射到容器的 /usr/…

HDFS的standby节点启动过慢原因分析以及应对策略

HDFS的standby节点启动过慢原因分析以及应对策略 1. NN启动大致流程2. Editlog日志清理策略2.1 为什么需要合并editlog&#xff1f;2.2 什么时候删除editlog&#xff1f; 3. NN启动的日志加载策略4. Standby启动慢应对策略5. 疑问和思考5.1 如何人工阅读editlog文件的内容&…

IDEA jdk版本切换问题

打开 IntelliJ IDEA 的 Project Structure&#xff08;快捷键通常是 Ctrl Alt Shift S&#xff09;。 转到 Project Settings > Modules。 选择相应的模块&#xff0c;然后在 Sources 标签页下&#xff0c;查看 Language level 是否设置为 自己需要的jdk版本语言。 接…

YOLOv8训练自己的数据集,通过LabelImg

记录下labelImg标注数据到YOLOv8训练的过程,其中容易遇到labelImg的坑 数据集处理 首先在mydata下创建4个文件夹 images文件夹下存放着所有的图片&#xff0c;包括训练集和测试集等。后续会根据代码进行划分。 json文件夹里存放的是labelImg标注的所有数据。需要注意的是&…

qtcreator使用qwt库

先配置好.pro文件&#xff0c;再去ui界面拖拽控件 ui界面会更改配置&#xff0c;故顺序错一个&#xff0c;就凉了&#xff0c;重来吧 准备&#xff1a;库&#xff0c;库头文件 库文件&#xff1a;路径如下 头文件&#xff1a;路径如下 鼠标->右键 &#xff08;有些不用勾…

读元宇宙改变一切笔记13_治理与管理

1. 元宇宙的经济价值 1.1. 元宇宙的价值最终将“超过”物理世界 1.2. 人们之所以对低延迟网络进行投资&#xff0c;是因为有一些体验需要元宇宙&#xff1a;同步实时渲染的虚拟世界、AR和云游戏流 1.3. 在大多数情况下&#xff0c;数字经济并不是什么新鲜事 1.3.1. 数字经济…

【算法】北极通讯网络(Kruskal)

题目 北极的某区域共有 n 座村庄&#xff0c;每座村庄的坐标用一对整数 (x,y) 表示。 为了加强联系&#xff0c;决定在村庄之间建立通讯网络&#xff0c;使每两座村庄之间都可以直接或间接通讯。 通讯工具可以是无线电收发机&#xff0c;也可以是卫星设备。 无线电收发机有…

【shell-10】shell实现的各种kafka脚本

kafka-shell工具 背景日志 log一.启动kafka->(start-kafka)二.停止kafka->(stop-kafka)三.创建topic->(create-topic)四.删除topic->(delete-topic)五.获取topic列表->(list-topic)六. 将文件数据 录入到kafka->(file-to-kafka)七.将kafka数据 下载到文件-&g…