今天我有一个非常好的想法来备份我的数据库:将转储文件放在git存储库中,然后在每个转储上提交,以便我有最新的副本,但可以轻松回滚到任何以前的备份。我还可以定期轻松地提取存储库的副本,以便将副本作为备份的备份保存在我自己的计算机上。这听起来很聪明。
然而,我知道聪明的解决方案有时会有根本的缺陷。我可以在git中存储mysqldump差异的哪些问题?这值得么?为了在服务器上进行多个数据库备份并在其他地方保留冗余副本,大多数人会怎么做?
答案 0 :(得分:12)
通常,您不会永久保留每个备份(或快照)。 git存储库会保留您进行的每次检查。如果你决定修改旧的修订版(比如每月修订一次,一年一次,一个月一次,等等),你将不得不用git filter-branch
来修改整个历史记录。然后git gc
删除不需要的修订。
鉴于git的优势在于分布式版本控制和复杂的补丁/分支工作流程(两者都不适用于快照或备份),我会考虑使用具有更具延展性的不同VCS。
答案 1 :(得分:5)
这种方法听起来不错。我使用Git来备份我自己的重要数据。
请注意,您没有存储差异--Git会在每次提交时有效地存储目录状态的快照。您可以生成两个提交的差异,但实际的存储机制与差异无关。
答案 2 :(得分:3)
理论上这可行,但是当数据库转储变大时,您将开始遇到问题。
Git没有任何硬文件大小限制,但它将使用先前存储在存储库中的内容来区分最新转储的内容,这将至少需要与添加的这两个文件的大小一样多的内存在一起 - 所以我想它会开始变得非常慢,文件超过100MB(甚至10MB)非常快。
Git不是用于处理这种类型的文件(即大数据文件而不是源代码),所以我认为这基本上是一个坏主意。但是,你可以使用像Dropbox这样的东西来存储转储 - 这仍然可以为你保存版本历史记录,但更适合于无法有效区分的文件。
答案 3 :(得分:1)
如果您正在使用MySQL(可能还有其他人)并启用了二进制日志记录,您可以考虑为bin日志的目录设置一个git repo,并制定策略以定期提交binlog的更新。
在MySQL中,binlog存储将数据更改为数据库中任何表的查询。如果将提交与数据库的常规转储同步,则应该采用版本化的方式来恢复数据。
老实说,我认为使用MySQL的原生工具可能是一个更好的解决方案,但是我在这里概述的内容可以让你对MySQL数据进行版本控制,这是我认为你首先想到的。