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冲突;

原文地址:https://www.cnblogs.com/tanghu/p/9882086.html