用Python实现定时备份Mongodb数据并上传到FTP服务器


Posted in Python onJanuary 27, 2021

实现的功能:在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服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器 

注意:要全部展开,勾选上。

2.2. 添加FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

2.3. 设置参数

用Python实现定时备份Mongodb数据并上传到FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

2.4. 设置成功,访问

用Python实现定时备份Mongodb数据并上传到FTP服务器

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(filename)}", file_handler, bufsize) # upload file
  except Exception as e:
    print(f"except: {e}, cannot upload file: {ftp_url}:{ftp_port} {filename}")
  finally:
    ftp.set_debuglevel(0)          # 关闭debug信息
    file_handler.close()
    ftp.quit()
  endTime = datetime.datetime.now()
  print(f"Upload done, leave func ftpUpload, time:{endTime}, usedTime:{endTime-startTime}")
  return res

3.5. 主程序:

# main
backupTime = datetime.datetime.now()
zip_des_name = zipFolder(srcFolder, desFolder, backupTime)
print(zip_des_name)
ftp_res = ftpUpload(zip_des_name, ftpUploadFolder, ftp_url, ftp_port)
print(f"ftp_res: {ftp_res}")

4. 使用win7自带的任务计划程序定时执行python脚本

位置:开始 ——> 附件 ——> 系统工具 ——> 任务计划程序

用Python实现定时备份Mongodb数据并上传到FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

用Python实现定时备份Mongodb数据并上传到FTP服务器

不需要时,右键——>删除任务 即可

5. 效果

5.1. 本地生成的压缩文件

用Python实现定时备份Mongodb数据并上传到FTP服务器

5.2. 上传至FTP服务器的压缩文件

用Python实现定时备份Mongodb数据并上传到FTP服务器

5.3. 详细信息-性能-时间

日志信息:

源文件data总共8.7G,压缩后5.3G,压缩时间20m,局域网内上传时间18m。

E:\Miniconda\python.exe E:/PyCharmCode/Justtest/bak.py
Enter func zipFolder, time:2017-08-16 19:48:39.331200
dirpath:F:\Data, dirnames:['diagnostic.data', 'journal'], filenames:['collection-0--394122179086539486.wt', 'collection-102--394122179086539486.wt', 'collection-104--394122179086539486.wt', 'collection-106--394122179086539486.wt', 'collection-108--394122179086539486.wt'], '_mdb_catalog.wt']
except: [Errno 13] Permission denied: 'F:\\Data\\mongod.lock', cannot zip file: F:\Datamongod.lock
except: [Errno 13] Permission denied, cannot zip file: F:\DataWiredTiger.lock
dirpath:F:\Data\diagnostic.data, dirnames:[], filenames:['metrics.2017-08-04T07-04-29Z-00000', 'metrics.2017-08-05T10-47-22Z-00000', 'metrics.2017-08-06T14-52-22Z-00000', 'metrics.2017-08-07T18-17-22Z-00000', 'metrics.2017-08-15T06-09-26Z-00000', 'metrics.2017-08-16T09-51-29Z-00000']
dirpath:F:\Data\journal, dirnames:[], filenames:['WiredTigerLog.0000000247', 'WiredTigerPreplog.0000000006', 'WiredTigerPreplog.0000000007', 'WiredTigerPreplog.0000000008']
zip done, leave func zipFolder, time:2017-08-16 20:08:22.728200, usedTime:0:19:43.397000
F:\MongoDbData\\mongodb2017816.zip
Enter func ftpUpload, time:2017-08-16 20:08:22.728200
*get* '220 Microsoft FTP Service\n'
*resp* '220 Microsoft FTP Service'
*cmd* 'USER anonymous'
*put* 'USER anonymous\r\n'
*get* '331 Anonymous access allowed, send identity (e-mail name) as password.\n'
*resp* '331 Anonymous access allowed, send identity (e-mail name) as password.'
*cmd* 'PASS **********'
*put* 'PASS **********\r\n'
*get* '230 User logged in.\n'
*resp* '230 User logged in.'
*welcome* '220 Microsoft FTP Service'
220 Microsoft FTP Service
*cmd* 'CWD MongoDBup'
*put* 'CWD MongoDBup\r\n'
*get* '250 CWD command successful.\n'
*resp* '250 CWD command successful.'
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*get* '200 Type set to I.\n'
*resp* '200 Type set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (192,168,0,101,11,221).\n'
*resp* '227 Entering Passive Mode (192,168,0,101,11,221).'
*cmd* 'STOR mongodb2017816.zip'
*put* 'STOR mongodb2017816.zip\r\n'
*get* '125 Data connection already open; Transfer starting.\n'
*resp* '125 Data connection already open; Transfer starting.'
*get* '226 Transfer complete.\n'
*resp* '226 Transfer complete.'
Upload done, leave func ftpUpload, time:2017-08-16 20:26:20.125200, usedTime:0:17:57.397000
ftp_res: 226 Transfer complete.

6. 注意事项

 6.1. FTP服务器IP地址变更处理

6.1.1. 第一步,修改FTP服务器站点配置。

用Python实现定时备份Mongodb数据并上传到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内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解python脚本自动生成需要文件实例代码
Feb 04 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
Python读写/追加excel文件Demo分享
May 03 Python
Python实现京东秒杀功能代码
May 16 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
python3 map函数和filter函数详解
Aug 26 Python
python调用matplotlib模块绘制柱状图
Oct 18 Python
通过实例了解python property属性
Nov 01 Python
浅谈Python type的使用
Nov 19 Python
基于Python数据分析之pandas统计分析
Mar 03 Python
Pytorch数据拼接与拆分操作实现图解
Apr 30 Python
Python下使用Trackbar实现绘图板
Oct 27 Python
python re.match()用法相关示例
Jan 27 #Python
selenium+python实现基本自动化测试的示例代码
Jan 27 #Python
Python开发.exe小工具的详细步骤
Jan 27 #Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 #Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 #Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 #Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 #Python
You might like
使用Apache的rewrite技术
2006/06/22 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
JQuery UI皮肤定制
2009/07/27 Javascript
javascript 继承实现方法
2009/08/26 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
Vue实现购物车功能
2017/04/27 Javascript
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
决策树的python实现方法
2014/11/18 Python
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
python如何在终端里面显示一张图片
2016/08/17 Python
Python中装饰器学习总结
2018/02/10 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
Python做智能家居温湿度报警系统
2018/09/25 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
python 实现表情识别
2020/11/21 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
机电专业个人求职信范文
2013/12/30 职场文书
一年级语文教学反思
2014/02/13 职场文书
室内趣味活动方案
2014/08/24 职场文书
酒店前台岗位职责
2015/04/16 职场文书
使用HttpSessionListener监听器实战
2022/03/17 Java/Android