如何自动更新我的数据库每晚

目前,每天开始工作之前,我完成以下程序:

  • SSH到生产服务器
  • gzip我们的日常数据库转储文件
  • scp gzip转储文件到我的电脑
  • gunzip转储文件
  • dropdb mydatabase
  • createdb mydatabase
  • psql mydatabase <dump.sql

是否有可能(我确定这是)在Mac OSX上自动执行此过程? 这样做是在我早上上class的时候完成的。 如果是这样,最快最简单的方法是什么?

要允许sshlogin到您的生产服务器而不input密码,您需要设置一些非交互式身份validation(如果尚未设置)。
http://www.walkernews.net/2008/06/06/how-to-setup-non-interactive-ssh-login/
http://troy.jdmz.net/rsync/index.html

那么基本上就是把每个步骤的命令添加到一个shell脚本,并设置cron来每天早上运行这个shell脚本。

是的 – 脚本,并从您的服务器安排gzip / scp(或更好的,使rsync)部分。 如果这也是MacOS,我不确定详细的步骤是什么,但这是你想要的大纲。

然后,如果你知道它总是会在一定的时间内完成的话,那么只需要在你的计算机上安排一个脚本gunzip / dropdb / createdb / psql。 如果并不总是在同一时间完成,那么你可以通过检查文件状态,修改时间等来做一些事情。

以上哪些部分是你不确定的,或者觉得你需要更多的细节? 你是新手脚本,还是不知道如何计划与cron或什么你的东西?

PostGRES是否支持本地的任何types的日志传送或镜像? 如果是这样,那可能是一个更好的一体化解决scheme。

首先,您需要设置您的ssh服务器,以便它接受RSA密钥,而不是密码。 这在别处有logging 。 然后,您将需要设置您打算使用的帐户来拥有适当的DSA / RSA密钥,这将允许该帐户自动login。

 * ssh to the production server 

这不是必须的。 您可以使用-C选项直接在远程服务器上执行命令。 例如,你提到的下两个步骤…

 * gzip our daily database dump file * scp the gzipped dump file over to my computer 

…看起来像这样:

 ssh [email protected] -C 'gzip dump > dump.gz' scp [email protected]:/path/to/dump/dump.gz /path/to/destination/dump.gz 

将刚刚提到的每个命令以及您手动input的其余命令放在一个文件中。 这些命令的顺序必须与您通常input的顺序相同。 我们将这个例子称为dump-script.sh 。 根据需要更改所有权和权限,以便执行该文件。

警告:

如果不在脚本中执行错误检查,则发生数据丢失的可能性非常高。 在将error handling添加到脚本之前, 不能保证它能100%正常工作。 使用放弃数据库的命令,在正确的情况下,很容易就会丢失正在接收转储的计算机上的所有数据。 您很可能想要扩展和修饰脚本以允许检测错误,以便在传输成功时只删除数据库并导入新数据。 如果您对此不满意,请不要运行它,也不要创buildcrontab条目。

一旦你的脚本被debugging,你可以确认它会正确处理错误,你可以考虑将它添加到一个正常的计划。 以您希望使用的帐户login时,将执行这些操作,请input:

 crontab -e 

….应该让你一个编辑器。 创build一个这样的条目:

 # Nightly Database Dump, at Midnight 0 0 * * * /path/to/my/dump-script.sh 

…然后按照顺序input:wq ,然后按回车键(假设vi是您的默认文本编辑器)。


更好的解决scheme:如果您可以通过networking访问PostgreSQL数据库,那么为什么不使用远程连接将数据库转储到networking上呢? 这是更清洁的,可以结合一点点的脚本,使之成为从一个到另一个数据的直接'pipe道'。