我们最近将 MySQL 5.0 master-master setup 升级到 Percona 5.6。由于我们这边的一些故障,Slaving 变得 b0rken,但我们认为我们可以通过使用 xtrabackup 从正在运行的服务器创建备份并将其导入到 slave 来简单地修复它。我整个周末都在尝试这样做(部分原因是它是一个巨大的数据库,其中包含大量的数据库和表),但无济于事。有人可以阐明我在这里可能做错了什么吗?
首先,我在当前的生产主服务器上运行以下命令:
ulimit -n 409600
innobackupex --defaults-file=/etc/mysql/debian.cnf /mnt
完成后,我将生成的目录复制到另一台服务器并运行:
innobackupex --use-memory=4G --apply-log /srv/restore
它最终以 OK 消息退出。现在我将它恢复到数据库:
innobackupex --move-back /srv/restore
一切顺利,我可以再次启动 MySQL(在我 chown /srv/mysql 目录,这是我们的数据目录之后)。数据在那里,数据库运行良好。现在我开始在这个数据库上工作:
/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf -e "CHANGE MASTER TO MASTER_HOST='10.x.x.x', MASTER_USER='replication', MASTER_PASSWORD='verysecret', MASTER_AUTO_POSITION=1; START SLAVE"
从动开始但由于 1062 错误而立即停止。经过调查,我发现它尝试应用的条目是在我开始备份后立即添加到主数据库中的。我可以解决这个问题,但我立即收到一个新错误。
对我来说,备份似乎没有包含所有最新的 GTID,只有在备份开始时可用的那些?我认为这正是 XtraBackup 应该解决的问题?我现在看不到确保在备份期间不对数据库进行任何写入的替代方法。我在这里做错了吗?这应该发生吗?
在带有所有最新补丁的 Debian Wheezy 上运行。
Server version: 5.6.25-73.1-log Percona Server (GPL), Release 73.1, Revision 07b797f
$ innobackupex --version
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013. All Rights Reserved.
$ xtrabackup --version
xtrabackup version 2.2.11 based on MySQL server 5.6.24 Linux (x86_64) (revision id: )
您必须告诉从属服务器在进行备份时在主服务器上执行的最后一个 GTID 是什么。
来源:https ://www.percona.com/doc/percona-xtrabackup/2.1/howtos/recipes_ibkx_gtid.html