目前我正在使用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 rubygem添加了对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