4. 确定哪个二进制日志开始重放和可选地停止。
集群时间点恢复的第二步是重放二进制日志。
我们将需要在第一步中备份和恢复的最后一个纪元。
为此,连接到连接到 MySQL Cluster 的 MySQL 服务器并执行以下 SQL 语句:
SELECT @LATEST_EPOCH:=MAX(epoch) FROM mysql.ndb_apply_status;
现在检索恢复所需的第一个二进制日志和开始位置:
SELECT Position, @FIRSTFILE:=File FROM mysql.ndb_binlog_index WHERE epoch > @LASTEPOCH ORDER BY epoch ASC LIMIT 1; +----------+---------------------+ | Position | @FIRSTFILE:=File | +----------+---------------------+ | 601 | ./master_bin.000004 | +----------+---------------------+ SELECT DISTINCT File FROM mysql.ndb_binlog_index WHERE epoch > @LASTEPOCH AND File <> @FIRSTFILE ORDER BY File; +---------------------+ | File | +---------------------+ | ./master_bin.000006 | | ./master_bin.000008 | +---------------------+
现在我们将拥有二进制日志文件,我们可以像这样使用 mysqlbinlog 实用程序:
mysqlbinlog -D --start-position=601 ./master-log.000004 | mysql -uroot
请注意,-D 选项告诉 MySQL 不要将我们恢复的内容记录回二进制日志。
要将时间点恢复到特定时间,例如 2016-02-16 10:30:
- 定位恢复应该停止的位置。
由于二进制日志中的事件是在事务开始时记录的,因此不应直接使用 -stop-datetime 选项,但可以使用它来更轻松地定位要停止的位置。
假设没有交易超过一分钟,我们可以使用以下内容:
mysqlbinlog --start-datetime='2016-02-16 10:29:00' --stop-datetime='2016-02-16 10:31:00' ./master-log.000006 | less -S
这假设我们使用的是安装了 less 命令的 Linux。
在其他平台上可以使用类似的东西。
- 确定位置(例如 123456)后,使用 -stop-position 选项停止在该位置重播二进制日志:
mysqlbinlog -D --stop-position=123456 ./master-log.000006 | mysql -uroot
我们应该至少有两个 MySQL 服务器二进制日志记录。
如果我们只有一个,并且它停止了,那么我们可能会出现间隙并且无法完全恢复数据。
我们需要保留二进制日志,尤其是在进行集群备份之后的二进制日志。
mysql.ndb_binlog_index 是一个 MyISAM 表。
如果我们正在清理它,请确保不要删除我们仍然需要的二进制日志条目。
再次说明,以上数据恢复只涉及MySQL Cluster,不涉及其他存储引擎。
1.获取集群的备份、二进制日志和mysql.ndb_binlog_index表
需要以下备份数据文件:
- 集群的在线备份 (http://dev.mysql.com/doc/refman/en/mysql-cluster-backup.html)。此备份必须在我们希望恢复到的时间点之前进行,我们无法恢复到创建集群备份之前的时间段。
- 使用 mysqldump 对 mysql.ndb_binlog_index 表进行逻辑备份(例如:mysqldump -u root -p mysql ndb_binlog_index >> /tmp/ndb_binlog_index.sql)——这可以在集群恢复之前的任何时间完成。
- 创建备份之前的二进制日志副本,直到我们希望恢复到的时间点。
2. 恢复集群备份
从备份恢复集群的第一步在 MySQL 手册(恢复 MySQL 集群备份)中有详细介绍。
对 ndb_restore 使用 -restore_epoch 选项很重要,以便恢复纪元数据。
这是为了在备份完成时轻松访问最后一个纪元。
例如,将备份 ID 为 1 的备份恢复到两个数据节点集群中,其中数据节点的节点 ID 为 1 和 2,步骤如下:
- 像这样恢复元数据:
ndb_restore --restore_epoch --backupid=1 --nodeid=1 -c mgmhost:1186 --restore_meta --disable-indexes
我们只需执行此操作一次。
- 接下来像这样恢复两个节点的数据:
ndb_restore --restore_epoch --backupid=1 --nodeid=1 -c mgmhost:1186 --restore_data --disable-indexes ndb_restore --restore_epoch --backupid=1 --nodeid=2 -c mgmhost:1186 --restore_data --disable-indexes
- 重建索引:
ndb_restore --restore_epoch --backupid=1 --nodeid=1 -c mgmhost:1186 --rebuild-indexes
这应该只为一个节点完成!
3.恢复ndb_binlog_index表
我们现在还必须从我们之前创建的备份中加载 mysql.ndb_binlog_index 表,例如:
mysql> source /tmp/ndb_binlog_index.sql
如果我们正在使用 MySQL 集群并希望在上次备份数据库后从特定时间点恢复数据,我们可以通过重播从上次备份到指定时间点的二进制日志条目来实现。
本文涉及的数据恢复仅涉及MySQL Cluster。
它不包括其他存储引擎。
涉及四个步骤。
请确保在单用户模式下执行这些步骤,以减少在恢复数据时更改数据的机会。
- 获取集群、二进制日志和 mysql.ndb_binlog_index 表的备份
- 恢复集群备份本身
- 恢复 ndb_binlog_index 表
- 确定哪个二进制日志开始重放和可选地停止。
请注意,此过程应该可以工作,但是我们可能会遇到架构更改不会触发 ndb_binlog_index 中的行的错误。
如果这样做,解决方法是启用 ndb_log_empty_epochs 。