ndb居于时间点的恢复的原理是根据mysql cluster的备份和mysql的二进制日志相结合起来,恢复到最近的一次备份,然后用二进制日志进行最近备份到出问题的时间点的恢复!

注意这个恢复一定要在单用户模式下完成,避免因为用户访问造成数据的不一致!下面是恢复测试的详细过程!


建立测试的数据库和表

CREATE DATABASE zhang;

CREATE TABLE zhang (id INT,`name` VARCHAR(20),PRIMARY KEY(`id`))ENGINE=NDBCLUSTER;


插入测试数据

INSERT INTO zhang VALUES(1,'zhang1'),(2,'zhang2'),(3,'zhang3'),(4,'zhang4');


执行备份

start backup

再次插入几条数据(为了保持和正式环境尽可能接近,在插入数据中间穿插了flush logs操作!)

INSERT INTO zhang VALUES(5,'zhang5'),(6,'zhang6');

flush logs;

INSERT INTO zhang VALUES(7,'zhang7'),(8,'zhang8');


此时假设数据库挂掉了,需要进行恢复(恢复的时候只启动设置成单用户的mysqld节点):

采用初始化方式启动ndbd,ndbd --initial,注意如果用到表空间和undo日志文件,需要手工清除,因为初始化不会删除这些文件!

删除或者清空mysql.ndb_binlog_index表


恢复表结构

/usr/local/mysql/bin/ndb_restore -e  -c 192.168.3.221 -n 11 -b 1 -m --backup_path=/data/dbdata/BACKUP/BACKUP-1/

恢复ndb节点11、12上的数据

/usr/local/mysql/bin/ndb_restore -e  -c 192.168.3.221 -n 11 -b 1 -r --backup_path=/data/dbdata/BACKUP/BACKUP-1/

/usr/local/mysql/bin/ndb_restore -e  -c 192.168.3.221 -n 12 -b 1 -r --backup_path=/data/dbdata/BACKUP/BACKUP-1/


找一个mysqld节点,进入单用户模式

ENTER SINGLE USER MODE 21;


启动该mysqld节点,并登陆

找到最大的epoch的值

SELECT @LASTEPOCH:=MAX(epoch) FROM mysql.ndb_apply_status;


根据epoch的值,找到二进制日志的位置以及文件名

SELECT POSITION, @FIRSTFILE:=FILE

FROM mysql.ndb_binlog_index

WHERE epoch > @LASTEPOCH

ORDER BY epoch ASC

LIMIT 1;

结果为:

829 ./mysql-bin.000012


找出恢复的时候需要用到的除第一个日志文件以外的其他的二进制日志文件

SELECT DISTINCT File

FROM mysql.ndb_binlog_index

WHERE epoch > @LASTEPOCH

AND File <> @FIRSTFILE

ORDER BY File;

结果为:

./mysql-bin.000013


然后进行二进制日志的恢复:

mysqlbinlog -H --set-charset="utf8" -D --start-position=829 ./mysql-bin.000012 | grep -v "RELOAD DATABASE" |mysql -uroot -p123456 zhang

mysqlbinlog -H --set-charset="utf8" -D --stop-datetime="2011-07-04 10:30:00" ./mysql-bin.0000013 | grep -v "RELOAD DATABASE" |mysql -uroot -p123456 zhang

恢复完成后,退出单用户模式,并启动另外一个sql节点