每天备份 22 GB 的 MySQL 数据库

每天备份 22 GB 的 MySQL 数据库

现在我可以使用 mysqldump 进行备份。但我必须关闭 Web 服务器,而且备份大约需要 5 分钟。如果我不关闭 Web 服务器,备份将需要很长时间,而且永远无法完成,并且网站在备份期间无法访问。

有没有更快/更好的方法来备份我的 22 GB 且不断增长的数据库?

所有表都是 MyISAM。

答案1

是的。

设置复制到第二台机器。当您需要进行备份时,您可以锁定辅助机器,执行 mysqlhotcopy 或 mysqldump,然后将其解锁。它将与您的主服务器同步,您永远不必让主服务器脱机。

如果您不介意加倍写入 I/O,您甚至可以在同一台机器上执行此操作,但理想情况下您应该将其实时备份到第二台物理服务器,并根据需要经常进行快照备份,而不会干扰生产服务器。

理论上,使用已知状态和 binlog 恢复数据库也是可能的。我从未这样做过,所以请先调查一下,但您可以备份数据库的已知状态,然后只需备份所有新的 binlog 并在需要恢复时重播它们。由于 binlog 是线性写入的,因此将新的 binlog rsync 到远程计算机会非常快。

编辑:确实,使用 binlogs 进行备份看起来是有记录的。

这个问题与

答案2

请原谅我假设操作系统是 Linux。如果您没有使用 LVM,那么您应该使用。如果您正在使用,这里有一个非常简单的方法可以通过快照进行备份。

# Define these vars to meet your needs. These meet mine.
lvol="/dev/VolGroup03/lvol0"
snap_name="nightly_snapshot"
snap_vol="$(dirname $lvol)/$snap_name"
snap_path="/mnt/$snap_name"
snap_size="10g" # Not the size of your data, anticipated data changes during the backup
backup_path="/backups/$snap_name"

/usr/bin/time -f 'Databases were locked for %E' -- \
mysql <<- MYSQL
# based on http://pointyhair.com/tiki-view_blog_post.php?blogId=1&postId=5
FLUSH TABLES WITH READ LOCK;
\! lvcreate --size $snap_size --snapshot --name $snap_name $lvol
UNLOCK TABLES;
MYSQL
mount $snap_vol $snap_path
rsync -av --delete $snap_path/mysql $backup_path/
umount $snap_path
lvremove -f $snap_vol

这样您就可以进行夜间备份,而无需添加从属服务器。我非常赞成使用从属服务器来实现高可用性,但我不想让您觉得在创建该从属服务器之前您无能为力。

答案3

在生产系统中,您不会定期(甚至半定期)执行 FLUSH TABLES WITH READ LOCK 操作。这应该是最后的手段。

设置至少两个复制从属服务器(当然,这需要 FLUSH TABLES WITH READ LOCK)。设置完成后,您可以从其中一个服务器中获取备份,而另一个服务器作为备用主服务器保持同步。

此外,如果其中一个从服务器发生故障,您可以使用该从服务器的快照重建第二个(或第三个)从服务器。如果所有从服务器都发生故障,您将返回到 FLUSH TABLES WITH READ LOCK。

请记住始终有一个定期检查数据是否同步的过程 - 使用类似 mk-table-checksum 的工具来执行此操作(设置起来并不容易,有关详细信息,请参阅 Maatkit 文档)。

由于 22 GB 相对较小,因此执行此操作不会有问题。使用大型数据库执行此操作可能会更麻烦。

答案4

根据您的环境,快照通常是一种很好的方法。特别是如果您出于某种原因必须备份主服务器。我们运行主服务器和从服务器对,并在两者上使用快照备份。

  1. FLUSH TABLES WITH READ LOCK;
  2. 提取数据库和日志文件系统上的快照。
  3. UNLOCK TABLES;
  4. 随意从快照中复制数据文件。

对于 InnoDB 表,您需要SET AUTOCOMMIT=0;在执行读取锁之前运行。

相关内容