mysql-主从复制

有些话、适合烂在心里 提交于 2019-12-01 07:13:17

 

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数据的唯一标示(不能重复)

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

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

binlog_format=mixed      //二进制文件

2) 重启MySQL服务

systemctl stop mysqld.service

ststemctl start mysqld.service

 

 

4、 配置从服务器

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

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

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

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

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

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

 

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

2) 重启mysql服务

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

master_file和master_log_pos参数)

4)启动同步

 

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

5、 验证主从复制效果

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

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

 

 

附一个一键安装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 "\033[1;32m正在解压~~~\033[0m"      else          wget ${U_mysqlUrl}          if [ $? -ne 0 ]              then              echo -e "\033[1;31m下载 MySQL 安装包失败,请检查您的网络!\033[0m"              exit          fi      fi        #解压rpm包 ##*/  表示删除最后一个/ 及其左边的字符      rpm -Uvh ${U_mysqlUrl##*/}        #安装MySQL8.0      yum install mysql-server -y        #启动MySQL      echo -e "                  ************  \033[1;33m正在启动 MySQL\033[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 "             **************  \033[1;32mMySQL 启动成功\033[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 "\033[1;33m请输入 y 或 n\033[0m"          fi          settime=$((++settime))                  done  }  #不修改密码提示函数  function notchk_pass() {      echo -e "\033[1;34;40mMySQL安装成功!!"      echo "###############  请在输入命令 mysql 后进入数据库  ######################"      echo "## 输入语句:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';     #"      echo "## 并在 ~/.my.cnf 文件中更新你的密码,以方便日后免密登录               #"      echo "########################################################################"      echo -e "\033[0m"  }    #修改密码操作函数  function modify_pass() {      #如果密码格式不符合3次则退出      declare -i chktime=0      while [ ${chktime} -lt 3 ]      do          echo -e "\033[1;32m请输入您的新密码"          read -p "至少一个大写字母、一个小写字符、数字和符号:" NEWPASS          echo -e "\033[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 "\033[1;34;40mMySQL安装成功!!"              echo "###############  请在输入命令 mysql 后进入数据库  ######################"              echo "## 自动登录脚本:~/.my.cnf                                             #"              echo "########################################################################"              echo -e "\033[0m"              rm -rf transfer.txt              #设置对了直接退出              ((chktime+=4))              exit          fi          chktime=$((++chktime))          #第三次的时候提示并退出          if [ ${chktime} -eq 3 ]          then              echo -e "\033[1;31m密码修改失败,请自行修改密码\033[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 "\033[1;36m############  欢迎使用一键安装 MySQL 8.0 脚本  ############\033[0m"  echo -e "\033[1;36m#                                                         #\033[0m"  echo -e "\033[1;36m#                    请保持网络畅通···                    #\033[0m"  echo -e "\033[1;36m#                                                         #\033[0m"  echo -e "\033[1;36m#                    1、安装 MySQL                        #\033[0m"  echo -e "\033[1;36m#                    2、卸载 MySQL                        #\033[0m"  echo -e "\033[1;36m#                    3、退出                              #\033[0m"  echo -e "\033[1;36m#                                                         #\033[0m"  echo -e "\033[1;36m###########################################################\033[0m"    declare -i style  read -p "请输入选项 [ 1 | 2 | 3 ]:" style    case "$style" in  1)      #检查目录是否存在      if [ -e "/var/lib/mysql80" ]      then          echo -e "\033[1;33m您的系统已安装 MySQL 数据库,请检查目录\033[0m"      else      install      fi      ;;  2)      unload      ;;  3)      exit      ;;  *)      echo -e "\033[5;32;40m参数错误!!!\033[0m"      ;;  esac

 

 

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!