Answers:
是。
设置复制到第二台计算机。当需要进行备份时,可以锁定辅助计算机,执行mysqlhotcopy或mysqldump,然后将其解锁。它会与您的主服务器保持同步,而您不必使主服务器脱机。
如果您不介意将写入I / O加倍,甚至可以在同一台计算机上执行此操作,但是理想情况下,您应该将其实时备份到第二台物理服务器,并根据需要进行快照备份不会打扰您的生产服务器。
从理论上讲,也可以使用已知状态和二进制日志来还原数据库。我从未做过,所以请先进行调查,但是您可以备份数据库的已知状态,然后仅备份所有新的binlog并在需要恢复时重播它们。由于二进制日志是线性编写的,因此将新二进制日志同步到远程计算机将非常快。
编辑:确实,似乎记录了使用binlog进行备份。
这个问题是高度相关的
请原谅我假设操作系统是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
这将使您无需添加从属服务器即可进行每晚备份。我非常支持为高可用性使用从属服务器,但是我不希望您认为在创建该从属服务器之前您会陷入困境。
您不希望在生产系统上定期(甚至半定期)执行带读锁的刷新表。它应该只是最后的选择。
设置至少两个复制从属设备(当然,这将需要带有读取锁的FLUSH TABLES)。设置好后,您可以取下一个备份,而另一个作为备用主数据库保持同步。
另外,如果您的一个从属服务器发生故障,则可以使用该快照中的快照来重建第二个(或第三个)从属服务器。如果所有从属都失败,则返回到带读锁的刷新表。
请记住,始终要有一个定期检查数据是否同步的过程-使用mk-table-checksum之类的方法来完成(这很简单,请查阅Maatkit文档以获取详细信息)。
由于22 GB相对较小,因此您将没有任何问题。使用大型数据库进行操作可能会遇到更多问题。
如上所述,这里的解决方案是双重的:
请注意,如果您对表使用InnoDB,则可以使用--single-transaction标志来避免必须进行任何表锁定,并且即使在主数据库上,也可以获得一致的数据库转储,因此无需拆除服务器。但是,上述解决方案是更好的解决方案。
另外,如果在Linux上使用LVM,则可以为分区创建LVM快照,然后进行备份。LVM快照是原子性的,因此,如果您执行“使用读取锁刷新表”,然后进行快照和解锁,您将获得一致的快照。
如果您担心I / O争用使转储花费太长时间,则可以添加第三台计算机并在网络上运行mysqldump以避免损坏磁盘。
看看“ 备份生产MySQL数据库的最佳实践? ”。这是关于Stack Overflow的类似文章。