前言:

在MySQL中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习MySQL过程中必不可少的一部分,关于主从复制的文章有很多,笔者也来凑凑热闹,写写这方面的内容吧,同时分享下自己的经验和方法。

1.主从复制简介及原理

主从复制(也称 AB 复制)是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器既可充当主机,也可充当从机。MySQL默认采用异步复制方式。

主从复制的过程及原理可以总结如下:

master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中。

slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件。

同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致。

2.基于二进制文件位置配置主从复制

基于二进制文件位置的主从复制又可以称为传统复制,即从服务器依赖于主服务器的binlog文件位置,当主库发生数据变更时,binlog pos位点会增长,从库会感应到变化来完成同步。

配置主从复制,我们首先要准备至少两台MySQL实例,一台充当主服务器、一台充当从服务器。由于主从复制依赖于binlog,所以主库必须开启binlog,且主从要配置不同的server_id,下面具体展示下配置过程:

2.1 确认主从库配置参数

MySQL主从服务器建议有如下配置,可以先确认下,如果未配置,则需要修改配置文件然后重启。

# 主库参数配置 要有以下参数

vim /etc/my.cnf

[mysqld]

log-bin = binlog //启用二进制日志

server-id = 137 //服务器唯一ID,默认值是1,一般设置为IP地址的最后一段数字

binlog_format = row //bilog设置为row模式 防止复制出错

# 从库建议配置以下参数

vim /etc/my.cnf

[mysqld]

relay-log = relay-bin

server-id = 138

2.2 确定主库二进制位置,创建同步账号

若主从库都是刚刚初始化完成,且主库无操作时,从库可不用同步主库的数据,直接确定主库的binlog位置即可。

# 查看主库binlog文件位置

show master status;

# 主库创建同步账号

create user 'repl'@'%' identified by '123456';

grant replication slave on *.* to 'repl'@'%';

若主库已经运行了一段时间,有业务数据在,而从库刚刚初始化完成,此时则需要备份主库的数据,然后导入从库,使得主从数据一致。

# 主库创建同步账号

create user 'repl'@'%' identified by '123456';

grant replication slave on *.* to 'repl'@'%';

# 全备主库数据

mysqldump -uroot -pxxxx -A -R -E --single-transaction --master-data=2 > all_db.sql

# 从库端恢复

mysql -uroot -pxxxx < all_db.sql

# 从备份文件中可以找到主库的binlog位置

2.3 进入从库,开启主从复制

找到主库二进制文件位置且完成主从数据一致后,我们就可以正式开启主从复制了。

# 进入从库MySQL命令行 执行change master语句连接主库

# 二进制文件名及pos位置由上面步骤获得

CHANGE MASTER TO MASTER_HOST='MySQL主服务器IP地址',

MASTER_PORT=3306,

MASTER_USER='repl',

MASTER_PASSWORD='123456',

MASTER_LOG_FILE='binlog.000002',

MASTER_LOG_POS=154;

# 开启主从复制 并坚持状态

start slave;

show slave status \G //查看slave状态 确保Slave_IO_Running: Yes Slave_SQL_Running: Yes

3.基于GTID的主从复制

GTID是MySQL 5.6的新特性,其全称是Global Transaction Identifier,可简化MySQL的主从切换以及Failover。GTID用于在binlog中唯一标识一个事务。当事务提交时,MySQL Server在写binlog的时候,会先写一个特殊的Binlog Event,类型为GTID_Event,指定下一个事务的GTID,然后再写事务的Binlog。

在基于GTID的复制中,首先从服务器会告诉主服务器已经在从服务器执行完了哪些事务的GTID值,然后主库会有把所有没有在从库上执行的事务,发送到从库上进行执行,并且使用GTID的复制可以保证同一个事务只在指定的从库上执行一次,这样可以避免由于偏移量的问题造成数据不一致。也就是说,无论是级联情况,还是一主多从的情况,都可以通过GTID自动找位置,而无需像之前那样通过File_name和File_position找主库binlog位置了。

基于GTID的主从复制与上面基于二进制文件位置的主从复制搭建步骤类似,同样简单展示下搭建过程:

3.1 确认主从库配置,开启GTID

# 主库参数配置 要有以下参数

vim /etc/my.cnf

[mysqld]

server-id = 137

log-bin = binlog

binlog_format = row

gtid-mode = ON //开启gtid模式

enforce-gtid-consistency = ON //强制gtid一致性,用于保证启动gitd后事务的安全

# 从库建议配置以下参数

vim /etc/my.cnf

[mysqld]

server-id = 138

log-bin = binlog

binlog_format = row

gtid-mode = ON

enforce-gtid-consistency = ON

relay-log = relay-bin

3.2 创建同步账号,保持主从库数据一致

若主库刚初始化完成或者主库端保留有全部二进制文件,则从库无需手动同步数据。否则需要手动同步数据使得主从一致。

# 主库创建同步账号

create user 'repl'@'%' identified by '123456';

grant replication slave on *.* to 'repl'@'%';

# 若主库刚初始化或保留有完整二进制文件 则无需执行下面步骤

# 全备主库数据

mysqldump -uroot -pxxxx -A -R -E --single-transaction > all_db.sql

# 从库端恢复

mysql -uroot -pxxxx < all_db.sql

3.3 进入从库,开启主从复制

# 进入从库MySQL命令行 执行change master语句连接主库

CHANGE MASTER TO MASTER_HOST='MySQL主服务器IP地址',

MASTER_PORT=3306,

MASTER_USER='repl',

MASTER_PASSWORD='123456',

MASTER_AUTO_POSITION = 1;

# 开启主从复制 并坚持状态

start slave;

show slave status \G

4.一些经验及建议

在日常学习及工作过程中,主从复制方面也积累了一些经验,下面简单分享几点,希望各位少踩坑。

主从两端数据库版本尽量保持一致。

主从库参数建议相同,比如字符集、sql_mode这类参数要设置一样。

从库服务器性能不能过于落后主库,以免因服务器性能产生主从延迟。

所有表强制拥有主键,因为无主键表同步到从库极易产生主从延迟。

建议从库设为read only,以防人为误操作从库数据。

监控主从延迟及状态,及时解决同步中断或延迟问题。

总结:

本文介绍了主从复制的原理及搭建过程,其实关于主从复制的内容还有很多,需要不断的学习。这里推荐大家使用GTID模式来搭建主从复制,关于后面分享的几点经验,也是自己日常积累的,希望对你有所帮助。写作不易,觉得还不错的话,请顺手转发分享下哦。

mysql 主从复制讲解_MySQL主从复制详解相关推荐

  1. mysql正则表达式讲解_MySQL 正则表达式详解

    MySQL 正则表达式 在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配. MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正 ...

  2. mysql 流复制_MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken

    前言 随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此时数据库集群就很好的解决了这个问题了.采用MySQL分布式集群,能够搭建一个高并发.负载均衡的集群服务器.在 ...

  3. mysql 实例复制_MySQL 复制详解及简单实例

    MySQL 复制详解及简单实例 主从复制技术在MySQL中被广泛使用,主要用于同步一台服务器上的数据至多台从服务器,可以用于实现负载均衡,高可用和故障切换,以及提供备份等等.MySQL支持多种不同的复 ...

  4. mysql status改变_mysql 配置详解mysql SHOW STATUS 详解

    1. back_log 指定MySQL可能的连接数量.当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程. back_log ...

  5. mysql配置文件说明_mysql配置文件详解说明

    mysql配置文件http://www.doczj.com/doc/ef8ad6026c175f0e7cd1371f.htmlf详解说明 MySQL配置文件http://www.doczj.com/d ...

  6. mysql怎么约束_MySQL 约束详解

    MySQL 约束详解 MySQL 中的约束是用来保证数据的完整性的机制.数据完整性一般有以下三种形式: 实体完整性:保证表中有一个主键. 域完整性:保证数据每列的值满足特定条件. 引用完整性:保证两张 ...

  7. mysql 主从复制讲解_mysql主从复制 详解

    操作系统环境:CentOS5.5 1.MySQL 主从流程图 2.MySQL 主从说明 a.主服务器一定要开启二进制日志文件. b.MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在 ...

  8. mysql字符集解释_MySQL字符集详解

    一.MySQL字符集编码简单介绍 在使用MySQL时要注意6个需要编码的地方:系统的编码.客户端.服务端.库.表.列.字符集编码不仅影响数据存储,还影响client程序和数据库之间的交互.在mysql ...

  9. mysql 连接字符集_MySQL字符集详解

    一.MySQL字符集编码简单介绍 在使用MySQL时要注意6个需要编码的地方:系统的编码.客户端.服务端.库.表.列.字符集编码不仅影响数据存储,还影响client程序和数据库之间的交互.在mysql ...

最新文章

  1. Centos MySQL 5.7安装、升级教程
  2. java 数据库数据脱敏_Sharding-JDBC-数据脱敏
  3. 课时 27:Kubernetes 安全之访问控制(匡大虎)
  4. 标签传播算法(Label Propagation)及Python实现
  5. HDU-1003 Max Sum(动态规划)
  6. GDI+ 学习记录(28): 图像颜色的数据格式 - PixelFormat
  7. 捐赠3亿元驰援疫情后,腾讯再出2亿元发起“战疫开发者公益联盟”
  8. 如何清除以前连接到Mac的WiFi网络
  9. sql与hsql的区别以及分别怎么用!
  10. (拯救者Y7000)重装win10后,耳机插入电脑声音还是外放
  11. hermite spline
  12. 高电平、低电平复位电路
  13. 祝酷狗猴年快乐,网易云称其耍猴
  14. 武汉理工大学数据库综合实验——教学管理信息系统--本科专业培养计划
  15. 优秀logo,最基础的设计技巧(一)
  16. PGP生成秘钥对及应用
  17. 常用request方法
  18. SQL Server数据库语法篇(付费内容限时开放)
  19. eve-ng导入华为路由器镜像
  20. 门店销售管理系统助力传统门店信息化升级

热门文章

  1. [笔试题目] 腾讯2015年9月基础研究笔试题
  2. 【数据结构与算法】之深入解析“修剪二叉搜索树”的求解思路与算法示例
  3. Swift之字符串String的常规操作和处理
  4. iOS基础知识(面试必备)
  5. 【MFC】CDialog类详解
  6. 【Linux网络编程】TCP编程
  7. 【Tools】MarkDown教程(四)-MarkDown中的UML图
  8. 【Linux系统编程】进程和线程的区别
  9. python 面试题 2020_2020年最全python面试题
  10. Apache Web Server - httpd 的文档根目录 及 访问控制