首页 > 数据库 >MySql5.7主从同步配置(gtid模式)

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

时间:2023-06-12 10:45:12浏览次数:42  
标签:slave log MySql5.7 复制 gtid 服务器 主从 GTID

mysql数据库主从同步配置是开发中比较常见的需求,在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

工作原理:

master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
如果有记录,说明该GTID的事务已经执行,slave会忽略。
如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
优点:

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

不能CREATE TABLE … SELECT 复制表结构,复制数据
使用GTID复制模式时,不支持create temporary table 和 drop temporary table。但是在autocommit=1的情况下可以创建临时表,Master端创建临时表不产生GTID信息,所以不会同步到slave,但是在删除临时表的时候会产生GTID会导致,主从中断.
在一个事务中或语句中同时更新事务和非事务表,比如在一个事务中更新 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]
#表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=1

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

#打开gtid模式
gtid_mode=on
#开启gtid的一些安全限制,开启后执行限制语法将会报错
enforce_gtid_consistency=true
#允许下端接入slave,A->B->C,其中B是A的从服务器,同时B又是C的主服务器,那么B服务器除了需要打开log-bin之外,还需要打开log-slave-updates选项
log_slave_updates=on

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

#就是启动slave从库的时候,复制线程不会随着mysql进程启动而开启,进而导致破坏了从库.如果你需要启动就需要手动执行start slave命令
skip_slave_start=ON
#主从复制中的跳过错误处理参数
slave_skip_errors=1062,1053

#中继日志.
relay_log=relay_log
master_info_repository=TABLE
relay_log_info_repository=TABLE

#主库
# 需要同步的数据库,如果复制多个数据库,重复设置这个选项即可
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。

[mysqld]
#表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=1

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

#打开gtid模式
gtid_mode=on
#开启gtid的一些安全限制,开启后执行限制语法将会报错
enforce_gtid_consistency=true
#允许下端接入slave,A->B->C,其中B是A的从服务器,同时B又是C的主服务器,那么B服务器除了需要打开log-bin之外,还需要打开log-slave-updates选项
log_slave_updates=on

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

#就是启动slave从库的时候,复制线程不会随着mysql进程启动而开启,进而导致破坏了从库.如果你需要启动就需要手动执行start slave命令
skip_slave_start=ON
#主从复制中的跳过错误处理参数
slave_skip_errors=1062,1053

#中继日志.
relay_log=relay_log
master_info_repository=TABLE
relay_log_info_repository=TABLE

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

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

重启从库服务器

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_Running 和 Slave_SQL_Running都是Yes,就说明配置成功了

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

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

给已经运行的GTID的master端添加一个新的slave
在mysqldump备份的时候指定--master-data=2(来保存binlog的文件号和位置的命令)。一个脚本供参考:

DB_USER="root"

DB_PASS="123456!"

DB_HOST="localhost"

DB_NAME="newerp"

BIN_DIR="/usr/bin"

BCK_DIR="/data"

DATE=date +%Y-%m-%d_%H-%M-%S

mysqldump -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME > $BCK_DIR/$DB_NAME.$DATE.sql
#例如: mysqldump -u"root" -p"123456" -h"127.0.0.1" "mt" > SQL_BACK.sql

使用mysqldump的命令在dump文件里可以看到下面两个信息:

SET @@SESSION.SQL_LOG_BIN=0;
SET @@GLOBAL.GTID_PURGED='7800a22c-95ae-11e4-983d-080027de205a:1-8';

将备份还原到slave后,使用change master to命令挂载master端。

mysql -uroot -p < /root/sql_back.sql

同步操作SQL语句
查看主库状态
show processlist;

show master status;

查看从库状态
show processlist;

show slave status;

停止同步
在主从服务器都执行下面指令

STOP SLAVE;
STOP SLAVE io_thread;

RESET SLAVE all;
RESET MASTER;
————————————————

参考:http://www.taodudu.cc/news/show-5947880.html?action=onClick
版权声明:本文为CSDN博主「爱游泳的老白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wjw465150/article/details/127043721

标签:slave,log,MySql5.7,复制,gtid,服务器,主从,GTID
From: https://www.cnblogs.com/cheyunhua/p/17474295.html

相关文章

  • mac下安装Mysql5.7遇到默认密码的大坑
    哈哈,当时我装5.7也遇到过这样的情况 安装的过程很简单,就直接到官方下mysqldmg,一路下一步就可以装完.. MacMysqldmg下载地址,http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.10-osx10.10-x86_64.dmg但是带来的问题是,默认密码不为空…mysql-uroot-p登陆不进去…直接......
  • mysql GTID模式跳过错误GTID事务的正确方法
      最近遇到一个Mysql由于createtable时由于从库表表空间问题,从库sql重放进程执行sql失败,导致从库的sql应用进程挂掉。客户反馈,可以跳过失败的createtable事务,本博文展示mysql基于GITD模式跳过错误CTID事务的正确方法。  1.0明确错误原因root@mysqldb15:53:[(none)]>......
  • mysql 主从复制 原理
     mysql主从复制定义mysql主从复制是一种数据同步的技术,它可以让一个或多个从数据库(slave)复制主数据库(master)的数据变化。这样可以提高数据库的可用性、性能和扩展性,也可以实现读写分离和数据备份。mysql主从复制原理mysql主从复制的原理是基于二进制日志(binlog)的,主数据库......
  • zabbix--监控MySQL主从状态
    zabbix监控MySQL主从状态#搭建MySQL主从后,很多时候不知道从的状态是否ok,有时候出现异常不能及时知道,这里通过shell脚本结合zabbix实现监控并告警一般情况下,在MySQL的从上查看从的运行状态是通过Slave_IO_Running线程和Slave_SQL_Running线程是否ok,通过命令“showslavestatus\G......
  • 十、Redis主从复制
    读操作:主库、从库都可以接收;写操作:首先到主库执行,然后,主库将写操作同步给从库。主从第一次同步第一阶段,主从库间建立连接、协商同步的过程,主要是为全量复制做准备。从库和主库建立起连接,主库确认回复后,就可以开始同步了。具体来说,从库给主库发送psync命令,psync命令包含了......
  • redis主从、哨兵、cluster
    在redis集群中,从节点一般用于备份操作,主节点挂了,从节点顶上去,读写操作一般都是主读主写。主从架构用处:用于数据备份操作,主节点挂了之后可以有备份节点顶上去当主节点。缺点:主节点挂了需要手动切换从节点为主节点......
  • mysql 删除 主从信息
    原来配置的是主主同步,后经调整后配置成主从同步,需要清楚主配置上的同步信息, 进入mysqlmysql>slavestop;mysql>resetslave;mysql>changemastertomaster_user='',master_host='',master_password='';结果报错如下:ERROR1210(HY000):IncorrectargumentstoMASTER_HOS......
  • Mysql 主从备份 Last_Errno: 1146 Last_Error: Error executing row event: 错误问题
    本人在做主从备份的时候发现了此问题! 1主数据库是已经把这个表删除了丛数据库也是没有备份这个表但是一直报这个错原因是bin-log日志有这个表 但是没记录到已经把这个表删除了 主从表同步实际从库是根据主库的bin-log二进制的SQL进行执行的 这是Mysql的一个BUG1......
  • Redis_主从复制
    一、主从复制介绍主机数据更新后根据配置和策略,自动同步到备机的master/slave机制,Master以写为主,slave以读为主好处:读写分离,性能扩展;容灾快速恢复(一主多从):一台slave从机挂掉,马上切换到另一台slave从机提供服务。主机挂:集群集群:一主多从——关联——一主多从二、主从复制配......
  • Redis主从复制
    主从复制简介主从复制即将master中的数据即时、有效的复制到slave中。。特征:一个master可以拥有多个slave,一个slave只对应一个master职责:master写数据执行写操作时,将出现变化的数据自动同步到slave读数据(可忽略)slave读数据写数据(禁止)......