用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 相关文章推荐
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Python实现查看系统启动项功能示例
May 10 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
使用python3实现操作串口详解
Jan 01 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
Jul 11 Python
python 实现识别图片上的数字
Jul 30 Python
超全Python图像处理讲解(多模块实现)
Apr 13 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
Python根据指定文件生成XML的方法
Jun 29 Python
python 字符串格式化的示例
Sep 21 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
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
AngularJS内置指令
2015/02/04 Javascript
JS实现超简单的仿QQ折叠菜单效果
2015/09/21 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
Python 命令行非阻塞输入的小例子
2013/09/27 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
关于Keras Dense层整理
2020/05/21 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
优秀员工自荐书
2013/12/19 职场文书
家长给孩子的评语
2014/01/30 职场文书
2014年党务公开实施方案
2014/02/27 职场文书
房屋继承公证书
2014/04/10 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
2015年物流客服工作总结
2015/07/27 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
python自动化之如何利用allure生成测试报告
2021/05/02 Python