• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    用Python实现定时备份Mongodb数据并上传到FTP服务器
    POST TIME:2021-10-18 15:04

    实现的功能:在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(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脚本

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

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

    5. 效果

    5.1. 本地生成的压缩文件

    5.2. 上传至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服务器站点配置。

    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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • MongoDB安装使用并实现Python操作数据库
    • 使用python向MongoDB插入时间字段的操作
    • 如何用python 操作MongoDB数据库
    • python连接mongodb数据库操作数据示例
    • python爬虫用mongodb的理由
    • python爬虫数据保存到mongoDB的实例方法
    • Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
    • Python操作Mongodb数据库的方法小结
    • Python 操作 MongoDB 讲解详细
    上一篇:python re.match()用法相关示例
    下一篇:使用bandit对目标python代码进行安全函数扫描的案例分析
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信