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

实现的功能:在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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python操作mongodb根据_id查询数据的实现方法

    本文实例讲述了python操作mongodb根据_id查询数据的实现方法.分享给大家供大家参考.具体分析如下: _id是mongodb自动生成的id,其类型为ObjectId,所以如果需要在python中通过_id查询,就需要转换类型 如果pymongo的版本号小于2.2,使用下面的语句导入ObjectId from pymongo.objectid import ObjectId 如果pymongo的版本号大于2.2,则使用下面的语句 from bson.objectid import Obj

  • python读取json文件并将数据插入到mongodb的方法

    本文实例讲述了python读取json文件并将数据插入到mongodb的方法.分享给大家供大家参考.具体实现方法如下: #coding=utf-8 import sunburnt import urllib from pymongo import Connection from bson.objectid import ObjectId import logging from datetime import datetime import json from time import mktime

  • python连接mongodb密码认证实例

    如下所示: from pymongo import MongoClient #建立和数据库系统的连接,指定host及port参数 client = MongoClient('localhost', 27017) #连接mydb数据库,账号密码认证 db = client.mydb db.authenticate("account", "password") #连接表 collection = db.myset #查看全部表名称 db.collection_names

  • Python操作MongoDB数据库PyMongo库使用方法

    引用PyMongo 复制代码 代码如下: >>> import pymongo 创建连接Connection 复制代码 代码如下: >>> import pymongo >>> conn = pymongo.Connection('localhost',27017) 或 复制代码 代码如下: >>> from pymongo import Connection >>> conn = Connection('local

  • Python中的MongoDB基本操作:连接、查询实例

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案.它的特点是高性能.易部署.易使用,存储数据非常方便. MongoDB 简单使用 联接数据库 复制代码 代码如下: In [1]: import pymongo In [2]: from pymongo import Connection In [3]: connection = Connection('192.168.1.3', 27017) //创建联接 Connection

  • python操作MongoDB基础知识

    首先运行easy_install pymongo命令安装pymongo驱动.然后执行操作:创建连接 复制代码 代码如下: In [1]: import pymongoIn [2]: connection = pymongo.Connection('localhost', 27017) 切换到数据库malware 复制代码 代码如下: In [3]: db = connection.malware 获取collection 复制代码 代码如下: In [4]: collection = db.ma

  • python将MongoDB里的ObjectId转换为时间戳的方法

    本文实例讲述了python将MongoDB里的ObjectId转换为时间戳的方法.分享给大家供大家参考.具体分析如下: MongoDB里的_id字段前四位是时间戳的16进制表示,通过Python可以很容易从_id中提取出时间戳来 def timestamp_from_objectid(objectid): result = 0 try: result = time.mktime(objectid.generation_time.timetuple()) except: pass return r

  • Python中使用Flask、MongoDB搭建简易图片服务器

    1.前期准备 通过 pip 或 easy_install 安装了 pymongo 之后, 就能通过 Python 调教 mongodb 了. 接着安装个 flask 用来当 web 服务器. 当然 mongo 也是得安装的. 对于 Ubuntu 用户, 特别是使用 Server 12.04 的同学, 安装最新版要略费些周折, 具体说是 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 echo '

  • 在Python中使用mongoengine操作MongoDB教程

    最近重新拾起Django,但是Django并不支持mongodb,但是有一个模块mongoengine可以实现Django Model类似的封装.但是mongoengine的中文文档几乎没有,有的也是简短的几句介绍和使用.下面我就分享一下我在使用过程中所记录下的一些笔记,可能有点乱.大家可以参考一下. 安装mongoengine easy_install pymongo # 依赖库 easy_install mongoengine 基本使用 from mongoengine import * f

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

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

  • linux下自动备份MySQL数据并上传到FTP上的shell脚本

    复制代码 代码如下: #!/bin/bash #Mysql autobackup shell # # #----------------set the mysql login parameters dbuser=root dbpasswd= dbserver=localhost dbname=fwserver2008 dbopt=--opt backupdir=/dbbackup/ #-----------------set the FTP paramters , 0 no send to a

  • python Elasticsearch索引建立和数据的上传详解

    今天我想讲一讲关于Elasticsearch的索引建立,当然提前是你已经安装部署好Elasticsearch. ok,先来介绍一下Elaticsearch,它是一款基于lucene的实时分布式搜索和分析引擎,是后台系统,用来存储数据,检索数据,属于完全命令行交互. 那为什么选择python作为脚本进行命令的写入和数据的上传呢?那是因为Python里面有固定的模板,可以上传数据到Elasticsearch. 接下来就聊一聊该如何编写代码: 我们上传数据之后,数据到哪里去了呢? 存在索引里面了. 那

  • Python实现定时备份mysql数据库并把备份数据库邮件发送

    一.先来看备份mysql数据库的命令 mysqldump -u root --password=root --database abcDataBase > c:/abc_backup.sql 二.写Python程序 BackupsDB.py #!/usr/bin/python # -*- coding: UTF-8 -*- ''''' zhouzhongqing 备份数据库 ''' import os import time import sched import smtplib from em

  • CentOS中使用Shell脚本实现每天自动备份网站文件和数据库并上传到FTP中

    一.安装Email发送程序 复制代码 代码如下: yum install sendmail mutt 二.安装FTP客户端程序 本脚本需要用到FTP客户端程序将文件上传到FTP空间上面,因此必须安装FTP客户端,否则将出现ftp命令无法找到的错误. 安装步骤请参考:<CentOS提示ftp:command not found> 三.在/root目录下新建脚本文件:AutoBackupToFtp.sh,内容如下: 复制代码 代码如下: #!/bin/bash #你要修改的地方从这里开始 MYSQ

  • SpringBoot整合MongoDB实现文件上传下载删除

    本文主要内容 MongoDB基础操作命令示例练习 MongoDB居于GridFSTemplate的文件上传.下载.删除等操作(工作重点使用) 1. 基础命令 创建的数据库名称:horse,创建的集合名称:blog # 创建数据库 use horse # 删除当前数据库[horse] db.dropDatebase() # 查看所有数据库 show dbs # 设置用户的角色和权限 db.createUser({user:"horse",pwd:"mongo123",

  • SpringBoot 集成MongoDB实现文件上传功能

    目录 前言 环境 代码实现 测试 源码 前言 记录下SpringBoot集成MongoDB实现文件上传的步骤 MongoDB - 5.0.6安装包 链接: https://pan.baidu.com/s/1_7nJDe3ndraNyo3vGWOXhg?pwd=i4cv 提取码: i4cv 环境 SpringBoot - 2.5.12MongoDB - 5.0.6 代码实现 pom.xml <dependency> <groupId>org.springframework.boot&

  • Python实现对百度云的文件上传(实例讲解)

    环境准备 python3.6 PyCharm 2017.1.3 Windows环境 框架搭建 selenium3.6 安装方法: pip install selenium 实现步骤: 一.步骤分析 1.选择"账号密码登录" 2.用户名.密码输入,登录 3.文件上传 注:本文主要介绍利用selenium包下的webdriver加载Firefox浏览器. 二.元素捕捉 利用火狐浏览器firebug插件复制控件的XPATH路径,注:Python3.6对应Firefox版本40.x,暂不支持最

  • python中watchdog文件监控与检测上传功能

    引言 上一篇介绍完了观察者模式的原理,本篇想就此再介绍一个小应用,虽然我也就玩了一下午,是当时看observer正好找到的,以及还有Django-observer,但Django很久没用了,所以提下这个作为一个笔记. watchdog介绍 Watchdog的中文的"看门狗",有保护的意思.最早引入Watchdog是在单片机系统中,由于单片机的工作环境容易受到外界磁场的干扰,导致程序"跑飞",造成整个系统无法正常工作,因此,引入了一个"看门狗",对

  • 如何将自己的python库打包成wheel文件并上传到pypi

    新建项目 如下图,比如sigma目录是我要上传的项目,在six-sigma目录下新建三个文件,分别是LICENSE也就是开源协议,README.md文件,用于介绍自己的项目和setup.py这个配置文件,此文件配置关于项目和作者的一些信息,接下来我们一一介绍. LICENSE文件 Copyright (c) 2018 The Python Packaging Authority Permission is hereby granted, free of charge, to any person

随机推荐