使用Python怎么對Mongodb數據定時備份-創(chuàng)新互聯

今天就跟大家聊聊有關使用Python怎么對Mongodb數據定時備份,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

企業(yè)建站必須是能夠以充分展現企業(yè)形象為主要目的,是企業(yè)文化與產品對外擴展宣傳的重要窗口,一個合格的網站不僅僅能為公司帶來巨大的互聯網上的收集和信息發(fā)布平臺,成都創(chuàng)新互聯公司面向各種領域:辦公窗簾成都網站設計成都全網營銷解決方案、網站設計等建站排名服務。

1. 環(huán)境


Python:3.6.1Python IDE:pycharm系統(tǒng):win7

2. 搭建FTP服務器,配置好FTP環(huán)境

2.1. 啟用FTP和IIS服務器

使用Python怎么對Mongodb數據定時備份


注意:要全部展開,勾選上。

2.2. 添加FTP服務器

使用Python怎么對Mongodb數據定時備份

使用Python怎么對Mongodb數據定時備份

2.3. 設置參數

使用Python怎么對Mongodb數據定時備份

使用Python怎么對Mongodb數據定時備份

使用Python怎么對Mongodb數據定時備份

2.4. 設置成功,訪問

使用Python怎么對Mongodb數據定時備份

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: 執(zhí)行壓縮的當前時間,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自帶的任務計劃程序定時執(zhí)行python腳本

位置:開始 ——> 附件 ——> 系統(tǒng)工具 ——> 任務計劃程序

使用Python怎么對Mongodb數據定時備份

使用Python怎么對Mongodb數據定時備份

使用Python怎么對Mongodb數據定時備份

使用Python怎么對Mongodb數據定時備份

使用Python怎么對Mongodb數據定時備份

使用Python怎么對Mongodb數據定時備份

使用Python怎么對Mongodb數據定時備份

使用Python怎么對Mongodb數據定時備份

不需要時,右鍵——>刪除任務 即可

5. 效果

5.1. 本地生成的壓縮文件

使用Python怎么對Mongodb數據定時備份

5.2. 上傳至FTP服務器的壓縮文件

使用Python怎么對Mongodb數據定時備份

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數據定時備份

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數據定時備份有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創(chuàng)新互聯行業(yè)資訊頻道,感謝大家的支持。

分享名稱:使用Python怎么對Mongodb數據定時備份-創(chuàng)新互聯
標題來源:http://muchs.cn/article42/ejdhc.html

成都網站建設公司_創(chuàng)新互聯,為您提供響應式網站品牌網站設計、品牌網站制作微信公眾號、網頁設計公司搜索引擎優(yōu)化

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都做網站