用Python實(shí)現(xiàn)定時備份Mongodb數(shù)據(jù)并上傳到FTP服務(wù)器
實(shí)現(xiàn)的功能:在win7下,每天晚上1點(diǎn),自動將 F:/data中所有文件進(jìn)行壓縮,以[mongodb+日期]命名,將壓縮好的文件存儲在本地目錄 F:\MongoDbData\,然后將這個壓縮好的文件上傳到ftp://192.168.0.101/MongoDBup/目錄下
分三步:
第一步:搭建FTP服務(wù)器,配置好FTP環(huán)境。 第二步:用python編寫壓縮文件并實(shí)現(xiàn)FTP上傳的腳本第三步:使用win7自帶的任務(wù)計(jì)劃程序定時執(zhí)行python腳本
1. 環(huán)境
Python:3.6.1Python IDE:pycharm系統(tǒng):win7
2. 搭建FTP服務(wù)器,配置好FTP環(huán)境
2.1. 啟用FTP和IIS服務(wù)器
注意:要全部展開,勾選上。
2.2. 添加FTP服務(wù)器


2.3. 設(shè)置參數(shù)



2.4. 設(shè)置成功,訪問

3. 用python編寫壓縮文件并實(shí)現(xiàn)FTP上傳的腳本
3.1. Import包:
# python3.6.1 import zipfile import os import datetime from ftplib import FTP
3.2. 定義配置信息:
# 定義配置信息 srcFolder = r"F:\Data" # 被壓縮的源數(shù)據(jù),文件夾形式 desFolder = r'F:\MongoDbData\\' # 壓縮好的數(shù)據(jù)臨時存放的位置 ftp_url = "192.168.0.101" # FTP服務(wù)器地址 ftp_port = 21 # FTP服務(wù)端口號 ftpUploadFolder = "MongoDBup" # 壓縮數(shù)據(jù)在FTP服務(wù)器上存放的位置
3.3. 壓縮數(shù)據(jù)源(文件夾):
# 壓縮文件夾
def zipFolder(srcFolder, desFolder, date):
'''
:param srcFolder: 被壓縮的源數(shù)據(jù)位置
:param desFolder: 壓縮之后文件的存放路徑
:param date: 執(zhí)行壓縮的當(dāng)前時間,datetime產(chǎn)生(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"
# 檢查是否已經(jīng)壓縮過了
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在運(yùn)行時,有幾個關(guān)于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服務(wù)器上:
# 上傳文件至FTP服務(wù)器
def ftpUpload(filename, folder, ftp_url, ftp_port):
'''
:param filename: 待上傳文件路徑
:param folder: 文件上傳至FTP服務(wù)器上的存儲目錄
:param ftp_url: FTP服務(wù)器IP
:param ftp_port: 端口號,默認(rèn)為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 # 設(shè)置緩沖塊大小
file_handler = open(filename, 'rb') # 讀模式在本地打開文件
res = -1
try:
# 為了避免程序終止,忽略可能出現(xiàn)的錯誤
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) # 關(guān)閉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自帶的任務(wù)計(jì)劃程序定時執(zhí)行python腳本
位置:開始 ——> 附件 ——> 系統(tǒng)工具 ——> 任務(wù)計(jì)劃程序








不需要時,右鍵——>刪除任務(wù) 即可
5. 效果
5.1. 本地生成的壓縮文件

5.2. 上傳至FTP服務(wù)器的壓縮文件

5.3. 詳細(xì)信息-性能-時間
日志信息:
源文件data總共8.7G,壓縮后5.3G,壓縮時間20m,局域網(wǎng)內(nèi)上傳時間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. 注意事項(xiàng)
6.1. FTP服務(wù)器IP地址變更處理
6.1.1. 第一步,修改FTP服務(wù)器站點(diǎn)配置。

6.1.2. 第二步,修改代碼中FTP登錄IP
ftp.connect("172.16.7.107", 21)
6.1.3. 出錯信息 如果只是單純按照6.1.2 修改登錄IP,沒有修改FTP服務(wù)器站點(diǎn)設(shè)置的話,將會出現(xiàn)如下莫名其妙的錯誤:
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] 由于連接方在一段時間后沒有正確答復(fù)或連接的主機(jī)沒
有反應(yīng),連接嘗試失敗。
到此這篇關(guān)于用Python實(shí)現(xiàn)定時備份Mongodb數(shù)據(jù)并上傳到FTP服務(wù)器的文章就介紹到這了,更多相關(guān)Python 定時備份Mongodb內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MongoDB安裝使用并實(shí)現(xiàn)Python操作數(shù)據(jù)庫
- 使用python向MongoDB插入時間字段的操作
- 如何用python 操作MongoDB數(shù)據(jù)庫
- python連接mongodb數(shù)據(jù)庫操作數(shù)據(jù)示例
- python爬蟲用mongodb的理由
- python爬蟲數(shù)據(jù)保存到mongoDB的實(shí)例方法
- Python MongoDB 插入數(shù)據(jù)時已存在則不執(zhí)行,不存在則插入的解決方法
- Python操作Mongodb數(shù)據(jù)庫的方法小結(jié)
- Python 操作 MongoDB 講解詳細(xì)
相關(guān)文章
利用Python操作消息隊(duì)列RabbitMQ的方法教程
RabbitMQ是一個在AMQP基礎(chǔ)上完整的,可復(fù)用的企業(yè)消息系統(tǒng)。他遵循Mozilla Public License開源協(xié)議。下面這篇文章主要給大家介紹了關(guān)于利用Python操作消息隊(duì)列RabbitMQ的方法教程,需要的朋友可以參考下。2017-07-07
詳解如何使用Python的Plotly庫進(jìn)行交互式圖形可視化
Python中有許多強(qiáng)大的工具和庫可用于創(chuàng)建交互式圖形,其中之一就是Plotly庫,Plotly庫提供了豐富的功能和靈活的接口,使得創(chuàng)建各種類型的交互式圖形變得簡單而直觀,本文將介紹如何使用Plotly庫來創(chuàng)建交互式圖形,需要的朋友可以參考下2024-05-05
Python中使用sqlalchemy操作數(shù)據(jù)庫的問題總結(jié)
在探索使用?FastAPI,?SQLAlchemy,?Pydantic,Redis,?JWT?構(gòu)建的項(xiàng)目的時候,其中數(shù)據(jù)庫訪問采用SQLAlchemy,并采用異步方式,這篇文章主要介紹了在Python中使用sqlalchemy來操作數(shù)據(jù)庫的幾個小總結(jié),需要的朋友可以參考下2024-08-08
python中日志logging模塊的性能及多進(jìn)程詳解
使用Python來寫后臺任務(wù)時,時常需要使用輸出日志來記錄程序運(yùn)行的狀態(tài),并在發(fā)生錯誤時將錯誤的詳細(xì)信息保存下來,以別調(diào)試和分析。Python的logging模塊就是這種情況下的好幫手。本文就介紹了python中日志logging模塊性能及多進(jìn)程的相關(guān)資料,需要的朋友可以參考下。2017-07-07
NumPy中np.c_ 和 np.r_ 的區(qū)別小結(jié)
np.c_和?np.r_是NumPy庫中兩個非常有用的函數(shù),它們分別用于按列和按行拼接數(shù)組本文主要介紹了NumPy中np.c_ 和 np.r_ 的區(qū)別小結(jié),具有一定的參考價值,感興趣的可以了解一下2024-02-02
使用python批量讀取word文檔并整理關(guān)鍵信息到excel表格的實(shí)例
今天小編就為大家分享一篇使用python批量讀取word文檔并整理關(guān)鍵信息到excel表格的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Python計(jì)算兩個日期相差天數(shù)的方法示例
這篇文章主要介紹了Python計(jì)算兩個日期相差天數(shù)的方法,結(jié)合簡單實(shí)例形式分析了Python日期時間的轉(zhuǎn)換與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-05-05

