zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    通过jQuery修改ui的顺序
    iOS用模型取代字典的好处
    iOS开发NSBundle、UIImageView和UIButton总结
    php数组中关于某个元素进行排序
    VMware 11安装Mac OS X 10.10
    js中的in_array
    localStorage中js数组的存储和读取
    google地图通过js计算当前位置与其余多个点之间的最近距离
    通过js修改图片的css样式,实现简单的图片旋转
    Javac不是内部或外部指令
  • 原文地址:https://www.cnblogs.com/nxzblogs/p/11664570.html
Copyright © 2011-2022 走看看