当前位置: 首页 > news >正文

MySql5.7主从同步配置(gtid模式)

数据库主从同步配置是开发中比较常见的需求,在MySql里,主从同步主要有两种,bin-log和gtid。下面就主要总结一下使用gtid模式配置主从同步的过程。

1. 概念

  • 全局事务标识:global transaction identifiers;
  • GTID是一个事务一一对应,并且全局唯一ID;
  • 一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致;
  • GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制;
  • MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善;
  • 在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

GTID = source_id:transaction_id

  • source_id: 用于鉴别原服务器,即mysql服务器唯一的的server_uuid,由于GTID会传递到slave,所以也可以理解为源ID。
  • transaction_id: 为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务。

示例:3E11FA47-71CA-11E1-9E33-C80AA9429562:23

前面的一串为服务器的server_uuid,即3E11FA47-71CA-11E1-9E33-C80AA9429562,后面的23为transaction_id

优点:

  1. 更简单的实现failover,不用以前那样在需要找log_file和log_pos;
  2. 更简单的搭建主从复制;
  3. 比传统的复制更加安全;
  4. GTID是连续的没有空洞的,保证数据的一致性,零丢失。

GTID限制:

  1. 不能CREATE TABLE … SELECT 复制表结构,复制数据
  2. 使用GTID复制模式时,不支持create temporary table drop temporary table。但是在autocommit=1的情况下可以创建临时表,Master端创建临时表不产生GTID信息,所以不会同步到slave,但是在删除临时表的时候会产生GTID会导致,主从中断.
  3. 在一个事务中或语句中同时更新事务和非事务表,比如在一个事务中更新 innodb表和myisam表。要更新的所有非事务表是临时表除外

2. 配置过程

1. 安装mysql5.7

这里需要说明gtid在mysql5.6之后才有,但是mysql5.6上gtid默认是不可用的,而在mysql5.7上是默认可用的。

2. 数据手工同步

目的:自动同步前,保证两个数据库的数据相同。

1)主数据库导出要备份的数据

2)从数据库导入主数据库的备份数据

3. 修改主数据库配置文件

sudo vi /etc/my.cnf,添加以下配置,重启mysql。

[mysqld]

###主从同步-主###
#设置成IP的最后一位即可
server_id=0001

#打开gtid模式
gtid_mode=on
#开启gtid的一些安全限制,开启后执行限制语法将会报错
enforce_gtid_consistency=true
#备库上启用binlog
log_slave_updates=on

#二进制日志文件名称
log_bin=mysql-bin
#mysql复制模式,三种:SBR(基于sql语句复制),RBR(基于行的复制),MBR(混合模式复制,可靠性更高)
binlog_format=MIXED
#二进制日志自动删除的天数
expire_logs_days=7

# 需要同步的数据库,如果复制多个数据库,重复设置这个选项即可
binlog-do-db=mt

# 不需要同步的数据库
binlog-ignore-db = mysql                
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys

重启主库服务器

4. 修改从数据库配置文件

sudo vi /etc/my.cnf, 添加以下配置,重启mysql。

###主从同步-从###
#设置成IP的最后一位即可
server_id=0002

#打开gtid模式
gtid_mode=on
#开启gtid的一些安全限制,开启后执行限制语法将会报错
enforce_gtid_consistency=true
#备库上启用binlog
log_slave_updates=on

#二进制日志文件名称
log_bin=mysql-bin
#mysql复制模式,三种:SBR(基于sql语句复制),RBR(基于行的复制),MBR(混合模式复制,可靠性更高)
binlog_format=MIXED
#二进制日志自动删除的天数
expire_logs_days=7

#中继日志. 从节点才开启,主节点一般不需要这个日志
relay_log=relay_log
master_info_repository=TABLE
relay_log_info_repository=TABLE

#可选: 从库设置成只读
#read-only=on
super_read_only=off

#主从复制中的跳过错误处理参数
slave-skip-errors=1062,1053

重启从库服务器

5. 主库授权复制用户

set global validate_password_policy=0;

set global validate_password_length=1;

grant replication slave on *.* to 'root'@'%' identified by 'trnuser123';

flush privileges;

#显示主服务器的状态信息,并且找到File 和 Position 的值记录下来;
show master status;

6. 同步数据

1)锁住主库表flush tables with read lock;

2)备份主库中的所有数据到从库中,保持当前主库和从库数据一致

3)解锁主库表unlock tables;

7. 从数据库开启同步

#重启从数据库,设置登录主数据库的账号和密码等信息,然后启动slave
change master to master_host='${主库的实际IP地址}',master_user='root',master_password='trnuser123', master_auto_position=1; 

start slave;

show slave status;

配置完之后,通过查看slave的状态,可以看是否配置成功。同时可以在主库进行一些操作,提交一些事务(insert,update),之后数据就会自动同步到从库。

8. 验证主从同步成功与否

1)查询从服务器

在从服务器上输入命令:

show slave status;

如果输出Slave_IO_RunningSlave_SQL_Running都是Yes,就说明配置成功了

如果其中一项不为 Yes,查看 Last_IO_Errno 错误码和错误信息,或者查看 MySQL 日志信息并查找对应问题

2)添加一个表和数据后,验证一下是否同步到从服务器。

停止同步

从服务器都执行下面指令

 STOP SLAVE;
 STOP SLAVE io_thread;
 
 RESET SLAVE all;
 RESET MASTER;

相关文章:

  • Linux文件系统管理
  • Python 程序的输出 | 第十一套(异常处理)
  • 每日算法刷题Day11-最大公约数、数组去重
  • 网络安全CTF竞赛模式、题目类别、所用工具小结
  • 80,90,00,房子最终砸在买房哪一代人手中?
  • 微服务项目:尚融宝(59)(核心业务流程:提现和还款(2))
  • jetson nano补充:根目录/usr刷机扩容 瘦身
  • Java工程师面试题
  • 网课查题接口使用
  • 算法练习(堆/栈/队列)
  • 大数据-ClickHouse技术一(安装部署)
  • 【Android入门】4、数据持久化:文件、SharedPreferences 和 Sqlite
  • style样式优先级问题【display:block依旧无法显示DOM元素】
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • 面试宝典------经典
  • 【剑指offer】让抽象问题具体化
  • avalon2.2的VM生成过程
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Debian下无root权限使用Python访问Oracle
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Rancher-k8s加速安装文档
  • supervisor 永不挂掉的进程 安装以及使用
  • Webpack 4x 之路 ( 四 )
  • webpack入门学习手记(二)
  • 初识MongoDB分片
  • 检测对象或数组
  • 区块链将重新定义世界
  • 异常机制详解
  • HanLP分词命名实体提取详解
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ###C语言程序设计-----C语言学习(3)#
  • (07)Hive——窗口函数详解
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (ZT)薛涌:谈贫说富
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (推荐)叮当——中文语音对话机器人
  • (转)Sublime Text3配置Lua运行环境
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET DataGridView数据绑定说明
  • .net wcf memory gates checking failed
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net 微服务 服务保护 自动重试 Polly
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET命令行(CLI)常用命令
  • :O)修改linux硬件时间
  • @JSONField或@JsonProperty注解使用
  • @在php中起什么作用?
  • [20180129]bash显示path环境变量.txt
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [Angular] 笔记 21:@ViewChild
  • [BJDCTF2020]The mystery of ip