MYSQL—GTID主从备份
GITD定义
1.全局事物标识(global transaction identifieds)
2.GTID事物是唯一性一个事务对应一个GTID
3.一个GTID在服务器上只执行一次,避免重复执行,导致数据混乱
4.使用master_auto_postion=1的方式自动匹配GTID断点进行复制
5.mysql-5.6.5开始支持,mysql-5.6.10开始完善
GTID = source_id:transation_id
GTID的组成部分
server_uuid:后面是一个序列号
uuid:每个mysql实例的唯一ID,由于会传递到slave,所以可以理解为源ID
Sequence number:在每台mysql服务器上都是从1开始自增长的序列,一个数值对应一个事务。
GTID比传统复制的优势
1.更容易实现failover,不用一千那样在需要找log_file和log_pos.
2.更简单的搭建主从复制
3.更加安全
4.GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。
GTID工作原理
1.master更新数据时,会在事务前产生GTID,一同记录到binlog日志中
2.slave端的I/O线程将变更的binlog,写入到本地的relay log中
3.sql线程从reloy log中获取GTID,然后对比slave端的binlog是否有记录
4.如果有记录,说明该GTID的事务已经执行,slave会忽略
5.如果没有记录,slave就好从relay log中执行该GTID的事务,并记录到binglog
6.在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
MYSQL基于GTID的主从备份
准备两台虚拟机,分别两台都安装MySQL,步骤略。详情参照MySQL主从配置这篇文章。
数据库角色 | IP | 应用与系统版本 |
---|---|---|
主数据库 | 192.168.228.23 | centos7 |
从数据库 | 192.168.228.30 | centos7 |
在主数据库服务器修改/etc/my.cnf配置文件
[root@yxr ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
#GTID
server-id=23 //主服务器id(可以修改成自己的主机,方便区分)
gtid-mode=on //开启gtid模式
enforce-gtid-consistency=on //强制gtid一致性,开启后对于特定create table不被支持
#binlog
log_bin=master-binlog
log-slave-updates=1
binlog_format=row //强烈建议,其他格式可能导致数据不一致
#relay log
skip_slave_start=1
重启mysql服务
[root@yxr ~]# service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.. SUCCESS!
[root@yxr ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *