前言
今天把公司测试数据库做了GTID的主从,但是当时没有停止主库,直接通过xtrabackup进行备份,然后把数据恢复到从库,然后直接执行start salve进行主从复制,发现总是报如下之类的错误:
解决办法
折腾了一下午,上网查了n多资料之后发现这个问题还是有办法解决的,而且解决这个问题之后还可以做到不停库进行主从复制的配置。
-
首先主库通过xtrabackup进行备份,我采用如下命令
innobackupex -uxxxx -pxxxx . --stream=tar|gzip -> backup.tar.gz
直接备份成tar.gz的格式,然后传到从库服务器; -
从库直接tar解压压缩文件到数据库目录
tar xvf *.tar.xz /usr/local/mysql/data/
,我发现xtrabackup --copy-back也可以使用cp或者rsync替换,我此处直接就解压到数据目录了; -
执行--apply-log进行事务回滚,此步骤一定要做,然后修改数据目录属主属组,启动数据库;
-
此步骤非常重要,数据恢复完成之后在数据目录有xtrabackup_binlog_info文件,内容如下:
三个字段,第一个是已经应用到哪个二进制日志;第二个是当前的pos,如果不是gtid主从则指定pos的时候指定这个即可;第三个是备份已经包含的事务,所以从库启动主从之前需要先执行set @@global.gtid_purged='xxxxxx:xx'
命令跳过备份项,否则会出现我之前出现的错误。 -
执行
set @@global.gtid_purged='xxxxxx:xx'
发现报错了,错误如下:ERROR 1840 (HY000): Unknown error 1840,上网查询资料发现可以执行reset master,然后就能够正常执行命令跳过备份包含的gtid了; -
然后再执行change master to 命令开始主从即可。
change master to
master_host='ip',
master_port=port,
master_user='username',
master_password='password',
master_auto_position=1;
```
- 如果之前已经配置过主从,则可以通过
reset slave all
清除所有的主从配置信息。 - 一定要注意配置的顺序,必须是先执行global_purge,然后再执行change master to;
总结
经过一下午的折腾发现还是对数据库不够了解,对GTID和数据库的事务总是迷迷糊糊的,还有很多需要学习的地方。
参考了这两篇文章,感谢作者:
https://www.cnblogs.com/abobo/p/4242417.html
http://blog.51cto.com/arthur376/1792551