每天备份一个22 GB的MySQL数据库

现在我可以使用mysqldump进行备份。 但是我必须取下networking服务器,大约需要5分钟的时间做备份。 如果我不把networking服务器取下来,这将需要永远的时间,永远不会完成+在备份过程中网站变得不可访问。

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

所有的表都是MyISAM。

是。

设置复制到第二台机器。 当你需要做备份时,你可以locking辅助机器,执行mysqlhotcopy或mysqldump,然后解锁它。 它会追上你的主人,你不必把主人离线。

你甚至可以在同一台机器上这样做,如果你不介意把写入I / O翻一番,但理想情况下你应该实时备份到第二个物理服务器上,并根据需要随时进行快照备份而不会干扰您的生产服务器。

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

编辑:确实,它看起来像使用binlogs备份logging。

这个问题是高度相关的

请原谅我的操作系统是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 

这将使您无需添加从服务器即可进行夜间备份。 我非常赞成有一个高可用性的从属服务器,但我不想让你觉得自己被困住了,直到你可以创build这个从属。

带有读锁的冲刷表不是您想要在生产系统上定期(甚至半定期)执行的操作。 这应该是最后的手段。

设置至less两个复制从站(当然,这将需要FLUSH TABLES WITH READ LOCK)。 一旦build立起来,就可以从另一个备份中取出一个备份,而另一个作为备用主备份保持同步。

另外,如果其中一个从站发生故障,您可以使用该快照重build第二个(或第三个)从站。 如果你所有的奴隶都失败了,你可以回到FLUSH TABLES WITH READ LOCK。

记住永远有一个定期检查数据是否同步的过程 – 使用像mk-table-checksum这样的操作(这是非常简单的设置,详情请参阅Maatkit文档)。

由于22 GB是相对较小,这样做你会没有问题。 做一个大型数据库可能会更成问题。

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

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

请注意,如果对表使用InnoDB,则可以使用–single-transaction标志来避免执行任何表锁,即使在主服务器上也可以获得数据库的一致转储,因此无需执行备份取下服务器。 但是,上述解决scheme是一个更好的解决scheme。

另外,如果您在Linux上使用LVM,则可以获取该分区的LVM快照,然后将其恢复。 LVM快照是primefaces的,所以如果你用'读取locking'来刷新表格,然后把你的快照和解锁,你会得到一个一致的快照。

如果担心I / O争用导致转储时间过长,则可以添加第三台计算机并通过networking运行mysqldump以避免抖动磁盘。

你可以做一个渐进的备份。 每小时备份1/24的logging。 这种方法唯一的问题是,如果它在一天的头几个小时内崩溃,那么从那个时候到崩溃时间,你将失去任何东西。 无论哪种方式,不到24小时的logging丢失(我不知道这对你有多重要)。

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

  1. FLUSH TABLES WITH READ LOCK;
  2. 拉取数据库和日志文件系统的快照。
  3. UNLOCK TABLES;
  4. 在闲暇时将您的数据文件复制到快照中。

使用InnoDB表,你需要运行SET AUTOCOMMIT=0; 在执行读锁之前。

看看“ 备份生产MySQL数据库的最佳做法? ”。 这是堆栈溢出一个类似的post。