mysql主从复制实验(附编译安装mysql脚本)

mysql主从复制

  • 原理
  • 环境准备
  • 实验步骤

原理

  • mysql主从复制实验(附编译安装mysql脚本)_第1张图片

1、当我们的数据库主服务器发生了写操作数据发生了变化时,二进制日志就会记录,然后主服务器主动通知从服务器过来拿二进制日志,此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并且携带master.info的信息,以便让master知道该从哪个位置开始拿日志给Slave,此时master会起一个log dump的线程来接待;2、当Slave服务器的IO线程获取到Master服务器上dump线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容;3、Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点。

环境准备

  • 两台linux服务器(2核心、4G)、centos7、MySQL5.7.29(我们这里使用的是脚本一键编译安装mysql)

    #编译安装mysql 5.7.29
    #os: centos7.8.2003 
    ####################################
    
    #第1步
    #假定mysql的源码包已经上传到linux服务器里的当前目录下(可以去各大国内源或官方下载)
    #安装解决软件依赖关系的包
    yum  install cmake ncurses-devel gcc  gcc-c++  vim  lsof bzip2 openssl-devel -y
    #第2步:解压src的rpm包
    rpm  -ivh    mysql-community-5.7.29-1.el7.src.rpm
    
    #第3步:进入/root/rpmbuild目录
    cd  /root/rpmbuild/SOURCES
    
    #第4步:新建用户
    useradd -r  -s /sbin/nologin  mysql
    #第5步:新建数据目录
    mkdir -p  /data/mysql 
    #第6步:修改数据目录的拥有者为mysql
    chown  mysql:mysql /data/mysql  
    #第7步:解压真正的源码包
    tar xf mysql-5.7.29.tar.gz
    tar xf boost_1_59_0.tar.bz2
    #将boost包移动到mysql解压的包里
    mv boost_1_59_0  mysql-5.7.29
    
    #第8步:进入解压后的目录
    cd mysql-5.7.29
    
    #第9步:编译前的配置
    cmake  -DCMAKE_INSTALL_PREFIX=/usr/local/sc_mysql -DMYSQL_DATADIR=/data/mysql  -DSYSCONFDIR=/etc  -DMYSQL_USER=mysql  -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci  -DWITH_BOOST=boost_1_59_0
    
    #第10步:编译,启动2个进程去编译,加快速度
    make -j  2
    #第11步:安装编译好的二进制文件到指定的目录 --》复制当前目录下编译好的二进制文件到当时指定的目录
    make install 
    
    #第12步:备份原来的my.cnf配置文件,然后清空这个文件,这个文件是mariadb的配置文件,不是mysql的
    cp /etc/my.cnf /root/mysql.cnf.bak
    >/etc/my.cnf
    
    #第13步:进入编译安装好的mysql的目录--》安装目录
    cd  /usr/local/sc_mysql/bin
    #执行mysqld这个程序,初始化我们的mysql,并且将日志和临时密码重定向到/root/temp_password.txt文件里
    ./mysqld --initialize  --user=mysql --basedir=/usr/local/sc_mysql/  --datadir=/data/mysql  &>/root/temp_password.txt
    
    #第14步:修改PATH变量,在linux系统里可以找到我们编译安装的mysql相关的命令
    #/etc/profile /etc/bashrc /root/.bashrc /root/.bash_profile
    #修改PATH变量,让linux系统里有mysql相关的命令
    PATH=$PATH:/usr/local/sc_mysql/bin
    echo  'PATH=$PATH:/usr/local/sc_mysql/bin' >>/etc/bashrc
    
    #第15步:就是拷贝mysqld的程序文件到指定的目录,方便后面设置mysqld服务开机启动--》mysqld服务的启动、停止、重启的脚本
    cp  ../support-files/mysql.server  /etc/init.d/mysqld
    
    
    #第16步:关闭防火墙和selinux
    #关闭防火墙firewalld服务
    service firewalld stop   
    #设置firewalld服务开机不启动
    systemctl  disable firewalld
    #临时关闭selinux
    setenforce 0
    #永久修改selinux配置文件里的内容
    sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
    
    #第17步:设置MySQL开机启动
    chkconfig mysqld on
    
    #第18步:启动MySQL
    service  mysqld  start
    
    #第19步:登录进去MySQL并且重新设置密码Sanchuang123#
    #从保存的临时密码文件里,截取出临时密码,赋值给一个变量temp_pwd
    temp_pwd=$(cat /root/temp_password.txt |tail -1|awk '{print $11}')
    #给MySQL设置密码为Sanchuang123#
    mysql -uroot -p$temp_pwd  --connect-expired-password -e "set password='Sanchuang123#'"
    
    echo '###### congratulation! your mysql has be installed successfully ######'
    
    

实验步骤

  • 1.修改mysql的配置文件,启动二进制日志功能:
    在主服务器上开启二进制日志,server_id=1

      #binary log
      log_bin
      server_id = 1
    

    在从服务器上也可以开启二进制日志,server_id=2

      #binary log
      log_bin
      server_id = 2
    
  • 2.在主服务器上新建并且授权一个用户,用于复制二进制日志:

    grant replication slave on *.* to 'oudi'@'192.168.0.177' identified by 'Sanchuang123#';
    
  • 3.备份出主服务器上的数据,然后到导入到从服务器上:

      [root@sc-mysql-master ~]# mysqldump -uroot -p'Sanchuang123#'  --all-databases > /backup/all_db.sql
      [root@sc-mysql-master backup]# scp all_db.sql [email protected]:/root
      all_db.sql                                                                     100%   11MB  21.0MB/s   00:00    
      [root@sc-mysql-master backup]#
      在从服务器上导入数据
      [root@sc-mysql-slave ~]# mysql -uroot -p'Sanchuang1234#' 
      mysql: [Warning] Using a password on the command line interface can be insecure.
    
  • 4.在从服务器上配置master 的信息:

    	  #在主服务器上查看当前的二进制日志的文件和位置号
    	  root@(none) 15:12  mysql>show master status;
    	  root@(none) 15:19  mysql>flush logs;  刷新二进制日志
    	  root@(none) 15:20  mysql>show master status; 再次查看并记录位置号
    
    #在从服务器上配置master的信息
    
    [root@sc-mysql-slave ~]mysql -uroot -p'Sanchuang1234#'
    
    root@(none) 15:26  mysql>CHANGE MASTER TO MASTER_HOST='192.168.0.83' ,
        ->  MASTER_USER='oudi',
        ->  MASTER_PASSWORD='Sanchuang123#',
        ->  MASTER_PORT=3306,
        ->  MASTER_LOG_FILE='sc-mysql-master-bin.000002',
        ->  MASTER_LOG_POS=154;
    Query OK, 0 rows affected, 2 warnings (0.04 sec)
    
    root@(none) 15:27  mysql>
    root@(none) 15:27  mysql>show slave status \G;  查看slave的状态信息
    *************************** 1. row ***************************
                   Slave_IO_State: 
                      Master_Host: 192.168.0.83
                      Master_User: oudi
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: sc-mysql-master-bin.000002
              Read_Master_Log_Pos: 154
                   Relay_Log_File: sc-mysql-slave-relay-bin.000001
                    Relay_Log_Pos: 4
            Relay_Master_Log_File: sc-mysql-master-bin.000002
                 Slave_IO_Running: No
                Slave_SQL_Running: No
    
  • 5.在master和slave上关闭防火墙和selinux:

      主服务器
      [root@sc-mysql-master backup]service firewalld stop
      Redirecting to /bin/systemctl stop firewalld.service
      [root@sc-mysql-master backup]getenforce 
      Permissive
      从服务器
      [root@sc-mysql-slave ~]service firewalld stop
      Redirecting to /bin/systemctl stop firewalld.service
      [root@sc-mysql-slave ~]getenforce 
      Disabled
    
  • 6.在slave上启动复制功能:

    oot@(none) 15:33  mysql>start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    root@(none) 15:33  mysql>
    root@(none) 15:33  mysql>show slave status \G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.0.83
                      Master_User: oudi
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: sc-mysql-master-bin.000002
              Read_Master_Log_Pos: 154
                   Relay_Log_File: sc-mysql-slave-relay-bin.000002
                    Relay_Log_Pos: 330
            Relay_Master_Log_File: sc-mysql-master-bin.000002
                 Slave_IO_Running: Yes        --》是yes
                Slave_SQL_Running: Yes        --》是yes表示主从复制已经配置成功了
    
  • 7.验证主从复制的效果:

    在master上新建库
    root@(none) 15:36  mysql>create database zouweicheng;
    Query OK, 1 row affected (0.00 sec)
    
    root@(none) 15:36  mysql>use zouweicheng
    Database changed
    root@zouweicheng 15:37  mysql>show tables;
    Empty set (0.00 sec)
    
    root@zouweicheng 15:37  mysql>create table t1(id int);
    Query OK, 0 rows affected (0.06 sec)
    
    root@zouweicheng 15:38  mysql>insert into t1 values(1),(2);
    Query OK, 2 rows affected (0.01 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
  • 8.到slave上去看master.info 和relay-log.info:

    [root@sc-mysql-slave ~]cd /data/mysql/  到数据目录下查看
    [root@sc-mysql-slave mysql]cat master.info 
    25
    sc-mysql-master-bin.000002
    782
    192.168.0.83
    oudi
    Sanchuang123#
    3306
    60
    0
    
    [root@sc-mysql-slave mysql]cat relay-log.info 
    7
    ./sc-mysql-slave-relay-bin.000002
    958
    sc-mysql-master-bin.000002
    782
    0
    0
    1
    

你可能感兴趣的:(mysql)