美文网首页
mysql主从同步

mysql主从同步

作者: 無法定义 | 来源:发表于2018-07-20 15:55 被阅读46次

    mysql中为了读写分离,高可用时,都会用到mysql的主从同步方案。 MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个Mysql数据库(我们称之为Master)复制到另一个Mysql数据库(我们称之为Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和IO线程)在Slave端,另一个线程(I/O线程)在Master端。

    环境搭建

    下载镜像

    docker pull mysql:5.7
    

    配置

    主库配置

    1. 新建文件夹/opt/mysql/master/conf和/opt/mysql/master/data
    2. data存放mysql数据
    3. conf存放配置my.cnf
    [mysqld]
    log-bin=mysql-bin
    server-id=101
    binlog-do-db=test
    binlog_format=STATEMENT
    

    从库配置

    1. 新建文件夹/opt/mysql/slave/conf和/opt/mysql/slave/data
    2. data存放mysql数据
    3. conf存放配置my.cnf
    [mysqld]
    log-bin=mysql-bin
    server-id=102
    replicate-do-table=test.pay_trade
    binlog_format=STATEMENT
    

    启动

    启动主库

    docker run --name mysql-master -v /opt/mysql/master/data:/var/lib/mysql -v /opt/mysql/master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
    

    启动从库

    docker run --name mysql-slave -v /opt/mysql/slave/data:/var/lib/mysql -v /opt/mysql/slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:5.7
    

    开启主备

    创建库

    在主备上创建相同的库test,并创建表pay_trade

    主库开启同步

    创建用于同步的账户

    SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
    GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';
    

    查看主库状态

    SHOW MASTER STATUS;
    
    mark

    从库开启同步

    开启同步

    • master_host为docker的地址不能写127.0.0.1
    • master_user是在主库创建的用户
    • master_log_pos是主库show master status;查询出的Position
    SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
    change master to master_host='172.18.160.102',master_user='backup',master_password='123456',master_log_file='mysql-bin.000005',master_log_pos=444227;
    

    查看从库状态

    SHOW SLAVE STATUS;
    
    mark

    同步方式

    主库同步方式

    • binlog-do-db 二进制日志记录的数据库(多数据库用逗号,隔开)
    • binlog-ignore-db 二进制日志中忽略数据库 (多数据库用逗号,隔开)

    从库同步方式

    • replicate-do-db 设定需要复制的数据库(多数据库使用逗号,隔开)
    • replicate-ignore-db 设定需要忽略的复制数据库 (多数据库使用逗号,隔开)
    • replicate-do-table 设定需要复制的表
    • replicate-ignore-table 设定需要忽略的复制表
    • replicate-wild-do-table 同replication-do-table功能一样,但是可以通配符
    • replicate-wild-ignore-table 同replication-ignore-table功能一样,但是可以加通配符

    binlog三种模式

    ROW

    • 日志中会记录每一行数据被修改的形式,然后在slave端再对相同的数据进行修改
    • 优点:在row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条被修改。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。不会出现某些特定的情况下的存储过程或function,以及trigger的调用和触发无法被正确复制的问题
    • 缺点:row level,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,会产生大量的日志内容。

    STATEMENT

    • 每一条会修改数据的sql都会记录到master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行
    • 优点:statement level下的优点首先就是解决了row level下的缺点,不需要记录每一行数据的变化,减少bin-log日志量,节约IO,提高性能,因为它只需要在Master上锁执行的语句的细节,以及执行语句的上下文的信息。
    • 缺点:由于只记录语句,所以,在statement level下 已经发现了有不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些定的函数或者功能的时候会出现。

    MIXED

    在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志格式,也就是在Statement和Row之间选择一种。如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

    配置

    • 查看
    show global variables like '%binlog_format%';
    
    • 配置
    [myslqd]
    log-bin=mysql-bin
    #binlog_format=STATEMENT
    #binlog_format=ROW
    #binlog_format=MIXED
    

    引用

    相关文章

      网友评论

          本文标题:mysql主从同步

          本文链接:https://www.haomeiwen.com/subject/edlqmftx.html