用Git备份数据库 - 一个好主意?

Ass*_*vie 12 git postgresql backup

我看到它将PostgeSQL数据库转储到一个大的SQL文件然后提交并推送到远程Git仓库的方式可能是一个了不起的备份解决方案:我获得了所有版本的历史记录,哈希,安全传输,单向(真的很难)通过推送,高效存储(假设没有二进制文件)并且没有新图像破坏备份的可能性(这是rsync的风险)来搞乱和删除数据.

有没有人使用过这种方法,尤其是pg,可以分享他/她的经验吗?陷阱?

Tom*_*rae 13

以下是有关如何为postgres执行此操作的完整脚本详细信息.

创建备份用户

这些脚本假定存在一个名为"backup"的用户,该用户可以访问所有(超级用户)或特定数据库.凭据存储在主目录中的.pgpass文件中.该文件看起来像这样(假设密码是'秘密').

〜/ .pgpass

*:*:*:backup:secret
Run Code Online (Sandbox Code Playgroud)

确保在.pgpass上设置正确的安全性,否则将被忽略

chmod 0600 ~/.pgpass
Run Code Online (Sandbox Code Playgroud)

备份单个数据库

这会转储特定的数据库.

backup.sh

pg_dump dbname -U backup > backup.sql
git add .
git commit -m "backup"
git push origin master
Run Code Online (Sandbox Code Playgroud)

注意:您可能不希望对数据库转储使用任何文件拆分选项,因为任何插入/删除都会导致"多米诺"效果并更改所有文件,从而在git中创建更多的增量/更改.

备份此计算机上的所有数据库

此脚本将转储整个数据库集群(所有数据库):

pg_dumpall -U backup > backup.sql
git add .
git commit -m "backup"
git push origin master
Run Code Online (Sandbox Code Playgroud)

注意:您可能不希望对数据库转储使用任何文件拆分选项,因为任何插入/删除都会导致"多米诺"效果并更改所有文件,从而在git中创建更多的增量/更改.

安排它运行

最后一步是将其添加到cron作业中.所以,'crontab -e'然后添加如下内容(每天午夜运行)

# m h  dom mon dow   command
# run postgres backup to git
0 0 * * * /home/ubuntu/backupdbtogit/backup.sh
Run Code Online (Sandbox Code Playgroud)

恢复

如果需要还原数据库,则需要签出要还原的版本,然后传递给pg.(有关详细信息,请访问http://www.postgresql.org/docs/8.1/static/backup.html#BACKUP-DUMP-RESTORE)

对于单个数据库:

psql dbname < infile    
Run Code Online (Sandbox Code Playgroud)

对于整个集群

psql -f infile postgres
Run Code Online (Sandbox Code Playgroud)

这些都不是特别复杂,但是查找所有部件总是很乏味.


在RAM有限的服务器上崩溃

我遇到了git在推送时失败的问题.这是由于git使用了大量内存 - 几个提交已备份.我通过在我的本地计算机(具有足够的RAM)上安装服务器git repo来解决了这个问题.我使用sshfs挂载服务器磁盘,然后从我的工作站计算机提交.在我这样做之后,低内存服务器恢复提交没有问题.

一个更好的选择是在包中限制git的内存使用(来自有没有办法限制"git gc"使用的内存量?).

git config --global pack.windowMemory "100m"
git config --global pack.packSizeLimit "100m"
git config --global pack.threads "1"
Run Code Online (Sandbox Code Playgroud)

注意:我还没有尝试设置内存限制,因为我没有再次遇到推送失败问题.


Pet*_*aut 5

通常,您应该使用备份工具进行备份,并使用版本控制工具进行版本控制。它们是相似的,但不相同。

有人将两者混为一谈,例如,实质上数据库中的任何内容都是版本,这不一定是错误的,但要清楚您想要的是什么。

如果您只是在谈论架构,那么使用Git进行“备份”可能不会做很多错误。但是,如果您要备份数据,则事情可能会变得复杂。大文件的Git并不是很好。您可以使用诸如git-annex之类的方法来解决此问题,但是随后您需要一个单独的备份机制来创建外部文件。同样,使用“适当的”备份方法(例如pg_dump或WAL归档)还具有其他优点,例如能够还原数据库的子集或进行时间点恢复。

您可能还希望备份操作系统的其他部分。你是怎样做的?最好不要使用版本控制系统,因为它们不能很好地保留文件权限,时间戳和特殊文件。因此,将数据库备份绑定到现有的备份系统会很有意义。


man*_*lds 4

我肯定会推荐它。人们也一直在这样做,主要是围绕 MySQL,但我认为没有太大区别:

http://www.viget.com/extend/backup-your-database-in-git/

另一种方法是使用 ZFS 快照进行备份。

http://www.makingitscale.com/2010/using-zfs-for-fast-mysql-database-backups.html