用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中绑定与未绑定的类方法用法分析
Apr 29 Python
python实现简单爬虫功能的示例
Oct 24 Python
python多线程socket编程之多客户端接入
Sep 12 Python
python的变量与赋值详细分析
Nov 08 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
Python requests模块实例用法
Feb 11 Python
详解django+django-celery+celery的整合实战
Mar 19 Python
简单了解python的break、continue、pass
Jul 08 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
Mar 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
整合了前面的PHP数据库连接类~~做成一个分页类!
2006/11/25 PHP
php入门教程 精简版
2009/12/13 PHP
PHP中for与foreach的区别分析
2011/03/09 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
js判断浏览器是否支持html5
2014/08/17 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
Javascript函数式编程语言
2015/10/11 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
jQuery滚动新闻实现代码
2016/06/26 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
Three.js基础学习教程
2017/11/16 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
[03:06]V社市场总监Dota2项目负责人Erik专访:希望更多中国玩家加入DOTA2
2014/07/11 DOTA
Pytorch之卷积层的使用详解
2019/12/31 Python
python 工具 字符串转numpy浮点数组的实现
2020/03/14 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
报考公务员诚信承诺书
2014/08/29 职场文书
代办出身证明书
2014/10/21 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
努力工作保证书
2015/02/28 职场文书
储备店长岗位职责
2015/04/14 职场文书
公司员工管理制度
2015/08/04 职场文书
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript