之前一直有一个疑问,就是从master中备份数据后,在还原到slave主机的这段时间,如果master一直在写,当使用master_auto_position=1时,slave是不是会自动同步过来。答案是肯定的,在使用GTID模式下时,数据会自动同步过来。

– 纸上得来终觉浅,绝知此事要躬行

准备工作

my.cnf增加以下内容

server-id主与从不一样,其他一样即可

1
2
3
4
5
6
7
8
[mysqld]
# master为0,slave为1
server-id                = 0
gtid-mode                = ON
enforce_gtid_consistency = 1
log-slave-updates        = 1
log-bin                  = mysql-bin
log-bin-index            = mysql-bin.index

创建复制的帐号

1
2
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl';
FLUSH PRIVILEGES;

master主机上备份

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
docker run --rm -v /data/mysql_data:/var/lib/mysql \
                -v /data/backup:/backup \
                tuwei1314/xtrabackup:1.0  \
                xtrabackup \
                --host=IP   \
                --user=root \
                --password=password  \
                --slave-info \
                --target-dir=/backup \
                --backup

复制文件至Slave

1
scp -r backup root@SlaveMySQLServer:/data/backup

Slave主机上应用

1
2
3
4
5
6
docker run --rm -v /data/mysql-data:/var/lib/mysql \
                -v /data/backup:/backup \
                tuwei1314/xtrabackup:1.0  \
                xtrabackup \
                --prepare \
                --target-dir=/backup \

Slave主机上还原

1
2
3
4
5
6
7
docker run --rm -v /data/mysql-data:/var/lib/mysql \
                -v /data/backup:/backup \
                tuwei1314/xtrabackup:1.0  \
                xtrabackup \
                --move-back \
                --target-dir=/backup \
# 将宿主机的/data/mysql-data作为复制的目的目录,源为/data/backup。通过xtrabackup移动回去

执行以上步骤后,/data/mysql-data下的文件就可以直接被MySQL使用了。直接将my.cnf中的数据目录指向该目录即可,并启动服务。

Slave指定Master

1
2
3
CHANGE MASTER TO master_host="master-ip",master_port=port,master_user='repl',
master_password='password',master_auto_position=1;
START SLAVE;

查看状态

1
SHOW SLAVE STATUS\G