Que*_*low 6 mysql backup snapshot
我想备份我的网站,其中包含用户上传的图像和存储在 MySQL 数据库中的数据,以便它们在任何特定时间点始终保持一致。在寻找解决方案时,我发现这个应用程序 rsnapshot 可能适合该任务。在互联网上浏览了一些博客后,我意识到这实际上是使用 mysqldump 方法通过 backup_script 完成的:
backup_script ssh root@example.com "mysqldump -A > /var/db/dump/mysql.sql" unused2
backup root@example.com:/var/db/dump/ example.com/
Run Code Online (Sandbox Code Playgroud)
我不确定的是是否有必要在脚本中执行转储之前用读锁刷新所有表以确保数据库的一致性。如果是这样,这应该如何纳入?如果没有,为什么没有必要?
默认情况下,您的使用mysqldump
将锁定每个表,因为它转储它并且表之间不会有任何一致性。您也不会备份任何触发器、存储过程、存储函数或事件,并且如果您的任何视图定义无效(引用自定义视图以来您可能已删除或重命名的不存在的表或列),转储遇到该错误时,进程将终止。
如果您的所有表都是 InnoDB,您可以通过添加以下内容来获得一致的快照:
--single-transaction
Run Code Online (Sandbox Code Playgroud)
此选项禁用默认值--lock-tables
,它在转储时锁定每个表,然后在完成转储后将其解锁,并在转储开始时向服务器发出以下语句(您可以通过启用常规查询日志来观察):
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION WITH CONSISTENT SNAPSHOT;
Run Code Online (Sandbox Code Playgroud)
当然,这只对 InnoDB 有帮助。如果您的表是 MyISAM 或任何其他非事务性引擎,则您只有一种选择:
--lock-all-tables
Run Code Online (Sandbox Code Playgroud)
...锁定整个转储的所有表,因为这是在没有事务协助的情况下确保一致性的唯一方法。
要备份您的存储过程、事件和触发器,请添加:
--routines --events --triggers
Run Code Online (Sandbox Code Playgroud)
防止mysqldump
在视图定义无效时失败
--force
Run Code Online (Sandbox Code Playgroud)
要捕获您的 binlog 位置并将其存储在备份文件中,请添加:
--master-data=2
Run Code Online (Sandbox Code Playgroud)
如果您的机器不是从设备,则此选项不起作用。
您的问题是关于“使用 rsnapshot”备份数据库,尽管为了说明这一点,您建议使用 mysqldump 备份数据库,然后使用 rsnapshot 备份转储文件......从简短的观察很难分辨在他们的网站上,这是否是一个不错的选择,因为 rsnapshot 似乎具有文件级粒度。它似乎不存储差异,而是存储在备份周期之间更改的“每个”文件的完整文件:
“所需的空间量大约是一个完整备份的大小,加上更改的每个附加文件的副本。” -- http://www.rsnapshot.org/rsnapshot.html
如果我在这一点上错了,我欢迎纠正。在这种情况下,您只有 1 个文件,即来自 mysqldump 的转储文件,当然每次都会更改。
无论您做什么,都不要考虑尝试备份 MySQL 中表下的实际文件(.frm、.ibd、.MYD 等)。即使在极少数情况下,您可能会获得似乎完整的备份,但在服务器运行时这不起作用。不是。
更新:
mylvmbackup正在执行的操作与“备份实际文件”之间存在重要区别。要使用 mylvmbackup,您必须使用LVM,它可以可视化为文件系统和硬盘驱动器之间的抽象层。使用 LVM,您可以冻结文件系统并制作整个文件系统的时间点快照。
它看起来像mylvmbackup是做了FLUSH TABLES
之后是FLUSH TABLES WITH READ LOCK
之前查找所述复制坐标(如果在配置中指定),这是相同的处理的mysqldump并当--single-transaction
和--master-data
两者都使用。这稳定了 MySQL 但它并没有完全停顿 InnoDB,所以当像这样的备份恢复时,InnoDB 会认为它崩溃了并会进行崩溃恢复......但它应该是一个干净的恢复。
如果您网站的数据文件在同一个文件系统中,那么 LVM 快照将包含与单个时间点一致的所有内容,但是将您的其他网站文件放在与数据库相同的文件系统中是否是一种好习惯(如果确实在运行您的 Web 服务器在同一台服务器上是一种很好的做法)是另一个讨论。
无论采用哪种方法,在任何备份策略中,定期验证您的备份是否可以实际恢复(在不同的机器上)都至关重要。真正最安全的方法是确定innodb_fast_shutdown
= 0 并实际关闭 MySQL,但这可能不切实际。
当然,如果你想要像 rsnapshot 这样的东西,你总是可以对网站文件进行快照,然后对数据库进行快照,然后再次对网站文件进行快照。如果在备份数据库时站点文件中没有任何更改,rsnapshot 将在第二次运行时使用很少的空间。如果情况确实发生了变化,如果您需要恢复,了解差异应该是相当简单的。
归档时间: |
|
查看次数: |
5102 次 |
最近记录: |