目前我使用 mysqldump 进行备份,速度很慢,但还算可以。最大的问题是恢复数据库,这需要几天时间。转储大约有 7GB 压缩,所以这不是一个很小的数据库,但它不应该超出 mysql 的合理范围。
那么我还有什么其他选择?像 mysqlhotcopy 这样的工具就很完美了。
答案1
看看 Percona 的备份软件,它允许热备份并且完全免费。
答案2
如果您已--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;
在这种情况下,“干净的” .ibd 文件备份是满足以下要求的备份:
.ibd 文件中没有未提交的事务修改。
.ibd 文件中没有未合并的插入缓冲区条目。
清除操作已从 .ibd 文件中删除所有带删除标记的索引记录。
mysqld 已将 .ibd 文件的所有修改页面从缓冲池刷新到文件。
您可以使用以下方法制作一个干净的备份 .ibd 文件:
停止 mysqld 服务器的所有活动并提交所有事务。
等到 SHOW ENGINE INNODB STATUS 显示数据库中没有活动事务,并且 InnoDB 的主线程状态为 Waiting for server activity。然后就可以复制 .ibd 文件了。
制作 .ibd 文件的干净副本的另一种方法是使用商业 InnoDB 热备份工具
答案3
这是InnoDB/Oracle热备份工具,需要花钱。我从来没有用过,但我认为它的功能和宣传的一样。
就我个人而言,我LVM 快照我的 InnoDB 表,并从快照备份 - 在恢复时,看起来 InnoDB 发生了系统崩溃,它在启动时经历了正常的日志重放过程。我喜欢双管齐下的备份方法,所以我将常规的快照和不太rsync
频繁的备份结合起来mysqldump
(而且有时保留一个相当近期的 SQL 转储很方便)。
答案4
如果您有任何 MyISAM 表,我建议将它们更改为 InnoDB。以下是我使用的:
mysql -u root --password=<password> --database=db_name -B -N -e "SHOW TABLES" | awk '!/not_this_db/ && !/or_this_one/ && /^[a-z]/ {print "ALTER TABLE", $1, "ENGINE=INNODB;"}' | mysql -u root --password=<password> --database=db_name
您可以使用 awk 正则表达式排除和包含数据库,例如,在我上面的示例中,仅包含以小写字母开头的 dbs。这当然会在更改期间锁定表。
然后使用 xtrabackup 将整个数据库直接复制到另一台服务器,而无需锁定任何表或使用太多的磁盘 IO(设置 ssh rsa 密钥后):
innobackupex --throttle=500 --compress --stream=xbstream /doesntneedtoexist | ssh user@otherhost "xbstream -x -C /root/backup/"
然后您可以完全独立地执行应用日志步骤,并节省生产服务器上的磁盘空间、IO 和 CPU。