在mysql5.6之前我一直都是使用的基于二进制日志的主从复制,也没出过什么问题,
当mysql更新到5.7之后GTID(全局事务标示符)就比较完善了,所以也就研究了一下。
1.为什么要主从复制?
没有为什么,开心就好,等你主机服务器突然宕机sql无法启动的时候你就明白了,等等
2.什么是GTID?
全局事务ID,保证为每一个在主数据库上提交的事务在复制集群中可以生成一个唯一的ID,GTID包括两个值,一个是serveruuid代表每个库的id值,并且唯一性,另外一个是transaction_id事务id,代表已执行事务的id,且主库与从库1:1相等,
3.GTID与基于二进制日志复制的区别?
首先两者都是基于bin_log日志复制的,二进制复制是从服务器告诉主服务器从哪个二进制日志偏移量进行增量同步,如果指定错误就会遗漏或者重复,GTID从库把已执行事务的GTID值发送给主库,主库对比日志之后把未执行的GTID值传给从库,从而更新从库,同一个事务只在指定的从库执行一次,不会发生重复执行。
4.GTID主从复制的配置要求?
mysql版本一定要>=5.7,5.6的也行只要不怕突然出bug就行,而且mysql更新到5.7之后最重要的是,可以一从多主了,想想是不是很刺激嘿嘿。
开启GTID后有如下限制:
不允许在同一个事务内对事务表和非事务进行DML操作,例如在同一个事务内先update innodb表,然后update myisam表 就会产生两个GTID;不允许create table… select语句等等,其他的百度。一般正常操作不会影响。
创建复制账号并授权更新
create user 'server2' @'192.168.123.%' identified by '123456';
grant replication slave on *.* to server2@'192.168.123.%';
FLUSH PRIVILEGES;
server2 是创建的用户名,192.168.123.%是你的ip网段,123456是密码。
主库mysql配置
server-id = 1 主库server-id 和之前的serveruuid是两码事,别搞混了
gtid_mode = on 启动GITD模式
log-slave-updates = on 更新事务修改日志,5.7之后可以省略
enforce-gtid-consistency = on 开启强制GTID一致性保证事务安全
master_info_repository =TABLE
relay_log_info_repository = TABLE 可选项(先看看是否已配置)
从库mysql配置
server-id = 2 主库server-id 和之前的serveruuid是两码事,别搞混了
gtid_mode = on 启动GITD模式
relay_log = /usr/local/mysql/sql_log/mysql-relay-bin 路径随意改变
log-slave-updates = on 更新事务修改日志,5.7之后可以省略
enforce-gtid-consistency = on 开启强制GTID一致性保证事务安全
read_only=on
master_info_repository =TABLE
relay_log_info_repository = TABLE可选项
重启mysql服务
service mysql restart
初始化数据库'
主库操作
mysqldump --single-transaction --master-data=2 --triggers --routines --all-databases -uroot -p > /vagrant/all3.sql;
主库操作,备份 /vagrant/all3.sql为备份的sql文件位置
把sql文件上传到从库服务器上,可以选择ftp scp 等等,我这里是windows下的linux虚拟机,文件是linux和windows同步的我只要从主服务器复制到从服务器就行了
从库初始化主库的数据
mysql -uroot -p < /vagrant/all3.sql
从库开启主从复制
change master to master_host='192.168.123.101',master_user='repl',master_password='123456',master_auto_position=1;
start slave;
192.168.123.101主库ip
show slave status \G; 查看主从复制状态
更新一下主库看看从库是否也同步吧
复制错误
我这里为0代表没有错误
此处为主从复制错误状态,一般错误排查 看一下my.conf 里的server-id 是不是一样的,还有uuid是否冲突,
如果server-id 一样,改一下就行了
查看uuid如果主从的uuid也一样的话就会出错,一个集群里不会存在相同的uuid的,
解决办法 删除auto.cnf文件
停止mysql
删除auto.conf
启动mysql
auto.conf将会自动生成
如果没有错误,就可以更新一下主库看看,从库是否也同步吧