新聞中心
有效管理數(shù)據(jù)、服務(wù)和信息對一個公司的成功至關(guān)重要。在數(shù)據(jù)日益增長的世界里,選擇正確的數(shù)據(jù)管理解決方案比以往更加重要。MongoDB 是一個新興的開源 NoSQL 數(shù)據(jù)庫,可用于海量數(shù)據(jù)管理。它提供了高性能、高可用性和易于擴(kuò)展的特性。數(shù)據(jù)管理的一個關(guān)鍵要素是定期執(zhí)行備份,預(yù)防數(shù)據(jù)丟失,而且不應(yīng)手動完成此項工作??墒褂枚喾N不同方法在 MongoDB 中執(zhí)行備份,但本文只展示了如何使用 mongodump 和 mongorestore 配置和運行備份腳本。

創(chuàng)新互聯(lián)主營金灣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app開發(fā)定制,金灣h5重慶小程序開發(fā)搭建,金灣網(wǎng)站營銷推廣歡迎金灣等地區(qū)企業(yè)咨詢
設(shè)置 MongoDB 實例
執(zhí)行以下步驟,設(shè)計可通過 cron 作業(yè)自動運行的 MongoDB 備份腳本。可根據(jù)業(yè)務(wù)需求來自定義備份腳本。
備注:要跟隨本教程中的步驟進(jìn)行操作,請創(chuàng)建一個單獨的用戶(例如名為 mongo 的用戶),在 MongoDB 中執(zhí)行管理操作。
1、從 MongoDB Download Center 安裝 MongoDB。MongoDB 二進(jìn)制文件位于 /opt/mongodb/mongodb/bin/ 目錄中。安裝 MongoDB 時使用 root 用戶憑證。
2、以 root 用戶身份進(jìn)行登錄,然后創(chuàng)建一個組和用戶:
- # groupadd mongogrp
- # vi /etc/group
- mongogrp:x:1005:
3、將用戶 mongo 添加到剛創(chuàng)建的組 mongogrp 中:
- # useradd mongo -d /home/mongo -f -1 -g mongogrp -m
4、驗證是否已創(chuàng)建該用戶:
- # cd /home
- # ls -l
- drwxr-xr-x 2 mongo mongogrp 4096 Oct 18 07:25 mongo
- vi /etc/passwd
- mongo:x:1005:1005::/home/mongo:
5、設(shè)置用戶 mongo 設(shè)置密碼:
- # passwd mongo
調(diào)用 MongoDB shell
1、打開一個新會話并以用戶 mongo 登錄:
- $ sudo su – mongo
2、找到 MongoDB 安裝的 bin 目錄:
- $ cd /opt/mongodb/mongodb/bin/
- $ ls
- bsondump mongo mongod mongodump mongoexport mongofiles mongoimport
- mongooplog mongoperf mongorestore mongos mongosniff mongostat mongotop
3、要運行這些實用程序,bin 目錄必須對用戶 mongo 具有適當(dāng)?shù)脑L問權(quán) 。使用 root 用戶憑證,并為 mongo 用戶提供對 bin 目錄的適當(dāng)訪問權(quán)。
4、驗證第 2 步中所示的實用程序是否位于 bin 目錄下。
5、調(diào)用 MongoDB shell 時有兩個選項:一個使用 SSL,一個不使用 SSL。下面給出了兩個選項的使用說明。
a、要調(diào)用 MongoDB shell,請使用以下選項運行 mongo 命令:
- $ ./mongo - - host pre-mongo01.ibmcloud.com - - port 27017
如果不使用 SSL 調(diào)用 MongoDB shell,請使用以下選項運行 mongo
b、命令:
- $ ./mongo --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem--sslPEMKeyPassword
- password123 pre-mongo01.ibmcloud.com:27017
其中:
- Certification file :/opt/mongodb/mongodb/cert/mongo.server.trust-certs.pem
- password123 :sslPEMKeyPassword
- port no :27017
- Hostname :pre-mongo01.ibmcloud.com
備注:在這里,您將獲得 MongoDB shell V3.2。現(xiàn)在可以執(zhí)行各種操作了。
本文使用 SSL 執(zhí)行 MongoDB 命令和實用程序。
- > show dbs
- testdb1 0.800GB
- local 0.000GB
- mydb 0.300GB
MongoDB 備份和還原功能
要備份 MongoDB 數(shù)據(jù)庫,請使用 mongodump 實用程序,它位于 bin 目錄中。這會將所有數(shù)據(jù)都備份到默認(rèn)位置 /bin/dump 上的 dump 文件夾中。MongoDB 使用默認(rèn)端口 27017??梢允褂脤嵱贸绦?mongodump 執(zhí)行熱(在線)和冷(離線)備份。
離線 MongoDB 備份
MongoDB 服務(wù)器有一個主要的守護(hù)進(jìn)程,名為 mongod 。 Mongod 管理數(shù)據(jù)訪問、數(shù)據(jù)請求和后臺操作。要執(zhí)行離線備份,首先要停止 mongod 服務(wù),這會停止 MongoDB 實例。然后,執(zhí)行備份并啟動 MongoDB 實例。
要創(chuàng)建離線 MongoDB 備份,請執(zhí)行以下操作:
創(chuàng)建一個備份目錄?;?MongoDB 數(shù)據(jù)庫的大小,在各個備份位置創(chuàng)建備份目錄。在這里,將備份目錄創(chuàng)建為 /mongo_data/backup:
- # mkdir /mongo_data/backup
- # ls –l
2、將所有者更改為用戶 mongo :
- # chown -R mongo:mongogrp /mongo_data/backup/
- # ls –l
3、停止 mongod 實例:
- service mongod stop
4、執(zhí)行離線備份。首先,以 mongo 用戶身份進(jìn)行登錄并找到 bin 目錄:
- $ pwd
- /opt/mongodb/mongodb/bin
- $./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem
- --sslPEMKeyPassword password123 --host pre-mongo01.ibmcloud.com:27017 --out /mongo_data/backup/
5、啟動 mongod 實例,方法是鍵入 service mongod start 。
在線 MongoDB 備份
要執(zhí)行在線備份,請連續(xù)運行 mongodump 命令,然后重新啟動 mongod 實例??梢允褂没虿皇褂?SSL 來運行此命令。兩個命令都在下方給出。
要使用 SSL 執(zhí)行 mongodump 命令,該命令看起來類似于:
- $./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem
- --sslPEMKeyPassword password123 --host pre-mongo01.ibmcloud.com:27017 --out /mongo_data/backup/
要不使用 SSL 執(zhí)行 mongodump 命令,該命令看起來類似于:
- $ ./mongodump -- host pre-mongo01.ibmcloud.com --port 27017 --out /mongo_data/backup/
使用 mongodump 執(zhí)行小型分片集群備份
如果分片集群包含一個小數(shù)據(jù)集,可以使用 mongodump 連接到 mongos 。
在 MongoDB 分片集群中, mongodump 是處理來自應(yīng)用層的查詢的路由服務(wù)。為了執(zhí)行該操作,它會確定此數(shù)據(jù)在分片集群中的位置。
如果基礎(chǔ)架構(gòu)可以在合理的時間量內(nèi)執(zhí)行完整備份,而且一個存儲系統(tǒng)可以保存整個 MongoDB 數(shù)據(jù)集,那么可以創(chuàng)建 MongoDB 集群備份。默認(rèn)情況下, mongodump 向非主要節(jié)點發(fā)出其查詢。
要對分片集群執(zhí)行備份,請使用 mongodump ,如以下命令所示:
- $ ./mongodump -- host pre-mongo01.ibmcloud.com --port 27017
備注:在 mongodump 捕獲輸出期間,應(yīng)用程序可以繼續(xù)修改數(shù)據(jù)。對于副本集, mongodump 提供了 --oplog 選項,以便包含在執(zhí)行 mongodump 操作期間生成的輸出 oplog 條目。這允許相應(yīng)的 mongorestore 操作重放捕獲到的 oplog。要還原使用 --oplog 創(chuàng)建的備份,請使用 mongorestore 和 --oplogReplay 選項。但是,對于副本集,可以考慮 MongoDB Cloud Manager 或 Ops Manager。
恢復(fù)場景
如果知道故障是如何發(fā)生的和如何從故障中恢復(fù),那么可以更好地規(guī)劃和避免故障場景。以下各節(jié)將模擬不同類型的故障,并給出在您的環(huán)境中出現(xiàn)其中一種故障時可以執(zhí)行的一系列步驟。
場景 1.整個數(shù)據(jù)庫意外丟棄或受損壞
人為錯誤或硬件故障可能損害或損壞整個數(shù)據(jù)庫。如果出現(xiàn)這種情況,可以應(yīng)用 mongodump 的***一次完整備份恢復(fù)整個數(shù)據(jù)庫,并使用 mongorestore 實用程序還原它。
在此場景中,我們假設(shè)數(shù)據(jù)庫為 testdb1,其中的集合(比如 users 和 students)包含一些記錄,如下所示。
第 1 步.驗證數(shù)據(jù)庫和集合
a、以 mongo 用戶身份進(jìn)行登錄:
- $ sudo su – mongo
b、找到 bin 目錄:
- $ cd /opt/mongodb/mongodb/bin/
c、調(diào)用 MongoDB shell:
- $ ./mongo --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem --sslPEMKeyPassword password123 pre-mongo01.ibmcloud.com:27017
d、驗證數(shù)據(jù)庫和集合:
- > show dbs
- testdb1 0.800GB
- local 0.000GB
- mydb 0.300GB
- > use testdb1
- switched to db testdb1
- > show collections
- student
- users
- > db.student.find({},{_id:0})
- { "rollno" : 1, "name" : "amol", "subject" : "english", "marks" : 90 }
- { "rollno" : 2, "name" : "rachna", "subject" : "english", "marks" : 85
- }
- { "rollno" : 3, "name" : "Bob", "subject" : "english", "marks" : 75 }
- > db.users.find({},{_id:0})
- { "name" : "Amol", "age" : 39 }
- { "name" : "Bob", "age" : 30 }
- { "name" : "Rachna", "age" : 36 }
- { "name" : "Aadya", "age" : 3 }
第 2 步.備份整個數(shù)據(jù)庫
使用以下代碼備份整個數(shù)據(jù)庫:
- $./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem --sslPEMKeyPassword password123 --host pre-mongo01.ibmcloud.com:27017 –db testdb1 --out /mongo_data/backup/
- 2017-01-24T04:14:07.252-0500 writing testdb1.student to
- 2017-01-24T04:14:07.253-0500 writing testdb1.users to
- 2017-01-24T04:14:07.254-0500 done dumping testdb1.student (3 documents)
- 2017-01-24T04:14:07.254-0500 done dumping testdb1.users (3 documents)
第 3 步.模擬故障
要模擬故障場景,需要完全丟棄數(shù)據(jù)庫。
a、連接到數(shù)據(jù)庫:
- > use testdb1
- switched to db mydb
b、驗證集合:
- > show collections
- student
- users
c、驗證當(dāng)前數(shù)據(jù)庫:
- > db
- testdb1
d、丟棄數(shù)據(jù)庫:
- > db.dropDatabase()
- { "dropped" : "testdb1", "ok" : 1 }
第 4 步.還原數(shù)據(jù)庫 testdb1
使用實用程序 mongorestore 還原備份鏡像,如下所示。在此示例中,還原的***備份鏡像位于備份位置 /mongo_data/backup/testdb1 。
- $ ./mongorestore --ssl --sslCAFile
- ../cert/mongo.server.trust-certs.pem --sslPEMKeyPassword password123 --host
- pre-mongo01.ibmcloud.com:27017 --db testdb1 /mongo_data/backup/testdb1
第 5 步.驗證數(shù)據(jù)庫和集合
要驗證數(shù)據(jù)庫是否已還原,請連接到數(shù)據(jù)庫并查詢集合:
- > show dbs
- testdb1 0.800GB
- local 0.000GB
- mydb 0.300GB
- > use testdb1
- switched to db testdb1
- > show collections
- student
- users
- > db.student.find({},{_id:0})
- > db.users.find({},{_id:0})
場景 2.意外丟棄某個集合
有時,尤其是在數(shù)據(jù)庫中有成千上萬個集合時,可能會意外丟棄某個集合。要恢復(fù)意外丟棄的集合,需要使用備份位置上該集合(例如 collection.name.bson )的***備份。在此場景中,我將介紹如何使用集合 student 執(zhí)行這些功能,該集合遭到丟棄并使用 mongorestore 實用程序還原它。
第 1 步.驗證集合
使用以下代碼驗證集合:
- > use testdb1
- switched to db testdb1
- > show collections
- student
- users
- > db.student.find({},{_id:0})
- { "rollno" : 1, "name" : "amol", "subject" : "english", "marks" : 90 }
- { "rollno" : 2, "name" : "rachna", "subject" : "english", "marks" : 85
- }
- { "rollno" : 3, "name" : "Bob", "subject" : "english", "marks" : 75 }
第 2 步.備份集合
僅在集合級別上執(zhí)行備份:
- $./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem--sslPEMKeyPassword password123
- --host pre-mongo01.ibmcloud.com:27017 –db testdb1 --collection student --out /mongo_data/backup
備注:確保在備份位置(例如 mongo_data/backup)上創(chuàng)建了一個文件 student.bson。
第 3 步.模擬故障
要模擬此故障,可完全丟棄該集合。
a、連接到數(shù)據(jù)庫:
- > use testdb1
- switched to db testdb1
b、丟棄集合:
- > db.student.drop()
- true
c、驗證內(nèi)容是否已丟棄:
- > db.student.find({},{name:1,age:1,_id:0})
第 4 步.還原集合
- $./mongorestore --ssl --sslCAFile
- ../cert/mongo.server.trust-certs.pem --sslPEMKeyPassword
- password123 --host pre-mongo01.ibmcloud.com:27017 --db mydb --collection student
- /mongo_data/backup/testdb1/student.bson
備注:可以使用 mongodump 執(zhí)行數(shù)據(jù)庫級備份,如有需要,可以僅從備份目錄還原所需的集合。
第 5 步.驗證集合
要驗證集合是否已還原,請連接到數(shù)據(jù)庫并查詢該集合:
- > use testdb1
- switched to db testdb1
- > show collections
- student
- users
- > db.student.find({},{_id:0})
- { "rollno" : 1, "name" : "amol", "subject" : "english", "marks" : 90 }
- { "rollno" : 2, "name" : "rachna", "subject" : "english", "marks" : 85
- }
- { "rollno" : 3, "name" : "Bob", "subject" : "english", "marks" : 75 }
使用一個 crob 作業(yè)創(chuàng)建和運行備份腳本
要根據(jù)業(yè)務(wù)需求設(shè)置備份策略,需要設(shè)置自定義的備份腳本: run_backup.sh 。還需要設(shè)置一個 cron 作業(yè)來運行此備份。
創(chuàng)建備份腳本
下面的樣本備份腳本 run_backup.sh 基于以下條件。
- 該腳本首先從備份位置刪除超過 30 天的備份鏡像。它在備份位置對所有數(shù)據(jù)庫執(zhí)行每日備份。
- 然后該腳本向日志文件 backup.log 寫入注釋,表明備份操作刪除了哪些內(nèi)容以及執(zhí)行備份的時間。默認(rèn)情況下, mongodump 不會捕獲本地數(shù)據(jù)庫的內(nèi)容。如有需要,應(yīng)該單獨添加它。要使用應(yīng)用程序名稱唯一地標(biāo)識各個數(shù)據(jù)庫備份,必須在備份腳本中定義一些參數(shù)。下一節(jié)將展示此操作。
創(chuàng)建一個備份目錄
以 root 用戶身份進(jìn)行登錄:
- # mkdir /mongo_data/backup
將所有者更改為 mongo 用戶:
- # chown -R mongo:mongogrp /mongo_data/backup
以 mongo 用戶身份進(jìn)行登錄:
- mongo@pre-mongo01
- $pwd
- /mongo_data/backup
創(chuàng)建備份腳本:
- mongo@pre-mongo01:/mongo_data/backup$ vi run_backup.sh
以下代碼給出了備份腳本的樣本內(nèi)容:
- #/bin/bash
- cd /opt/mongodb/mongodb/bin/
- echo `date` >>/mongo_data/backup/backup.log
- APP_NAME="app1"
- MONGO_HOST="pre-mongo01.ibmcloud.com"
- MONGO_PORT="27017"
- TIMESTAMP=`date +%F-%H%M`
- MONGODUMP_PATH="/opt/mongodb/mongodb/bin/mongodump"
- BACKUPS_DIR="/mongo_data/backup/$APP_NAME-$TIMESTAMP"
- BACKUP_NAME="/mongo_data/backup/$APP_NAME-$TIMESTAMP"
- mkdir -p $BACKUPS_DIR
- cd /opt/mongodb/mongodb/bin/
- #Delete all backups older than 30 days from /mongo_data/backup
- echo "Deleting following backup files older than 30 days:" >>
- /mongo_data/backup/backup.log
- find /mongo_data/backup/ -type d -name 'app1-*' -mtime +30 >>
- /mongo_data/backup/backup.log
- find /mongo_data/backup/ -type d -name 'app1-*' -mtime +30 -exec rm -rf {}
- +
- #Run the daily backup 'local' database only.
- for databaseName in local
- do
- echo "Starting daily backup of $databaseName ...." >>
- /mongo_data/backup/backup.log
- ./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem
- --sslPEMKeyPassword password123 --host pre-mongo01.ibmcloud.com:27017 --db
- $databaseName >>/mongo_data/backup/backup.log
- #Run the daily backup of remaining databases.
- echo "Starting daily backup of all databases...." >>
- /mongo_data/backup/backup.log
- ./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem
- --sslPEMKeyPassword password123 --host pre-mongo01.ibmcloud.com:27017
- >>/mongo_data/backup/backup.log
- if [ $? != 0 ]; then
- echo "Failed to make backup of $databaseName on `date +%F_%T`"|mailx -s
- "MongoDB backup failed" amolbarsagade@in.ibm.com
- fi
- done
- mv /opt/mongodb/mongodb/bin/dump $BACKUP_NAME
- echo `date` >> /mongo_data/backup/backup.log
- echo "End of backup run" >> /mongo_data/backup/backup.log
- echo "----------------------------------" >>
- /mongo_data/backup/backup.log
授予權(quán)限
保存該文件并向它授予 755 權(quán)限:
- mongo@pre-mongo01:/mongo_data/backup$ chmod 755 run_backup.sh
創(chuàng)建一個 cron 作業(yè)來運行備份腳本
在 mongo_data/backup 位置創(chuàng)建一個名為 mycron.txt 的新 cron 作業(yè),并根據(jù)備份策略來調(diào)度它。
以 mongo 用戶身份進(jìn)行登錄:
- mongo@pre-mongo01
- :/mongo_data/backup$ pwd
- /mongo_data/backup
檢查 mongo 用戶的現(xiàn)有 cron 作業(yè):
- mongo@pre-mongo01:/mongo_data/backup$ crontab -l
- no crontab for mongo
創(chuàng)建一個新 cron 作業(yè):
- mongo@pre-mongo01:/mongo_data/backup$ vi mycron.txt
根據(jù)備份策略添加運行此 crob 作業(yè)的備份時間表。例如:
- 30 02 * * * /mongo_data/backup/run_backup.sh >> /mongo_data/backup/run_backup.sh.out
設(shè)置 cron 作業(yè)并驗證它:
- mongo@pre-mongo01:/mongo_data/backup$ crontab mycron.txt
- mongo@pre-mongo01:/mongo_data/backup$ crontab -l
- 30 02 * * * /mongo_data/backup/run_backup.sh >>
- /mongo_data/backup/run_backup.sh.out
結(jié)束語
您已為 MongoDB 數(shù)據(jù)庫服務(wù)器配置并運行了備份腳本,并更好地了解了如何使用 mongodump 和 mongorestore 實用程序執(zhí)行備份和還原。您使用一個 cron 作業(yè)調(diào)度并運行了備份腳本??梢允褂迷搨浞菽_本來調(diào)度、維護(hù)和管理 MongoDB 數(shù)據(jù)庫服務(wù)器的備份。
分享題目:為MongoDB服務(wù)器配置備份腳本
URL標(biāo)題:http://www.5511xx.com/article/ccddeii.html


咨詢
建站咨詢
