预算有限,无停机时间的 MySQL 备份

预算有限,无停机时间的 MySQL 备份

我当前的 MySQL 备份方案是将我们的数据库复制到第二台服务器,并在该服务器上运行 mysqldump,以消除表或行锁定造成的任何停机时间。这种方法效果很好,但第二台服务器每月的费用为 150 美元(澳大利亚的托管费用比美国贵很多。)

我在这里看到了很多关于这个问题的问题,大多数人都需要有关计划备份之类的帮助,而我不需要。我需要 mysqldump(最好每 4 小时一次),并且不能停机。数据库未压缩时大约有 7GB,因此 mysqldump 可能需要一些时间,具体取决于服务器。

我考虑过复制到同一台机器,但我不想让从属服务器占用大量内存。我不确定是否可以限制每个数据库的内存使用量?无论哪种方式,这都会在服务器转储数据库时增加负载。

我刚刚读到http://www.zmanda.com/quick-mysql-backup.html而且看起来不错,每年 300 美元就可以了,为我节省了很多钱。

不幸的是,我无法复制到亚马逊的 RDS,但我可以复制到微型 RC2 实例,但复制将通过网络进行,ping 时间约为 220 毫秒。

我看到这里有一些人谈论 LVM 快照,这可能是一个不错的选择。但我对这个选项了解不多。

欢迎提出意见。

答案1

如果你使用 innodb 表,你可以使用

http://www.percona.com/docs/wiki/percona-xtrabackup:start

这将转储您的数据库,并且可以通过他们的工具导入,而无需锁定。我相信如果您有 myisam 表,它会锁定这些表。

答案2

如果你正在使用 innodb 或其他完全事务性的后端,则可以使用mysqldump --single-transaction ...。我已经在相当大的(~100GB)数据库上使用过它,效果很好;如果数据库负载很重,它可能需要小时但它确实可以在不锁定表的情况下工作。复制通常更好,但有时您需要一个好的可靠的转储文件。请记住,您也可以转储 mysql 复制从属。

从 mysqldump 页面(请注意有关将泄漏到事务中的操作的警告):

 ·   --single-transaction

   This option sends a START TRANSACTION SQL statement to the server
   before dumping data. It is useful only with transactional tables
   such as InnoDB, because then it dumps the consistent state of the
   database at the time when BEGIN was issued without blocking any
   applications.

   When using this option, you should keep in mind that only InnoDB
   tables are dumped in a consistent state. For example, any MyISAM or
   MEMORY tables dumped while using this option may still change
   state.

   While a --single-transaction dump is in process, to ensure a valid
   dump file (correct table contents and binary log coordinates), no
   other connection should use the following statements: ALTER TABLE,
   CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE. A
   consistent read is not isolated from those statements, so use of
   them on a table to be dumped can cause the SELECT that is performed
   by mysqldump to retrieve the table contents to obtain incorrect
   contents or fail.

答案3

我认为通过高延迟连接复制到美国的廉价 VPS 不会有什么问题。高延迟实际上不应该是一个大问题。复制旨在即使从服务器宕机也能快速赶上小时后面,即可以异步操作。

只要您的澳大利亚托管计划能够承受那么多的传出带宽。

以下是关于高延迟是否重要的​​更详细回答

答案4

我不确定是否可以限制每个数据库的内存使用量

当然可以 - 你只需要使用不同的 /etc/my.cnf 运行从属服务器

您甚至可以使用 nice/renice 和 taskset 来操纵主服务器和从服务器上的调度优先级/CPU 亲和性(假设它是 Linux 服务器)。

但复制将通过网络进行,ping 时间约为 220 毫秒

延迟几乎无关紧要 - 重要的是带宽 - 并且数据库带宽(假设您不复制会话数据)比 HTTP 带宽小几个数量级。

我需要 [创建数据库的一致备份](最好每 4 小时一次),并且不能停机

但是您所讨论的策略不允许在那时进行任何恢复。

我认为最便宜的选择是在同一个机器上安装一个从属服务器 - 如果它对性能产生不利影响,超出了您可以重新配置的范围,那么就升级当前的托管包。

您也可以考虑运行一个断开连接的从属服务器:在当前服务器上启用 bin 日志。获取备份,在本地计算机上恢复备份,然后在 bin 日志轮换时将其复制下来,然后在本地 DBMS 上前滚

相关内容