每天备份22 GB的MySQL数据库


28

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

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

所有表都是MyISAM。


看看这个链接,它是一个类似的问题 serverfault.com/questions/8044/backup-mysql-server
Charles Faiga 09年

Answers:


28

是。

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

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

从理论上讲,也可以使用已知状态和二进制日志来还原数据库。我从未做过,所以请先进行调查,但是您可以备份数据库的已知状态,然后仅备份所有新的binlog并在需要恢复时重播它们。由于二进制日志是线性编写的,因此将新二进制日志同步到远程计算机将非常快。

编辑:确实,似乎记录了使用binlog进行备份。

这个问题是高度相关的


是的,这很好用,这将是我的答案。唯一的主要缺点是您需要确保复制每天正常工作。我们在工作时间内为从属数据库创建快照,并从主数据库进行每晚备份。

5

请原谅我假设操作系统是Linux。如果您不使用LVM,应该使用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

这将使您无需添加从属服务器即可进行每晚备份。我非常支持为高可用性使用从属服务器,但是我不希望您认为在创建该从属服务器之前您会陷入困境。


2

您不希望在生产系统上定期(甚至半定期)执行带读锁的刷新表。它应该只是最后的选择。

设置至少两个复制从属设备(当然,这将需要带有读取锁的FLUSH TABLES)。设置好后,您可以取下一个备份,而另一个作为备用主数据库保持同步。

另外,如果您的一个从属服务器发生故障,则可以使用该快照中的快照来重建第二个(或第三个)从属服务器。如果所有从属都失败,则返回到带读锁的刷新表。

请记住,始终要有一个定期检查数据是否同步的过程-使用mk-table-checksum之类的方法来完成(这很简单,请查阅Maatkit文档以获取详细信息)。

由于22 GB相对较小,因此您将没有任何问题。使用大型数据库进行操作可能会遇到更多问题。


1

如上所述,这里的解决方案是双重的:

  1. 设置服务器到从属服务器的复制,您可以使该服务器脱机。最好的方法是使用mysqldump和--master-data参数对数据库进行转储。
  2. 在从属服务器上设置每晚备份。您可以使用--master-data --flush-logs和--single-transaction标志使用mysqldump,也可以停止mysql服务器,将数据文件复制到磁盘上,然后重新启动(复制将在它停止了)。
  3. 每隔(例如5、10、20分钟)在从属服务器上运行一个脚本,以检查并确保mysql仍在复制。我编写了一个简单的python脚本来做到这一点,欢迎您使用。

请注意,如果您对表使用InnoDB,则可以使用--single-transaction标志来避免必须进行任何表锁定,并且即使在主数据库上,也可以获得一致的数据库转储,因此无需拆除服务器。但是,上述解决方案是更好的解决方案。

另外,如果在Linux上使用LVM,则可以为分区创建LVM快照,然后进行备份。LVM快照是原子性的,因此,如果您执行“使用读取锁刷新表”,然后进行快照和解锁,您将获得一致的快照。

如果您担心I / O争用使转储花费太长时间,则可以添加第三台计算机并在网络上运行mysqldump以避免损坏磁盘。


0

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

  1. FLUSH TABLES WITH READ LOCK;
  2. 在数据库和日志文件系统上提取快照。
  3. UNLOCK TABLES;
  4. 您可以根据需要从快照中复制数据文件。

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



-1

您可以进行逐步备份。每小时备份记录的1/24。这种方法的唯一问题是,如果它在一天的头几个小时内崩溃,那么从那段时间到崩溃的时间,您将丢失任何东西。无论哪种方式,丢失的记录都少于24小时(我不知道这对您有多重要)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.