InnoDB有没有等价的mysqlhotcopy?

目前我正在使用mysqldump进行备份,这是慢的,但好。 最大的问题是恢复数据库,这需要几天的时间。 转储是大约7GB gzipped,所以它不是一个小数据库,但它不应该超出合理的范围与MySQL。

那么我的其他select是什么? 像mysqlhotcopy的东西将是完美的。

看看Percona的Xtrabackup ,它允许热备份,而且完全免费。

如果启用了--innodb_file_per_table ,则可以将.ibd文件和关联的表从一个数据库移动到另一个数据库,请使用RENAME TABLE语句:

 RENAME TABLE db1.tbl_name TO db2.tbl_name; 

如果您有一个.ibd文件的“干净的”备份,您可以将其恢复到源文件所在的MySQL安装,如下所示:

发出这个ALTER TABLE语句来删除当前的.ibd文件:

 ALTER TABLE tbl_name DISCARD TABLESPACE; 

将备份.ibd文件复制到适当的数据库目录。

发出这个ALTER TABLE语句来告诉InnoDB为表使用新的.ibd文件:

 ALTER TABLE tbl_name IMPORT TABLESPACE; 

在这种情况下,“clean”.ibd文件备份是满足以下要求的备份:

.ibd文件中的交易没有未提交的修改。

.ibd文件中没有未合并的插入缓冲区条目。

清除已从.ibd文件中删除所有删除标记的索引logging。

mysqld已将.ibd文件的所有修改页面从缓冲池刷新到文件中。

您可以使用以下方法创build干净的备份.ibd文件:

停止mysqld服务器的所有活动并提交所有事务。

等到SHOW ENGINE INNODB STATUS显示数据库中没有活动事务,并且InnoDB的主线程状态为等待服务器活动。 然后你可以制作一个.ibd文件的副本。

制作.ibd文件的另一种方法是使用商业InnoDB热备份工具

有InnoDB / Oracle热备份工具 ,这需要花钱。 我从来没有用过它,但我认为它是这样做的。

就我个人而言,我使用InnoDB表的LVM快照 ,并从快照进行备份 – 恢复时,InnoDB看起来像是系统崩溃,它在启动时会经历正常的日志重放过程。 我喜欢皮带和护腕的备份方式,所以我将常规的快照和rsync与较不频繁的mysqldump组合在一起(有时在最近有一个相当近的SQL转储很方便)。

而不是一个转储/恢复解决scheme,我怀疑我知道为什么目前的恢复是这么长的。

我们有一些相当大的数据库(高达40GB),我已经恢复了一个小时的大小。

在还原过程中,mysqldump将使插入更快的一件事是closures索引,运行所有插入,然后将索引应用到表中。

如果一对mysqlvariables不够大,mysql会说它是“通过键caching修复”或类似的东西…这是非常非常慢的。

如果将正确的variables设置得足够大,就会说“通过sorting修复”,这要快得多。

我记不清头顶上的确切variables,但如果听起来可能如此,请在评论中告诉我,我可以看看是否可以追踪细节。

正如Nick所说,Percona的Xtrabackup绝对值得一看。

如果你有任何MyISAM表,我会build议把它们改成InnoDB。 以下是我使用的:

  mysql -u root --password=<password> --database=db_name -B -N -e "SHOW TABLES" | awk '!/not_this_db/ && !/or_this_one/ && /^[az]/ {print "ALTER TABLE", $1, "ENGINE=INNODB;"}' | mysql -u root --password=<password> --database=db_name 

您可以使用awk正则expression式排除和包含数据库,例如上面的示例中只有以小写字母开头的dbs。 这当然会在更改期间locking表格。

然后使用xtrabackup将整个数据库直接复制到另一台服务器,而不locking任何表或使用太多的磁盘IO(设置ssh rsa键之后):

 innobackupex --throttle=500 --compress --stream=xbstream /doesntneedtoexist | ssh user@otherhost "xbstream -x -C /root/backup/" 

然后您可以将应用程序日志步骤完全分开,并节省生产服务器上的磁盘空间,IO和CPU。

Percona的HowTO使用xtrabackup

如果您使用的是InnoDB,那么您可以configuration许多参数以获得更好的性能。 如果使用InnoDB,那么对于你的innodb_file_per_table非常小的情况,它是安静的。 将此参数的大小增加至至less50%,并检查恢复所需的时间。

除此之外,你可以增加innodb_thread_concurrency参数。

也试试Percona xtrabackup。 我使用它为我的TB的TB,这完美的作品。

我已经为mysql_manager ruby​​gem添加了对hotcopies的支持,但是它只支持整个mysql目录的hotcopies。 它通过首先做重复rsyncs没有表locking,直到同步持续时间是可以容忍的,然后获得一个锁使用FLUSH TABLES WITH READ LOCK在做一个最终的rsync之前。 由于它使用的是rsync,它也支持远程主机。

用法很简单。

首先安装gem。

 gem install mysql_manager 

这是你如何运行它。

 mysql-manager --hotcopy \ --hotcopy:data-dir /var/lib/mysql/ \ --hotcopy:backup-dir [email protected]:/tmp/mysql/ \ --hotcopy:rsync-args "-av --exclude=*.err" \ --hotcopy:rsync-ttl 30 \ --db:user root \ --db:pass $MYSQL_ROOT_PASSWORD