zoukankan      html  css  js  c++  java
  • mysql复制

    MySQL主从复制原理:

    (1)、MySQL主库提交事物时将数据变更记录作为events事件记录在二进制文件Binlog中;

    主库中的sync_binlog参数控制binlog中的事件刷新到磁盘;

    (2)、主库将二进制日志文件binlog中的事件推送到从库中的中继日志文件replay binlog中。从库根据中继日志重做数据变更操作,通过逻辑复制以此来达到主库和从库的数据一致;

    MySQL通过三个线程来完成主库与从库之间的复制:其中Binlog Dump线程跑在主库上,IO线程和SQL线程跑在从库上。当从库上启动复制(start slave)时,首先创建IO线程连接主库,

    主库随后创建Binlog Dump线程读取数据库事件并发送给IO线程,IO线程获取到事件数据后更新到从库中的replay log中去,之后从库上的SQL线程读取中继日志relay log中的更新的数据库事件并应用。

     

    复制中的各类文件:

    二进制日志文件Binlog不会记录select操作,因为select操作并不修改数据;可以通过show variables 查binlog的格式。中继日志文件replay log和二进制日志文件binlog 一样。唯一的区别是从库中的sql线程执行完replay log中的事件后,sql线程会自动删除当前中继日志文件relay log,避免占用过多的磁盘。为保证从库重启或者crash之后,从库的IO线程和sql线程仍然能够知道从哪里开始复制,从库上还会默认创建两个日志文件master.info和relay-log.info用来保存复制的进度。通过show slave status命令能够查看当前从库复制的状态。

     三种复制方式:

    Binlog日志文件有以下三种格式:

    statement:基于sql语句级别的binlog,每条修改数据的sql都会保存到binlog里;

    row:基于行级别,记录每一行数据的变化,也就是将每行数据的变化都记录到binlog里面,记得非常详细,但是并不记录原始sql,在复制的时候,并不会因为存储过程或触发器造成主从数据不一致的问题,但是记录日志量较statement格式大得多。

    mixed:混合statement和row模式,默认情况下采用statement模式记录,某些情况下会切换到row模式,例如sql中包含与时间、用户相关的函数等;

    这三种格式同时也对应了MySQL复制的3种技术:

    binlog_format=statement:基于sql语句的复制,也叫SBR(statement-based replication);

    binlog_format=row:基于行的复制,也叫RBR(Row-based replication);

    binlog_format=mixed:混合模式复制,混合了基于sql语句的复制和基于行的复制;

    复制的三种常见架构

    (1)一主多从复制架构

    在主库出现异常宕机的情况下,可以把一个从库切换成为主库继续提供服务;

    (2)多级复制架构

    多级复制解决了一主多从的场景下,主库的IO/负载和网络压力。缺点是MySQL的复制是异步复制,多级复制场景下主库的数据是经历两次复制才到达从库,期间的延时比一主多从复制场景下只经历一次复制的要大。可以通过在二级主库‘主库2’上选择表引擎为blackhole来降低多级复制的延时。写入blackhole表的数据并不会写回到磁盘上,blackhole表永远是一个空表,insert/update/delete操作仅仅在binlog中记录事件;

    (3)双主复制/Dual Master架构

     MySQL复制搭建过程:

    (一)异步复制搭建

    (1)首先,确保主从库上搭建了相同版本的MySQL数据库。

    (2)在主库上设置一个复制使用的账户,并授予replication slave 权限。

    例如:grant replication slave *.* to 'repl'@'192.168.6.*' identified by '12345678';

    (3)修改主数据库的配置文件my.cnf(Linux上是my.cnf,windows上是my.ini),开启binlog,并设置server-id的值。这两个参数的修改需要重新启动数据库服务才可以生效。

    例:

    [mysqld]

    log-bin=mysql-bin  #MySQL5.7的配置是写这样

    server-id=1

    (4)在主库上设置读锁定有效,这个操作是为了确保没有数据库操作,以便获得一个一致性的快照。

    flush tables with red lock;

    (5)然后得到主库上当前的二进制日志名和偏移量值,这个操作目的是为了在从数据库启动以后,从这个点开始进行数据的恢复。

    (6)生成主数据的备份,直接复制文件应该是最快的生成快照的方法;将主数据目录下的data文件全部复制到从数据库下的data目录;

    (7)修改从数据库的my.cnf或my.ini;如下:

    [mysqld]

    server-id=2  #r如有多个从库,每个从库必须有自己唯一的server-id值;

    (8)对从库做相应的设置:

    change master to master_host='192.168.6.22',
    master_user='repl',
    master_password='admin123',
    master_log_file='mysql-bin.000001',
    master_log_pos=225285;

    (9)在从库上启动slave线程;start slave

     (10)show slave statusG查看重库状态是否有错误;

    这两个状态为yes的时候就成功了;

     Last_IO_Errno: 1045这个错误一般是主库上的复制账号有问题

    Last_IO_Errno: 1593这个错误是从库的server_id不能和主库的server_id冲突;

  • 相关阅读:
    tfs中如何创建团队项目及如何操作团队项目
    Qt出现常量有换行符的错误的解决方法
    .net程序在无.net环境下运行
    无法定位程序输入点__gxx_personality_v0的一个解决方法
    SQL Server2012中的SequenceNumber
    GDB十分钟教程
    使用vscode对c进行调试
    sqlserver 操作xml
    使用HttpOnly提升Cookie安全性
    SQL localdb 连接字符串
  • 原文地址:https://www.cnblogs.com/tanghu/p/9882086.html
Copyright © 2011-2022 走看看