zoukankan      html  css  js  c++  java
  • 01-MySQL主从复制的搭建

    一、环境的准备

    1、准备2台机器,安装好MySQL

    机器名 IP 系统版本 数据库版本
    jfdb 192.168.232.35 RedHat 6.7 5.7.22
    jfdb2 192.168.232.36 RedHat 6.7 5.7.22

      2、工作原理

        依赖二进制日志(BinaryLog)和中继日志(RelayLog)来实现,主节点Master会把自己每次的改动都记录到BinaryLog中,从节点slave通过读取Master上的BinaryLog,把记录写到自己的RelayLog日志中,然后从服务器上的SQL线程会负责读取这个RelayLog日志,并执行一遍,来保持自己和主节点上的数据同步。

        简单来说就是从节点通过读取主节点上的日志,把主节点上执行的SQL在自己这边也执行一遍,只要保持数据库的初始状态是一致的,就能保证数据一直同步下去。

        3、该种同步方式不仅可以同步数据,也可以同步存储过程、视图、函数等系统资源。

    二、搭建的步骤

    1、开启主节点上的BinaryLog

     打开/etc/my.cnf文件,添加如下内容

    log-bin = mysql-bin
    binlog_format = mixed
    server-id = 1

    read-only=0
    binlog-do-db=test
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=sys
    auto-increment-increment=10
    auto-increment-offset=1

     

     参数含义: 

      binlog-do-db:用来表示把哪些数据库的改动记录到binary日志中,可以写多行,表示同步多个数据库,注释掉,表示除去忽略的数据库,都同步。

      binlog-ignore-db:表示要忽略的数据库,我这里把4个系统数据库忽略了。

      auto-increment-increment:是用于双主同步时,解决自增主键冲突的问题的,每次增加10。

      auto-increment-offset:表示这台服务器的序号,从1开始。这样做的话,在这台服务器上插入的第一条数据的id就是1,第二条就是11了。

    2、在主节点上创建用于同步数据的用户

      命令:grant replication slave on *.* to 'repl_user1'@'192.168.232.36' identified by '123456';

         

      注:上面的IP写的是从节点的IP,意思是只用从节点用,只用于同步数据。

     3、创建test库和测试的表

      命令:create database test default character set utf8;

        

     4、导出test数据库中的数据

     (1)先锁定test数据库

      命令: FLUSH TABLES WITH READ LOCK;

         

     (2)导出test库的数据

        命令:./mysqldump --master-data -uroot -p test >/mysql/test.sql

       

      5、查看主节点的binary日志位置

      命令:show master statusG

       

    含义:  

       File: mysql-bin.000001  -------  表示当前正在记录的binarylog文件名。

        Position: 154    -----表示当前文件的偏移量,就是写在该mysql-bin.000001文件的位置, 配置从节点的时候,需要用到上面的2个值,并且从节点就是从这个文件的这个位置开始同步的。

       Binlog_Do_DB: test  ----------表示需要同步的数据库时test。

       Binlog_Ignore_DB: mysql,information_schema,performance_schema,sys   ---------表示需要忽略的数据库。

       注:如果显示是空的(如下图),则需要重启服务器

      

     6、解除表的锁定

       命令: UNLOCK TABLES;

       

     7、始设置从节点的数据库

     (1) 打开/etc/my.cnf文件,添加如下内容,重启mysql服务

    log-bin = mysql-bin
    binlog_format = mixed
    server-id = 2


    replicate-do-db=test
    replicate-ignore-db=mysql
    replicate-ignore-db=information_schema
    replicate-ignore-db=performance_schema
    replicate-ignore-db=sys
    relay_log=mysql-relay-bin
    log-slave-updates = ON

       

     含义:

      server_id:必须保证每台服务器不一样。

      replicate-do-db:指定需要同步的数据库。

           replicate-ignore-db:指定需要忽略的数据库。

           relay_log:中继日志的名称。

           log-slave-updates:意思是,中继日志执行之后,这些变化是否需要计入自己的binarylog。当从节点需要作为另一个服务器的主节点时,这个需要打开。后面搭建的主-主互备,就需要打开。

     (2)保存后重启mysql

      命令:service mysql restart

        

     8、导入主节点上导出的数据到从节点

    (1)从主节点传到从节点

      命令:scp test.sql root@192.168.232.36:/mysql 

      

    (2)在从节点上修改文件的权限

      命令:chown -R mysql:mysql test.sql 

      

      (3)导入数据

      命令:mysql -uroot -p test  < test.sql 

       

     9、从节点上开启同步

    命令:

    mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.232.35',
    -> MASTER_USER='repl_user1',
    -> MASTER_PASSWORD='123456',
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=154;

     含义:

      MASTER_HOST:主节点的IP。

           MASTER_USER:主节点上创建的用户同步的用户。

           MASTER_PASSWORD:用户的密码。

      MASTER_LOG_FILE:主节点正在写入binarylog日志的文件。

          MASTER_LOG_POS:文件的偏移量。

     10、重启MySQL服务,查看slave的状态

       命令:show slave statusG

       

      注意:如果遇到这2个线程有为NO的情况,要去查错误日志排查,如发现我的Slave_IO_Running线程为NO,查看错误日志,具体解决方法见下面第三部分。

       

      含义:

      Slave_IO_Running:从服务器上读取主服务器BinaryLog日志的线程,并把日志拷贝回来。

      Slave_SQL_Running:专门执行SQL的线程。负责把复制回来的的RelayLog执行到自己的数据库中。

      在从节点上这2个参数必须都为Yes,才能表明数据能正常同步。

    11、测试数据是否同步

    (1)主节点新增数据

        

    注意:我们可以看到第二条的数据的id是11,这也就是我们主节点的my.cnf文件的auto-increment-increment参数,起到了作用,下一条数据的id就会是21、31、41.。。。。。

    (2)从节点查看数据已经同步过来了

     

     12、测试存储过程是否可以同步

    (1)主节点创建一个存储过程

       

    (2)从节点查看是否有该存储过程

        

    三、遇到的错误

    1、导出数据库数据时报Binloging on server not active的错误

    (1)错误截图如下:

       

     (2)问题描述

      因为我的MySQL的my.cnf文件里是没有log-bin = mysql-bin(或者是注释掉的),修改完这个文件后没有重启服务,重启一下就好了。

     (3)解决办法

       

     2、查看从节点slave的状态Slave_IO_Running线程为NO的错误

    (1)错误截图如下:

      

      (2)查看错误日志的详细描述

       

       

     发现主节点和从节点有相同的UUID,这是因为我的从节点是通过主节点的虚拟机快照生成的,所以UUID相同

    (3)解决办法

    删除该UUID的文件,重启mysql即可

     

    参考网址:

    https://blog.csdn.net/cws1214/article/details/47424171

    ***************************************************

    如下是个人开发系统,欢迎大家体验,纯属个人爱好,想一块玩的,私信。

    易本浪账:www.jialany.com  

    ***************************************************

  • 相关阅读:
    【Docker】-NO.131.Docker.1 -【Docker】
    【HBase】-NO.140.HBase.1 -【HBase】
    【Vagrant】-NO.130.Vagrant.1 -【Vagrant】
    【技巧】-NO.123.数据处理技巧
    【Common】-NO.122.common.1
    【心得】-NO.114.面试.1 -【To HR And Interviewer】
    【JVM】-NO.113.JVM.1 -【JDK11 HashMap详解-4-resize()】
    【JVM】-NO.114.JVM.1 -【JDK11 HashMap详解-3-put-treeifyBin()-AVL】
    【JVM】-NO.115.JVM.1 -【JDK11 HashMap详解-4-伸展树、B树】
    【JVM】-NO.116.JVM.1 -【JDK11 HashMap详解-5-红黑树】
  • 原文地址:https://www.cnblogs.com/jialanyu/p/12882866.html
Copyright © 2011-2022 走看看