MySQL 复制在业界里有叫:mysql 同步,ab 复制等。专业名称就是叫:复制。

复制是单向的,只能从 master 复制到 slave 上,延时基本上是毫秒级别的。

一组复制结构中可以有多个 slave,对于 master 一般场景推荐只有一个。

master 用户写入数据,生成 event 记到 binary log 中 slave 接收 master 上传来的 binlog,然后按顺序应用,重现 master 上的用户操作。

记录最小的单位是一个 event,日志前 4 个字节是一个 magic number, 接下来 19 个字节记录 formatt desc event:FDE

MySQL 5.6 增加了 GTID 复制

1、classic 主从配置

核心配置

[mysqld]

log-bin

server-id

gtid_mode=off #禁掉 gtid

grantreplication slave on *.* to 'repl'@'%' identified by 'repl4slave';

flushprivileges;

添加一个新的从库,获取主库上一个带 binlog 及 pos 偏移量的备份

在从库上恢复后执行

>changemaster to

master_host='192.168.199.117',

master_user='slave',

master_port=7000,

master_password='slavepass',

master_log_file='mysql-bin.000008',

master_log_pos=896;

启动 slave,并查看状态

>start slave;

>show slave status\G;

如果遇到错误,可以跳过:

stop slave;

set globalsql_slave_skip_counter=1;

start slave;

show slave status\G;

2、复制配置

一个事务对应一个唯一 ID,一个 GTID 在一个服务器上只会执行一次,GTID 是用来替代以前 classic 的复制方法,mysql 5.62 支持,mysql 5.6.10 后完善

优点:

相对于行复制来讲数据安全性更高,故障切换更简单

配置 GTID

[mysqld]

#GTID:

gtid_mode=on

enforce-gtid-consistency=on

#binlog

log-bin=mysql-bin

log-slave-updates=1

GTID 添加从库有两种方法:

1、如果 master 所有的 binlog 还在,安装 slave 后,直接 changemaster 到 master,原理是直接获取 master 所有的 gtid 并执行,优点是简单。缺点是如果 binlog 太多,数据完全同步需要的时间较长,并且需要 master 一开始就启用了 GTID。

总结:适用于 master 也是新建不久的情况

2、通过 master 或者其它 slave 的备份搭建新的 slave,原理:获取 master 的数据和这些数据对应的 GTID 范围,然后通过在 slave 设置 @@GLOBAL.GTID_PURGED 从而跳过备份包含的 GTID,优点是可以避免第一种方法中的不足,缺点操作相对复杂。

总结:适用于拥有较大数据集的情况

GTID 添加从库:

1、用 mysqldump 工具在备份的时候需要指定 --master-data

导出的语句中包括:set @@GLOBAL.GTID_PURGED='c8d960f1-83ca-11e5-a8eb-000c29ea831c:1-745497'; 恢复时,需要先在 slave 上执行一个 reset master,再执行 change master to

2、用 percona xtrabackup 工具

xtrabackup_binlog_info 包含了 GTID 在信息

做从库恢复后,需要手工设置:

set@@GLOBAL.GTID_PURGED='c8d960f1-83ca-11e5-a8eb-000c29ea831c:1-745497';

恢复后,执行

>change master to

master_host='192.168.199.117',

master_user='slave',

master_port=7000,

master_password='slavepass',

master_auto_position=1;

错误跳过

stop slave;

setgtid_next='xxxxxxxx:N';

begin;

commit;

setgtid_next='automatic';

start slave;

GTID 的限制:

1、不支持非事务引擎(从库报错,stopslave; start slave; 忽略)

2、不支持 create table … select 语句复制(主库直接报错)

3、不允许在一个 SQL 同时更新一个事务引擎和非事务引擎的表

4、在一个复制组中,必须要求统一开启 CTID 或是关闭 GTID

5、开启 DTID 需要重启(5.7 中可能不需要)

6、开启 DTID 后,就不在使用原来的传统的复制方式

7、对于 createtemporary table 和 drop temporary table 语句不支持

8、不支持 sql_slave_skip_counter

MySQL 复制默认是异步复制,Master 将事件写入 binlog,但并不知道 Slave 是否或何时已经接收且已处理。在异步复制的机制的情况下,如果 Master 宕机,事务在 Master 上已提交,但很可能这些事务没有传到任何的 Slave 上。假设有 Master->Salve 故障转移的机制,此时 Slave 也可能会丢失事务。

官方半同步复制的概念:

1. 当 Slave 主机连接到 Master 时,能够查看其是否处于半同步复制的机制。

2. 当 Master 上开启半同步复制的功能时,至少应该有一个 Slave 开启其功能。此时,一个线程在 Master 上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的 Slave 已收到此事务的所有事件,或等待超时。

3. 当一个事务的事件都已写入其 relay-log 中且已刷新到磁盘上,Slave 才会告知已收到。

4. 如果等待超时,也就是 Master 没被告知已收到,此时 Master 会自动转换为异步复制的机制。当至少一个半同步的 Slave 赶上了,Master 与其 Slave 自动转换为半同步复制的机制。

5. 半同步复制的功能要在 Master,Slave 都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。

同步(社区增强半同步),异步,半同步复制的比较:

同步复制:Master 提交事务,直到事务在所有的 Slave 都已提交,此时才会返回客户端,事务执行完毕。缺点:完成一个事务可能会有很大的延迟。

异步复制:当 Slave 准备好才会向 Master 请求 binlog。缺点:不能保证一些事件都能够被所有的 Slave 所接收。

半同步复制:半同步复制工作的机制处于同步和异步之间,Master 的事务提交阻塞,只要一个 Slave 已收到该事务的事件且已记录。它不会等待所有的 Slave 都告知已收到,且它只是接收,并不用等其完全执行且提交。

半同步,开启后严重影响性能

解决主库不关心日志是否被从库读到半同步配置,在 master 和 slave 上都配置:

master

[mysqld]

rpl_semi_sync_master_enabled=1

rp;_semi_sync_master_timeout=1000#1s

slave

[mysqld]

rpl_semi_sync_slave_enabled=1

复制参数



转载自 | csdn 博客

原文链接 | http://blog.csdn.net/thundermeng/article/details/50401150


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

‘2017DTC’,2017 DTC 大会 PPT

‘DBALIFE’,“DBA 的一天”海报

‘DBA04’,DBA 手记4 经典篇章电子书

‘RACV1’, RAC 系列课程视频及 PPT

‘122ARCH’,Oracle 12.2 体系结构图

‘2017OOW’,Oracle OpenWorld 资料

‘PRELECTION’,大讲堂讲师课程资料

MySQL 传统复制与 GTID 复制原理及操作详解相关推荐

  1. python读取word内容复制粘贴,Python读取word文本操作详解

    本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就 ...

  2. RDD 与 DataFrame原理-区别-操作详解

    1. RDD原理及操作 RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用.RDD内 ...

  3. Spark RDD、DataFrame原理及操作详解

    RDD是什么? RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用. RDD内部可以 ...

  4. SSH远程连接原理及操作详解

    参考资料SSH登录原理_藏红的博客-CSDN博客 SSH全称是Secure Shell,SSH协议是基于应用层的协议,为远程登录会话和其他网络服务提供安全性的协议.SSH使用最多的是远程登录和传输文件 ...

  5. 【MySQL】数据库中表的增删查改操作详解

    文章目录 前言 SQL的通用语法 一.表的创建与表的新增 语法 数据类型的介绍 演示 二.表的删除 语法 删整张表的语法 删记录的语法 演示 三.表的查询 查询整张表 (一)全列查询 (二)指定列查询 ...

  6. php建一个表按删除就删除,mysql表的清空、删除和修改操作详解

    一.清除mysql表中数据 delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也 ...

  7. python复制列表元素_Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解...

    Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解 概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅 ...

  8. linux mv复制命令,linux中删除复制移动文件rm,mv,cp命令详解linux操作系统 -电脑资料...

    在linux中对文件的复制删除移动分别会使用到rm,mv,cp三个命令,下面我来给大家介绍一下rm,mv,cp命令对文件的常规操作吧, 先看实例 删除复制移动文件命令 Linux代码 rm -rf / ...

  9. 缺氧 超级计算机 科学家,缺氧全复制人+资源+生态群落+物品属性详解 缺氧系统讲解 复制人-技能特性-游侠网...

    缺氧对于很多刚上手的玩家来说还是相对比较复杂的一款游戏,游戏中的很多概念都需要玩家自行去琢磨和探索,如果没有搞清楚的话很可能造成存档的慢性死亡.今天小编带来的便是玩家"人衣一体我鲜血&quo ...

最新文章

  1. 计算机网络工程实验分析与体会_《软件工程》面向对象分析实验
  2. 前端学习(1466):表格案例其他效果演示
  3. TP类库解析和使用系列[Input类]
  4. Amazon Seller Central is Temporarily Unavailable
  5. LaTeX TikZ绘图——组合数学中棋盘多项式的画法
  6. 星巴克“啡快”宣布接入支付宝、口碑等阿里应用
  7. Redis:使用Redis的分布式锁
  8. tomcat源码分析(一)- tomcat源码导入IDEA并正常启动
  9. linux源码(含有kfifo)下载
  10. 基于hilbert变换的数字信号_基于Hilbert变换数字调相信号解调算法研究.doc
  11. python中的sort和sorted是什么意思_python中sort和sorted的另类用法
  12. 信号完整性测试入门——SECOND
  13. java 转义符 输出,Java转义字符怎么输出的
  14. Spark亚太研究院王家林:从技术的…
  15. 华为ensp模拟企业网(校园网),总分公司(总分校区),多区域互联,代码有详细注释
  16. 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中
  17. 1051: 电报加密
  18. js中无区别分割中英文逗号的字符串成为数组
  19. Git详解之必知点----Git、本地仓库、远程仓库、IDEA集成Git
  20. 英文文本分词之工具NLTK

热门文章

  1. wpf开源ui引用步骤_吸引开源社区的5个步骤
  2. syn攻击 喝茶_如何喝茶
  3. (13) css浮动补充
  4. java/01/java简介,java基本概念,java基本类型的划分
  5. 项目分享 | 好牛X的开源项目,看完忍不住分享(高手作品分享)
  6. HTML5 Canvas中绘制贝塞尔曲线
  7. CSS IE6躲猫猫Bug
  8. 如何使用计算机实现fft,快速傅立叶变换(FFT)的计算机实现..doc
  9. matlab求负数分数幂问题
  10. SLAM Cartographer(4)对象Node