实现的功能:在win7下,每天晚上1点,自动将 F:/data中所有文件进行压缩,以[mongodb+日期]命名,将压缩好的文件存储在本地目录 F:\MongoDbData\,然后将这个压缩好的文件上传到ftp://192.168.0.101/MongoDBup/目录下
分三步:
第一步:搭建FTP服务器,配置好FTP环境。 第二步:用python编写压缩文件并实现FTP上传的脚本第三步:使用win7自带的任务计划程序定时执行python脚本
1. 环境
Python:3.6.1Python IDE:pycharm系统:win7
2. 搭建FTP服务器,配置好FTP环境
2.1. 启用FTP和IIS服务器
注意:要全部展开,勾选上。
2.2. 添加FTP服务器


2.3. 设置参数



2.4. 设置成功,访问

3. 用python编写压缩文件并实现FTP上传的脚本
3.1. Import包:
# python3.6.1
import zipfile
import os
import datetime
from ftplib import FTP
3.2. 定义配置信息:
# 定义配置信息
srcFolder = r"F:\Data" # 被压缩的源数据,文件夹形式
desFolder = r'F:\MongoDbData\\' # 压缩好的数据临时存放的位置
ftp_url = "192.168.0.101" # FTP服务器地址
ftp_port = 21 # FTP服务端口号
ftpUploadFolder = "MongoDBup" # 压缩数据在FTP服务器上存放的位置
3.3. 压缩数据源(文件夹):
# 压缩文件夹
def zipFolder(srcFolder, desFolder, date):
'''
:param srcFolder: 被压缩的源数据位置
:param desFolder: 压缩之后文件的存放路径
:param date: 执行压缩的当前时间,datetime产生(ext:2017-08-16 14:56:40.872613)
:return: 压缩文件的路径
'''
startTime = datetime.datetime.now()
print(f"Enter func zipFolder, time:{startTime}")
desName = f"{desFolder}mongodb{date.year}{date.month}{date.day}.zip"
# 检查是否已经压缩过了
if os.path.exists(desName):
endTime = datetime.datetime.now()
print(f"Already exsist, leave func zipFolder, time:{endTime}, usedTime:{endTime-startTime}")
return desName
z = zipfile.ZipFile(desName, 'w', zipfile.ZIP_DEFLATED)
for dirpath, dirnames, filenames in os.walk(srcFolder):
print(f"dirpath:{dirpath}, dirnames:{dirnames}, filenames:{filenames}")
for filename in filenames:
try:
# Mongodb在运行时,有几个关于lock的文件无法压缩,为了避免程序终止,忽略这几个文件
z.write(os.path.join(dirpath, filename))
except Exception as e:
print(f"except: {e}, cannot zip file: {dirpath}{filename}")
z.close()
endTime = datetime.datetime.now()
print(f"zip done, leave func zipFolder, time:{endTime}, usedTime:{endTime-startTime}")
return desName
3.4. 文件上传到FTP服务器上:
# 上传文件至FTP服务器
def ftpUpload(filename, folder, ftp_url, ftp_port):
'''
:param filename: 待上传文件路径
:param folder: 文件上传至FTP服务器上的存储目录
:param ftp_url: FTP服务器IP
:param ftp_port: 端口号,默认为21
:return: status code
'''
startTime = datetime.datetime.now()
print(f"Enter func ftpUpload, time:{startTime}")
ftp = FTP()
ftp.set_debuglevel(2) # set debug level, detail info:2, close:0
ftp.connect(ftp_url, ftp_port)
ftp.login('', '') # 登录,如果匿名登录则用空串代替
print(ftp.getwelcome()) # ext: *welcome* '220 Microsoft FTP Service'
ftp.cwd(folder) # Change to a directory on FTP server
bufsize = 1024 # 设置缓冲块大小
file_handler = open(filename, 'rb') # 读模式在本地打开文件
res = -1
try:
# 为了避免程序终止,忽略可能出现的错误
res = ftp.storbinary(f"STOR {os.path.basename(ffnbsp;6.1. FTP服务器IP地址变更处理
6.1.1. 第一步,修改FTP服务器站点配置。

6.1.2. 第二步,修改代码中FTP登录IP
ftp.connect("172.16.7.107", 21)
6.1.3. 出错信息 如果只是单纯按照6.1.2 修改登录IP,没有修改FTP服务器站点设置的话,将会出现如下莫名其妙的错误:
enter ftpUpload
*get* ''
Traceback (most recent call last):
File "AutoBackupMongoTest.py", line 64, in <module>
ftp_res = ftpUpload(zip_des_name, ftpUploadFolder)
File "AutoBackupMongoTest.py", line 42, in ftpUpload
ftp.connect('172.16.7.107', 21)
File "E:\Miniconda\lib\ftplib.py", line 155, in connect
self.welcome = self.getresp()
File "E:\Miniconda\lib\ftplib.py", line 234, in getresp
resp = self.getmultiline()
File "E:\Miniconda\lib\ftplib.py", line 220, in getmultiline
line = self.getline()
File "E:\Miniconda\lib\ftplib.py", line 208, in getline
raise EOFError
EOFError
或者是如下错误:
enter ftpUpload
Traceback (most recent call last):
File "AutoBackupMongoTest.py", line 63, in <module>
ftp_res = ftpUpload(zip_des_name, ftpUploadFolder)
File "AutoBackupMongoTest.py", line 41, in ftpUpload
ftp.connect("192.168.0.101", 21)
File "E:\Miniconda\lib\ftplib.py", line 152, in connect
source_address=self.source_address)
File "E:\Miniconda\lib\socket.py", line 722, in create_connection
raise err
File "E:\Miniconda\lib\socket.py", line 713, in create_connection
sock.connect(sa)
TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没
有反应,连接尝试失败。
到此这篇关于用Python实现定时备份Mongodb数据并上传到FTP服务器的文章就介绍到这了,更多相关Python 定时备份Mongodb内容请搜索社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持社区! |