使用innobackupex 备份数据库后,测试恢复。
恢复的时候报错如下:
140517 10:17:34 InnoDB: Error: page 0 log sequence number 11389633900
InnoDB: is in the future! Current system log sequence number 2386370804.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.
无法恢复,在my.cnf中加入:
innodb_force_recovery = 4
innodb_purge_thread = 0
在用--apply-log 恢复redo log 可以,但是启动的时候还是报如上错误,lsn 无法对齐。
在 http://dba.stackexchange.com/questions/8011/any-better-way-out-of-mysql-innodb-log-in-the-future 找到一解决方案。如下:
vi junk.pl
#!/usr/bin/perl
use DBI;
$table = shift || die;
$dbh = DBI->connect("DBI:mysql:junk:host=localhost", "root", "password"); #Edit "junk" (DB name), user, and pass to suit.
$dbh->do("DROP TABLE IF EXISTS $table");
$dbh->do("CREATE TABLE $table (str TEXT) ENGINE=INNODB");
$sth = $dbh->prepare("INSERT INTO $table (str) VALUES (REPEAT(?,100000))");
foreach (1..50) { ###因为我的日志差距比较大,调整到500000000
$sth->execute('0123456789');
}
$dbh->do("DELETE FROM $table");
mysql> create database junk;
mysql>exit
perl junk.pl data1 ##建一张data1表插入数据
perl junk.pl data2 ##建一张data2 表插入数据
perl junk.pl data3 ##建一张data3 表插入数据
起三个进成同时跑,如果不够,可以再起一个。最后插入了接近40G的数据,终于追赶上了lsn。
查看lsn 变化:
echo "SHOW engine INNODB STATUS \G" | mysql -S /tmp/mysql.sock -uroot -p'' | grep '^Log seq'
等大于11389633900 后结束掉 perl junk.pl ,然后重启mysql 一切正常。世界又安静了。
后记:这个错误我在恢复其他数据库的时候没有任何问题。唯独另外一个环境的db备份恢复就会有问题,我试着用mysqldump 导出备份,结果报错,一些视图说root 用户没有权限。奇诡的问题,root 怎么怎么没有权限呢?再观察测试一下。