一、需求分析
朋友公司有一台ERP服务器做了定时输出备份,设置输出的目录是D:\backup\年月日 目录,其中当前日期(类似20171011)这个是服务器定时备份时自动生成并输出到这个目录。想自动备份到远程服务器,实现数据异地备份。
思路:
python每天定时检查以当前日期备份的目录是否存在,不存在自行创建当前日期目前,并删除前一天的旧目录。压缩当前备份数据目录,并通过上传到远程ftps服务器。加入任务计划每天11.30执行(自动备份在11点)。
二、代码
#cat upload.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#coding:utf-8
import
urllib,urllib2
from
ftplib
import
FTP_TLS
import
os
import
re
import
sys
import
time
import
zipfile
import
datetime
YestodayDir
=
(datetime.date.today()
-
datetime.timedelta(days
=
1
)).strftime(
"%Y%m%d"
)
file_root_dir
=
"D:\\backup"
TodayDir
=
str
(time.strftime(
"%Y%m%d"
,time.localtime()))
TodayFileName
=
TodayDir
+
'.zip'
FLAG
=
1
##压缩函数
def
zip_dir(dirname,zipfilename):
filelist
=
[]
if
os.path.isfile(dirname):
filelist.append(dirname)
else
:
for
root, dirs, files
in
os.walk(dirname):
for
name
in
files:
filelist.append(os.path.join(root, name))
zf
=
zipfile.ZipFile(zipfilename,
"w"
, zipfile.zlib.DEFLATED)
for
tar
in
filelist:
arcname
=
tar[
len
(dirname):]
zf.write(tar,arcname)
zf.close()
#创建以当前日期的目录,并删除昨天目录
def
check_bak_dir():
global
FLAG
os.chdir(file_root_dir)
if
os.path.exists(YestodayDir):
os.system(
"rmdir %s /Q/S"
%
YestodayDir)
#删除昨天的备份
else
:
pass
if
not
os.path.exists(TodayDir):
print
(
"no %s"
%
TodayDir)
os.mkdir(TodayDir)
#创建目录
FLAG
=
0
#通过FLAg标志位来确定是否新创建目录
return
FLAG
else
:
pass
###上传到服务器
def
upload(filename):
os.chdir(file_root_dir)
ftp
=
FTP_TLS()
##此处填写你的ftp用户名和连接端口
ftp.connect(
"Your ip or domain"
,port)
ftp.login(
'ftpuser'
, ftpuser')
ftp.prot_p()
##服务器端存放的目录
ftp.cwd(
"home/back"
)
upload_file
=
unicode
(filename,
"utf8"
)
#windows
f
=
open
(upload_file,
'rb'
)
ftp.storbinary(
'STOR %s'
%
os.path.basename(upload_file),f)
f.close()
ftp.quit
if
__name__
=
=
"__main__"
:
check_bak_dir()
if
os.path.exists(TodayDir)
and
FLAG:
#如果目录存在前不是新创建,压缩上传
print
(
"Diractory is ziping ... "
)
zip_dir(TodayDir,TodayFileName)
print
(
"Upload bakcup ... "
)
upload(TodayFileName)
print
(
"Today %s upload success!"
%
TodayFileName)
print
|
三、添加计划任务
开始-->控制面板 --计划任务--添加计划任务 类似如下图:
四、手动执行验证效果如下
登录ftps可以看到上传了20171011.zip压缩备份文件。
注意:此处代码为了隐私安全隐去了ftp的地址和端口及用户名和密码;另外建议使用ftp + SSL证书登录。以保障安全。
本文转自 dyc2005 51CTO博客,原文链接:http://blog.51cto.com/dyc2005/1971456,如需转载请自行联系原作者