ubuntu crontab 定时备份postgres数据库并上传ftp服务器

最近公司要求备份数据库,所以就查了比较作的资料。废话不多说,入正题。

目的:定期备份ubuntu下的postgres数据库,打包上传到指定ftp服务器。

经过查找资料,解决方法:

①编写备份数据库、打包压缩、上传指定ftp的脚本。

②将该脚本加入到ubuntu定期计划任务crontab中。

下边是执行的步骤:

①编写shelll脚本:bk.sh,对于对shell脚本不了解的,可以百度w3cshool shell。

最好用root用户编写:su root.

编写完后,添加执行权限,新编写的shel默认没有执行权限,chmod 777 bk.sh.这样才能执行。

执行脚本:sh bk.sh    或者 直接运行./bk.sh.

先测试一下bk.sh。看看是否有问题,里边已经有注释。

注意:bk.sh中涉及路径的都要使用据对路径。因为在crontab中执行时,与在终端执行不同,因为在终端中执行时,有临时的环境变量记载当前的执行路径,

这样执行时可以更加相对路径找到,可是在crontab中就没有,所以只能用绝对路径

 1 echo ********BackTime:`date +%Y-%m-%d--%T`********

 2 DUMP=/usr/local/pgsql/bin/pg_dump

 3 OUT_DIR=                       #备份存放路径

 4 LINUX_USER=root                            #系统用户名

 5 DB_USER=                                  #数据库账号 #注意:非root用户要用备份参数 --skip-lock-tables,否则可能会报错

 6 FTP_DIR=backup/postgres_back

 7 DAYS=4                                      #DAYS=5代表删除=5天前的备份,即只保留最近5天的

 8 

 9 cd $OUT_DIR                                 #进入备份存放目录

10 DATE=`date +%Y_%m_%d`                       #获取当前系统时间

11 OUT_SQL="$DATE.sql"                         #备份数据库的文件名

12 TAR_SQL="mysqldata_bak_$DATE.tar.gz"        #最终保存的数据库备份文件名

13 $DUMP -U$DB_USER -E utf-8 > $OUT_SQL #备份

14 tar -czf $TAR_SQL ./$OUT_SQL                #压缩为.tar.gz格式

15 rm $OUT_SQL                                 #删除.sql格式的备份文件

16 chown  $LINUX_USER:$LINUX_USER $OUT_DIR/$TAR_SQL  #更改备份数据库文件的所有者

17 find $OUT_DIR -name "mysqldata_bak_*" -type f -atime +$DAYS -exec rm {} \;  #删除7天前的备份文件

18 deldate=` date -d -5day +%Y_%m_%d `         #获取5天前的时间

19 /usr/bin/ftp -n<<!

20 open ftp_ip

21 user user password

22 binary

23 cd $FTP_DIR

24 lcd $OUT_DIR

25 prompt

26 put mysqldata_bak_$DATE.tar.gz   mysqldata_bak_$DATE.tar.gz

27 delete mysqldata_bak_$deldate.tar.gz  mysqldata_bak_$deldate.tar.gz 

28 close

29 bye !

 

 

②编写crontab文件,使bk.sh定期执行。注意是root用户。

vi  /etc/crontab

在相同格式的地方加上:* * * * * root 脚本绝对路径 >>BackData.log

保存即可,因为系统级只需保存即可生效。我验证过。

这里是完成过程中遇到的问题和解决方案:

问题1:

关于crontab有两种方式,一个是/etc/crontab。另一个是crontab -e。不知道两者的区别?

答案:前者系统级别的,后者是用户级别的。最好用前者,原因crontab详解1.

补充:

1. 使用crontab -e命令

这个命令的使用比较简单。直接输入

~# crontab -e

就会打开一个编辑窗口,第一行会有内容格式的提示:

# m h  dom mon dow   command

具体意义表示:分钟 小时 日期 月份 星期 命令,在某月(mon)的某天(dom)或者星期几(dow)的几点(h,24小时制)几分(m)执行某个命令(command),*表示任意时间。例如:

3 * * * * /home/meng/hello.sh

就是:每小时的03时执行/home/meng/下的hello.sh脚本。

在保存之后,根据屏幕下面的提示输入Ctrl+X退出,此时会提示是否保存,输入Y;提示输入文件名,并且有一个临时的文件名,由于只是测试,直接回车保存。

注意:在完成编辑以后,要重新启动cron进程:

~# /etc/init.d/cron restart

观察运行结果,会发现hello.sh会每隔一小时,在03分时被执行一次。

 

在使用这个命令时,最大的担心就是在系统重启以后是否还能顺利执行呢?我重启系统以后发现一切正常,于是打消了这个顾虑。但是,仍然有一个问题,一般情况下,服务器都是在重启后处于登录状态下,并没有用户登入。那么如果我在执行crontab -e命令时,不是使用root账户,那么在系统重启之后是否还会顺利执行呢?

 

2. 编辑crontab文件

crontab位于/ect/文件夹,在http://wiki.ubuntu.org.cn/CronHowto上有关于它的详细介绍,但是我看的不是太懂。

打开crontab文件,如果没有编辑过可以看到如下类似的内容:

# /etc/crontab: system-wide crontab

# Unlike any other crontab you don't have to run the `crontab'

# command to install the new version when you edit this file

# and files in /etc/cron.d. These files also have username fields,

# that none of the other crontabs do.

SHELL=/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

由于对脚本的认知有限,不能详细解释每个命令的含义。在第10行,同样定义了文件内容的格式。可以看到比使用crontab -e命令时,多了一个user。它表示了执行命令的用户,如果是root,就表明是系统用户。于是,我加了如下一行:

3 * * * * root /home/meng/hello.sh

然后保存文件即可,我验证过,不需要重启。
crontab详解1

 

关于crontab:



crond和crontab



cron是linux提供的一种服务器,用于定期执行shell命令。主要由两部分组成



crond:cron服务的守护进程,用于定期调度

crontab:cron提供的UI,用于编辑调度计划

crontab的使用方法,大家可以man一下,如下图:



clip_image002



主要有三个选项:



“-e”编辑:与vim类是,但是在保存退出时,他会帮你检查任务语法;

“-l”列举所有任务;

“-r”删除所有任务;

P.S.: 目前介绍的是基于当前用户的crontab,系统级别的crontab见后面介绍。



 



基本语法



cron的语法很简单,如下:



【调度频率】 shell命令



看个例子:



clip_image004



可以看出,前面分别是分钟,小时,天,月和周,最后是shell命令。cron调度的最小频率为1分钟。上面这段调度的意思是:“每天10点30分,执行/some/path/do_something.sh”。



以上命令中每一块的具体意义如下:



意义



分钟



小时



天



月份



周



命令



范围



0-59



0-23



1-31



1-12



0-7



shell命令



P.S.: “周”这一栏中0和7都代表周日



P.S.: 每个月的最后一日无法由crontab直接支持,需要通过脚本判断,参见这里。



P.S.: 命令最好是绝对路径



还有一些辅助的符号,可以借助他们写出更灵活的调度



特殊字符



代表意义



*(星号)



代表任何时候都接受,比如上面的例子,day,month和week为“*”,表示无论那个月,那一天,周几,都在10点30分执行命令。



,(逗号)



并列时间。举个例子:



* 3,6,9,12 * * * command



上面的意思是在3点,6点,9点或12点,执行命令。



-(减号)



连续区间。举个例子:



* 9-17 * * * command



上面的意思是从9点到17点,每一分钟都要执行这个任务



/n(斜线)



n代表数组,表示每隔n个单位之间,比如每隔5分钟,可以写成下面



*/5 * * * * command



 



一些例子



59 23 11 27 * mail benben < /home/dmtsai/lover.txt // 每一年11月27日23分59 秒发一封情书给benben

0 17 * * 5 mail all_members < weekily_report_notify // 每周五5点整,提醒所有组员发周报

系统级的crontab



系统级的crontab只有root权限有权编辑,该crontab是一个文件,位置为/etc/crontab,



系统级别的crontab的语法与上面稍微不一样,需要在频率和命令之间添加命令执行者,如下所示,并且可以添加一些全局变量,在调度中使用:



clip_image006



详细的系统级调度可以参见这里。



这里需要强调/etx目录下几个与cron有关的目录和文件,如下所示



clip_image008



cron.d:目录,此目录下以及子目录中所有符合调度语法的文件都会被执行

cron.deny与cron.allow:此文件记录拒绝和允许执行的帐号,cron.allow的优先级大于cron.deny,建议一般只留一个就可以

cron.daily/hourly/monthly/weekly:这些目录里面全部都是脚本,分别在指定的时间里面执行。

 



绝对路径



虽然crontab执行,可以理解为手动执行的定时触发。但是,执行过程中的路径仍然有所区别,很多情况下手动执行成功,但是crontab不成功,多半是由于采用了相对路径。所以,使用crontab时,尽量采用绝对路径。结果一些实践,总结了一条经验:如果命令手动可以执行成功,但是crontab失败,那么就需要重点关注相关路径问题。
crontab详解2

 

你可能感兴趣的:(postgres)