当前位置: 代码网 > it编程>数据库>Mysql > Mysql主从GTID与binlog如何使用

Mysql主从GTID与binlog如何使用

2024年10月04日 Mysql 我要评论
mysql主从gtid与binloggtid与binlogmysql gtid(global transaction identifier)和binlog(二进制日志)是用于搭建主从复制的两种不同的机

mysql主从gtid与binlog

gtid与binlog

mysql gtid(global transaction identifier)和binlog(二进制日志)是用于搭建主从复制的两种不同的机制。

gtid是mysql 5.6版本引入的一种全局事务标识符,用于跟踪和标识复制过程中的事务。每个事务都会被分配一个全局唯一的gtid,无论该事务在哪个数据库实例上执行。gtid能够确保在主从复制中不会出现数据冲突或数据丢失的情况。使用gtid进行主从复制配置时,主库将事务的gtid信息写入binlog,并将binlog传输给从库,从库使用gtid来确定是否已经复制了某个事务,从而保持主从数据的一致性。

binlog是mysql的二进制日志,用于记录数据库的所有更改操作。它是一种基于文件的日志,可以用于恢复数据库到特定时间点或将更改应用到其他数据库实例。在主从复制中,主库将更改操作写入binlog,并将binlog传输给从库,从库根据binlog中的内容来重放主库上的更改操作,从而实现数据复制。

区别如下

1. gtid是基于事务的标识符,而binlog是基于更改操作的日志。gtid可以确保事务在主从之间的有序复制,而binlog只记录更改操作的内容。

2. gtid可以避免主从复制中的数据冲突或数据丢失,因为每个事务都有唯一的标识符。而binlog需要在从库上正确地应用更改操作,以确保数据一致性。

3. gtid相对于binlog来说更容易配置和管理,因为它不需要手动设置和维护binlog文件名和位置信息。

4. gtid还可以支持多主复制,即一个从库可以连接到多个主库进行复制,而binlog一般用于单个主库和单个从库之间的复制。

gtid工作原理

1、master更新数据时,会在事务前产生gtid,一同记录到binlog日志中。

2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。

3、sql线程从relay log中获取gtid,然后对比slave端的binlog是否有记录。

4、如果有记录,说明该gtid的事务已经执行,slave会忽略。

5、如果没有记录,slave就会从relay log中执行该gtid的事务,并记录到binlog

1.准备环境两台机器,关闭防火墙和selinux。---两台机器环境必须一致。时间也得一致

2.解析/etc/hosts
192.168.246.129  mysql-master
192.168.246.128  mysql-slave

master操作:
[root@mysql-master ~]# vim /etc/my.cnf   #在[mysqld]下添加如下内容
server-id=1   #定义server id master必写 
log-bin = mylog #开启binlog日志,master比写
gtid_mode = on    #开启gtid
enforce_gtid_consistency=1   #强制gtid
[root@mysql-master ~]# systemctl restart mysqld   #重启
主服务器创建用户:
mysql> grant replication  slave,reload,super on *.*  to 'slave'@'%' identified by 'qf@12345!';
#注:生产环境中密码采用高级别的密码,实际生产环境中将'%'换成slave的ip
mysql> flush privileges;
注意:如果不成功删除以前的binlog日志
replication slave:拥有此权限可以查看从服务器,从主服务器读取二进制日志。
super权限:允许用户使用修改全局变量的set语句以及change  master语句
reload权限:必须拥有reload权限,才可以执行flush  [tables | logs | privileges]
slave操作:
[root@mysql-slave ~]# vim /etc/my.cnf  #添加如下配置
server-id=2
gtid_mode = on
enforce_gtid_consistency=1
master-info-repository=table
relay-log-info-repository=table
[root@mysql-slave ~]# systemctl restart mysqld
[root@mysql-slave ~]# mysql -uroot -p'qf123'   #登陆mysql
mysql> \e
change master to
master_host='master1',      #主ip 地址  最好用域名
master_user='授权用户',     #主服务上面创建的用户
master_password='授权密码', 
master_auto_position=1;
-> ;
query ok, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;   #启动slave角色
query ok, 0 rows affected (0.00 sec)

mysql> show slave status\g  #查看状态,验证sql和io是不是yes。

主从复制binlog日志方式

1、在主服务器上,必须启用二进制日志记录并配置唯一的服务器id。需要重启mysql服务。

编辑主服务器的配置文件 my.cnf,添加如下内容

添加配置
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1

创建日志目录并赋予权限

[root@mysql-master ~]# mkdir /var/log/mysql
[root@mysql-master ~]# chown -r mysql.mysql /var/log/mysql

重启服务

[root@mysql-master ~]# systemctl restart mysqld

创建主从同步的用户:

mysql> grant replication slave on *.* to 'repl'@'%' identified by 'qf@12345!';
mysql> flush privileges;

在主服务器上面操作

mysql> show master status\g

在从服务上面操作:

my.cnf配置文件

[mysqld]
server-id=2
重启服务
[root@mysql-slave ~]# systemctl restart mysqld
设置密码
[root@mysql-slave ~]# grep pass /var/log/mysqld.log
[root@mysql-slave ~]# mysqladmin -uroot -p'ofeucga)4/yg' password 'qf@12345!'
登录mysql
[root@mysql-slave ~]# mysql -uroot -p'qf@12345!'
mysql> \e
change master to
master_host='mysql-master',
master_user='repl',
master_password='qf@12345!',
master_log_file='mysql-bin.000001',
master_log_pos=849;
    -> ;
mysql> start slave;
mysql> show slave status\g

参数解释:

change master to
master_host='master2.example.com', #主服务器ip
master_user='replication', #主服务器用户
master_password='password', #用户密码
master_port=3306, #端口
master_log_file='master2-bin.001', #binlog日志文件名称
master_log_pos=4, #日志位置

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com