mysql-主从复制

 

MySQL主从同步

1. 主从同步的定义

  主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。

  因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。

2.mysql 主从同步作用:

  1.读写分离

  2.分流,减轻服务器压力

  3. 数据备份

    80% 查询,20% 写入,

3.使用主从同步的好处:

(1) 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。

(2)提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据

(3) 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能

4. 主从同步的机制

  Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。

在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。

每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。

主服务器和每一个从服务器都必须配置一个唯一的ID号(在my.cnf文件的[mysqld]模块下有一个server-id配置项),另外,每一个从服务器还需要通过CHANGE MASTER TO语句来配置它要连接的主服务器的ip地址,

日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里)

3.主从同步流程:

  1.主和从库的数据保持一致

    做法:备份主库,然后在从库恢复

  2. mysql 任何操作都可以写到日志文件中(默认关闭,需要开启);从库可以实时读取主库的日志文件,然后将主库的操作也执行一遍,从而达到同步

  3.从库访问主库日志,需要登录主库,从而需要让主库为从库分配账号密码(专用于主从同步),slave

配置mysql主服务器(MASTER)

0)查看mysql的启动状态

systemctl status mysqld.service

1)修改/etc/my.cnf配置文件

server-id       = 11                        //mysql数据的唯一标示(不能重复)

binlog-format=ROW      //选择row模式 

log-slave-updates=true                 //允许连级复制  (增加)

log-bin=master-bin                         //二进制文件名(修改)

binlog_format=mixed      //二进制文件

2) 重启MySQL服务

systemctl stop mysqld.service

ststemctl start mysqld.service

 3)创建主从复制的用户(mysql8.0)

 create user 'nxznxz'@'%' identified WITH mysql_native_password by 'Pass1234!';

 grant replication slave on *.* to 'nxznxz'@'%';

4)注意需要开放端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent

firewall-cmd --reload

firewall-cmd --list-ports

4、 配置从服务器

1) 在/etc/my.cnf中修改以下内容

[root@centos3 ~]# vim /etc/my.cnf

server-id       = 22                                                //不能与其他实例重复

log-bin=master-bin                                                        //二进制日志文件名 修改

relay-log=relay-log-bin                                        //复制过来的二进制文件名,增加

relay-log-index=slave-relay-bin.index                //中继日志存放的文件名称,增加

注意server-id不能与主服务器相同,但是从服务器要相同。

2) 重启mysql服务

3) 登录mysql,配置同步(按照主服务器结果更改下面命令中

master_file和master_log_pos参数)

change master to master_host='192.168.1.131',master_user='root', master_password='Pass1234!',master_log_file='master-bin.000001',master_log_pos=467;

4)启动同步

5) 查看slave状态,确保以下两个值为YES

5、 验证主从复制效果

1) 在主服务器上新建数据库“IT”

2) 在从服务器上查看数据库,如果和主服务器相同,说明主从复制成功。

从库多线程复制:

  https://blog.csdn.net/punk_lover/article/details/78424896

  https://blog.csdn.net/demonson/article/details/80774899

附一个一键安装mysql8.0的脚本:

#!/bin/bash
############   一键安装 MySQL 8.0 脚本  ############
# Updates:可以在安装的时候更改root初始密码        #
#######################  END  ######################

function install(){
    #先把多余的卸载了
    unload
    cd ~
    U_mysqlUrl=https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
    #下载MySQL8.0的rpm包
    if [ -e "./mysql80-community-release-el7-1.noarch.rpm" ]
    then
        echo -e "33[1;32m正在解压~~~33[0m"
    else
        wget ${U_mysqlUrl}
        if [ $? -ne 0 ]
            then
            echo -e "33[1;31m下载 MySQL 安装包失败,请检查您的网络!33[0m"
            exit
        fi
    fi

    #解压rpm包 ##*/  表示删除最后一个/ 及其左边的字符
    rpm -Uvh ${U_mysqlUrl##*/}

    #安装MySQL8.0
    yum install mysql-server -y

    #启动MySQL
    echo -e "                  ************  33[1;33m正在启动 MySQL33[0m  *****************"
    systemctl start mysqld.service

    #查看状态
    a=$(systemctl status mysqld.service | grep Active)
    b=${a##*active}
    c=${b%% since*}
    d="(running)"
    if [ "$c" = "$d" ]
    then
        echo -e "             **************  33[1;32mMySQL 启动成功33[0m ******************"
    fi

    #找出初始密码,建立登录脚本
    findpass=$(grep 'temporary password' /var/log/mysqld.log)
    initpass=${findpass##* }
    rm -rf ~/.my.cnf
    touch ~/.my.cnf
    echo "[client]" > ~/.my.cnf
    echo "user=root" >> ~/.my.cnf
    echo "password="${initpass}"" >> ~/.my.cnf
    #设置此登录文件只有所有者可以读写
    chmod 770 ~/.my.cnf

    #修改密码
    chose_pass
}

#修改密码
function chose_pass() {
    declare -i settime=0
    while [ ${settime} -lt 3 ]
    do
        read -p "是否现在修改 MySQL 的 root 密码?[y/n] " chose
        if [[ "$chose" = "n" || "$chose" = "N" ]]
        then
            notchk_pass
            exit
        elif [[ "$chose" = "y" || "$chose" = "Y" ]]
        then
            modify_pass
            ((settime+=3))
            exit
        else
            echo -e "33[1;33m请输入 y 或 n33[0m"
        fi
        settime=$((++settime))            
    done
}
#不修改密码提示函数
function notchk_pass() {
    echo -e "33[1;34;40mMySQL安装成功!!"
    echo "###############  请在输入命令 mysql 后进入数据库  ######################"
    echo "## 输入语句:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';     #"
    echo "## 并在 ~/.my.cnf 文件中更新你的密码,以方便日后免密登录               #"
    echo "########################################################################"
    echo -e "33[0m"
}

#修改密码操作函数
function modify_pass() {
    #如果密码格式不符合3次则退出
    declare -i chktime=0
    while [ ${chktime} -lt 3 ]
    do
        echo -e "33[1;32m请输入您的新密码"
        read -p "至少一个大写字母、一个小写字符、数字和符号:" NEWPASS
        echo -e "33[0m"    
                
        SQL="ALTER USER 'root'@'localhost' IDENTIFIED BY "${NEWPASS}";flush privileges;"
        mysql --connect-expired-password -e "${SQL}"
        if [ $? -eq 0 ]
        then
            #修改登录脚本
            rm -rf ~/.my.cnf
            touch ~/.my.cnf
            echo "[client]" > ~/.my.cnf
            echo "user=root" >> ~/.my.cnf
            echo "password="${NEWPASS}"" >> ~/.my.cnf
            chmod 0600 ~/.my.cnf
            
            echo -e "33[1;34;40mMySQL安装成功!!"
            echo "###############  请在输入命令 mysql 后进入数据库  ######################"
            echo "## 自动登录脚本:~/.my.cnf                                             #"
            echo "########################################################################"
            echo -e "33[0m"
            rm -rf transfer.txt
            #设置对了直接退出
            ((chktime+=4))
            exit
        fi
        chktime=$((++chktime))
        #第三次的时候提示并退出
        if [ ${chktime} -eq 3 ]
        then
            echo -e "33[1;31m密码修改失败,请自行修改密码33[0m"
            exit
        fi
    done
}

#卸载
function unload() {
    #停掉 MySQL 数据库
    systemctl stop mysqld.service
    #卸载各项服务
    yum remove mysql mysql-server mysql-libs compat-mysql51 -y
    #删除各个目录
    rm -rf /var/lib/mysql
    rm -rf /etc/my.cnf
    rm -rf /usr/share/mysql-8.0/
    touch list.txt
    #查一下继续卸载
    rpm -qa | grep mysql > list.txt
    for a in `cat list.txt`
    do
        yum remove $a -y
    done
    rm -rf list.txt
    #删除自动登录配置文件
    rm -rf ~/.my.cnf
    #删除日志文件
    rm -rf /var/log/mysqld.log
    #删除安装包
    #rm -rf ~/mysql80-community-release-el7-1.noarch.rpm
}

clear

echo -e "33[1;36m############  欢迎使用一键安装 MySQL 8.0 脚本  ############33[0m"
echo -e "33[1;36m#                                                         #33[0m"
echo -e "33[1;36m#                    请保持网络畅通···                    #33[0m"
echo -e "33[1;36m#                                                         #33[0m"
echo -e "33[1;36m#                    1、安装 MySQL                        #33[0m"
echo -e "33[1;36m#                    2、卸载 MySQL                        #33[0m"
echo -e "33[1;36m#                    3、退出                              #33[0m"
echo -e "33[1;36m#                                                         #33[0m"
echo -e "33[1;36m###########################################################33[0m"

declare -i style
read -p "请输入选项 [ 1 | 2 | 3 ]:" style

case "$style" in
1)
    #检查目录是否存在
    if [ -e "/var/lib/mysql80" ]
    then
        echo -e "33[1;33m您的系统已安装 MySQL 数据库,请检查目录33[0m"
    else
    install
    fi
    ;;
2)
    unload
    ;;
3)
    exit
    ;;
*)
    echo -e "33[5;32;40m参数错误!!!33[0m"
    ;;
esac

原博客:https://www.w3cschool.cn/timlc/timlc-u3xg24y8.html

相关博客:https://blog.csdn.net/shengqianfeng/article/details/102721156

原文地址:https://www.cnblogs.com/nxzblogs/p/11664570.html