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節點