zoukankan      html  css  js  c++  java
  • mysql5.7主从同步 ubuntu

    实现环境:

    | System   | mysql      |  ip        |

    |主ubuntu  | mysql-5.7.24   | 10.192.209.122 |

    |从ubuntu    | mysql-5.7.39   | 10.192.209.43   |

    注:从服务器的mysql版本最好和主服务器相同,或者大于主服务器版本

    MySQL主从同步的实现部分:

    首先是Master(主节点)的配置:

    #主Master服务器配置----------------------------------------------------------------------------------------------------------------------- 

    1.停掉slave端数据库服务

    /etc/init.d/mysql stop
    或者service mysqld stop

    2.修改配置文件:

    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

    1.主数据库(Master)配置:
    #***********************************master my.cnf配置开始******************************
    #主库日志记录文件位置或名称前缀
    log_bin = /var/lib/mysql/mylog-bin.log
    #同步日志记录的频率,1为每条都记录,安全但效率低
    sync_binlog = 1
    #server的id,不能与相同id的mysql主从连接
    server-id=1
    #同步数据库,如果多库,就以此格式另写几行即可
    binlog-do-db=test
    #无需同步的数据库,以下几行基本一样,无需改动
    binlog-ignore-db = cluster
    binlog-ignore-db = mysql
    binlog-ignore-db = performance_schema
    binlog-ignore-db = information_schema

    #mysql复制模式,三种:SBR(基于sql语句复制),RBR(基于行的复制),MBR(混合模式复制)
    #混合模式复制
    binlog_format=MIXED
    #binlog过期清理时间
    expire_logs_days=7
    #binlog每个日志文件大小
    max_binlog_size=20M
    #*********************master my.conf配置文件结束*****************************************

      binlog_do_db            = your databasename(需要主从同步的数据库)
      log-slave-updates=1    #事件自动更新到日志中  
      sync_binlog=1          #日志文件同步到磁盘上   

    2.登陆mysql执行

    mysql -u root -p
    mysql> show master status;
    +------------------+----------+--------------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB       | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------------+------------------+-------------------+
    | mysql-bin.000006 |     787 | weblinux_scheduler |                  |                   |
    +------------------+----------+--------------------+------------------+-------------------+
    1 row in set (0.01 sec)
    

    这个File:mysql-bin.000006 和Position787一会儿要在从库用到

    注意:每次修改数据时这两个值都会改变,所以在查看了这两个值之后,不要操作主服务器、直接到从服务器配置完成之后,否则这个值对应不上会同步失败

    3.重启mysql服务,mysql命令行执行:

    show master status;#记录文件名以及紧跟的当前行数数字

    4.创建并授权用户,后两个slave分别是用户名和密码

      注意:此处ip是slave端的ip,非本机ip,本人因为这个错误浪费好多时间。

    grant replication slave ,replication client on *.* to slave@'10.192.209.43' identified by "slave";
    flush privileges; #权限修改立即生效
    flush tables with read lock; #锁定数据库为只读,确保备份数据一致性
    

      

    5.退出mysql命令行,执行备份命令

    #备份当前所有数据库,可以参考备份单库
    mysqldump -u root -p --all-databases --master-data > mysql_bak.sql
    

    #从服务器的配置----------------------------------------------------------------------------------------------------------------------- 

    1.停掉slave端数据库服务

    service mysql stop

    2.修改配置文件:

    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
    #从数据库(Slave)配置:
    #***********************************slave my.cnf配置开始******************************
    #从库日志记录文件位置或名称前缀
    log_bin = /var/lib/mysql/mylog-bin.log
    #同步日志记录的频率,1为每条都记录,安全但效率低
    sync_binlog = 1
    #server的id,不能与相同id的mysql主从连接
    server-id=2
    #从库日志忽略的数据库名称,不记录
    #这里记录从库的binlog是为了安全,如果觉得没必要,可以去掉从库binlog的配置
    binlog-ignore-db = cluster
    binlog-ignore-db = mysql
    binlog-ignore-db = performance_schema
    binlog-ignore-db = information_schema
    #此处添加需要同步的数据库名称,那么它会只接收这个数据库的信息,多个数据库需同步按照此格式另写几行即可
    #这里同步数据有两种思路,一种是主服务器只发从库需要的,在主库指定;一种是主服务器把所有数据同步过来,从库按需过滤接收
    #为了让配置更详细些,此处配置了从库过滤接收的配置
    replicate-do-db=test
    #忽略接收的库名
    replicate-ignore-db = cluster
    replicate-ignore-db = mysql
    replicate-ignore-db = performance_schema
    replicate-ignore-db = information_schema
    #跳过所有错误继续
    slave-skip-errors=all
    #设置延时时间
    slave-net-timeout=60
     
    #mysql复制模式,三种:SBR(基于sql语句复制),RBR(基于行的复制),MBR(混合模式复制)
    binlog_format=MIXED #混合模式复制
    expire_logs_days=7 #binlog过期清理时间
    max_binlog_size=20M #binlog每个日志文件大小
    #***********************************slave my.cnf配置结束******************************
    3.保存退出:wq
    4.启动mysqld服务
     
    /etc/init.d/mysql start
    或service mysqld start
    

      


     

    5.导入主服务器数据库备份的数据

    mysqldump -u root -p your databasename < ~/mysql_bak.sql

    source mysql_bak.sql(如果你的数据库是新建的要用这条命令,我执行上面的命令始终没成功,又浪费了很多时间)

    6.在从服务器slave端的mysql>指定master端的相关参数(登陆mysql后执行)

    mysql>CHANGE MASTER TO
    MASTER_HOST='10.192.209.122',
    MASTER_PORT=3307,
    MASTER_USER='slave',
    MASTER_PASSWORD='slave',
    MASTER_LOG_FILE='mysql-bin.000006',
    MASTER_LOG_POS=787;
    

      

    注:最后两行是之前在主服务器show master status 所记录的数据

      如果之前已经启动了一个slave进程,那么以上的命令会失效,并提示stop slave first,所以先stop slave; 然后重试

    7.启动slave

    start slave;
    show slave statusG #注意,没有分号
    

      

     输出如下,显示两个都为yes即成功,可以测试一下

    mysql> show slave status;
     
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 10.192.209.122
                      Master_User: replication
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000006
              Read_Master_Log_Pos: 787
                   Relay_Log_File: mysql-relay-log.000004
                    Relay_Log_Pos: 441
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 52360
                  Relay_Log_Space: 597
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File: 
               Master_SSL_CA_Path: 
                  Master_SSL_Cert: 
                Master_SSL_Cipher: 
                   Master_SSL_Key: 
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error: 
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 1
    """
    

      

    ----------此处执行从服务器相关配置全部完成再执行下面2步--------
    6.从服务器启动slave(前提是配置好从服务器)
    7.从服务器启动完毕后关闭表锁

    unlock tables;

    #从服务器的配置----------------------------------------------------------------------------------------------------------------------- 

    有时要清除从库的所有复制信息,如切换为不同的Master, 主从重做等;Reset slave是一个比较危险的命令,所以在执行前一定要准备知道其含义。

      1. 命令在slave上执行,执行前一定要停掉slave(stop slave)
      2. 执行reset slave后,会清除复制相关的所有信息,包括:master.info, relay-log.info, 及无条件删除所有的中继日志(relay logs). 注意是无条件的,也就是不管理你Slave SQL线程是否把所有的relay log重放完了。
      3. 注意,stop slave后,先保存show slave status信息,然后再执行reset slave. 一般这个信息都会有用的。

  • 相关阅读:
    ssh日常优化使用
    Python模块学习
    Python模块学习
    Python模块学习
    利用Python进行端口扫描
    利用Python 发送邮件
    FastDFS分布式文件系统
    Python自动化运维
    Python自动化运维
    网络结构解读之inception系列一:Network in Network
  • 原文地址:https://www.cnblogs.com/anakin/p/13737472.html
Copyright © 2011-2022 走看看