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

創(chuàng)新互聯(lián)主營(yíng)金灣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app開發(fā)定制,金灣h5重慶小程序開發(fā)搭建,金灣網(wǎng)站營(yíng)銷推廣歡迎金灣等地區(qū)企業(yè)咨詢
設(shè)置 MongoDB 實(shí)例
執(zhí)行以下步驟,設(shè)計(jì)可通過 cron 作業(yè)自動(dòng)運(yùn)行的 MongoDB 備份腳本??筛鶕?jù)業(yè)務(wù)需求來自定義備份腳本。
備注:要跟隨本教程中的步驟進(jìn)行操作,請(qǐng)創(chuàng)建一個(gè)單獨(dú)的用戶(例如名為 mongo 的用戶),在 MongoDB 中執(zhí)行管理操作。
1、從 MongoDB Download Center 安裝 MongoDB。MongoDB 二進(jìn)制文件位于 /opt/mongodb/mongodb/bin/ 目錄中。安裝 MongoDB 時(shí)使用 root 用戶憑證。
2、以 root 用戶身份進(jìn)行登錄,然后創(chuàng)建一個(gè)組和用戶:
- # groupadd mongogrp
- # vi /etc/group
- mongogrp:x:1005:
3、將用戶 mongo 添加到剛創(chuàng)建的組 mongogrp 中:
- # useradd mongo -d /home/mongo -f -1 -g mongogrp -m
4、驗(yàn)證是否已創(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、打開一個(gè)新會(huì)話并以用戶 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、要運(yùn)行這些實(shí)用程序,bin 目錄必須對(duì)用戶 mongo 具有適當(dāng)?shù)脑L問權(quán) 。使用 root 用戶憑證,并為 mongo 用戶提供對(duì) bin 目錄的適當(dāng)訪問權(quán)。
4、驗(yàn)證第 2 步中所示的實(shí)用程序是否位于 bin 目錄下。
5、調(diào)用 MongoDB shell 時(shí)有兩個(gè)選項(xiàng):一個(gè)使用 SSL,一個(gè)不使用 SSL。下面給出了兩個(gè)選項(xiàng)的使用說明。
a、要調(diào)用 MongoDB shell,請(qǐng)使用以下選項(xiàng)運(yùn)行 mongo 命令:
- $ ./mongo - - host pre-mongo01.ibmcloud.com - - port 27017
如果不使用 SSL 調(diào)用 MongoDB shell,請(qǐng)使用以下選項(xiàng)運(yùn)行 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 命令和實(shí)用程序。
- > show dbs
- testdb1 0.800GB
- local 0.000GB
- mydb 0.300GB
MongoDB 備份和還原功能
要備份 MongoDB 數(shù)據(jù)庫(kù),請(qǐng)使用 mongodump 實(shí)用程序,它位于 bin 目錄中。這會(huì)將所有數(shù)據(jù)都備份到默認(rèn)位置 /bin/dump 上的 dump 文件夾中。MongoDB 使用默認(rèn)端口 27017??梢允褂脤?shí)用程序 mongodump 執(zhí)行熱(在線)和冷(離線)備份。
離線 MongoDB 備份
MongoDB 服務(wù)器有一個(gè)主要的守護(hù)進(jìn)程,名為 mongod 。 Mongod 管理數(shù)據(jù)訪問、數(shù)據(jù)請(qǐng)求和后臺(tái)操作。要執(zhí)行離線備份,首先要停止 mongod 服務(wù),這會(huì)停止 MongoDB 實(shí)例。然后,執(zhí)行備份并啟動(dòng) MongoDB 實(shí)例。
要?jiǎng)?chuàng)建離線 MongoDB 備份,請(qǐng)執(zhí)行以下操作:
創(chuàng)建一個(gè)備份目錄?;?MongoDB 數(shù)據(jù)庫(kù)的大小,在各個(gè)備份位置創(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 實(shí)例:
- 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、啟動(dòng) mongod 實(shí)例,方法是鍵入 service mongod start 。
在線 MongoDB 備份
要執(zhí)行在線備份,請(qǐng)連續(xù)運(yùn)行 mongodump 命令,然后重新啟動(dòng) mongod 實(shí)例??梢允褂没虿皇褂?SSL 來運(yùn)行此命令。兩個(gè)命令都在下方給出。
要使用 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í)行小型分片集群備份
如果分片集群包含一個(gè)小數(shù)據(jù)集,可以使用 mongodump 連接到 mongos 。
在 MongoDB 分片集群中, mongodump 是處理來自應(yīng)用層的查詢的路由服務(wù)。為了執(zhí)行該操作,它會(huì)確定此數(shù)據(jù)在分片集群中的位置。
如果基礎(chǔ)架構(gòu)可以在合理的時(shí)間量?jī)?nèi)執(zhí)行完整備份,而且一個(gè)存儲(chǔ)系統(tǒng)可以保存整個(gè) MongoDB 數(shù)據(jù)集,那么可以創(chuàng)建 MongoDB 集群備份。默認(rèn)情況下, mongodump 向非主要節(jié)點(diǎn)發(fā)出其查詢。
要對(duì)分片集群執(zhí)行備份,請(qǐng)使用 mongodump ,如以下命令所示:
- $ ./mongodump -- host pre-mongo01.ibmcloud.com --port 27017
備注:在 mongodump 捕獲輸出期間,應(yīng)用程序可以繼續(xù)修改數(shù)據(jù)。對(duì)于副本集, mongodump 提供了 --oplog 選項(xiàng),以便包含在執(zhí)行 mongodump 操作期間生成的輸出 oplog 條目。這允許相應(yīng)的 mongorestore 操作重放捕獲到的 oplog。要還原使用 --oplog 創(chuàng)建的備份,請(qǐng)使用 mongorestore 和 --oplogReplay 選項(xiàng)。但是,對(duì)于副本集,可以考慮 MongoDB Cloud Manager 或 Ops Manager。
恢復(fù)場(chǎng)景
如果知道故障是如何發(fā)生的和如何從故障中恢復(fù),那么可以更好地規(guī)劃和避免故障場(chǎng)景。以下各節(jié)將模擬不同類型的故障,并給出在您的環(huán)境中出現(xiàn)其中一種故障時(shí)可以執(zhí)行的一系列步驟。
場(chǎng)景 1.整個(gè)數(shù)據(jù)庫(kù)意外丟棄或受損壞
人為錯(cuò)誤或硬件故障可能損害或損壞整個(gè)數(shù)據(jù)庫(kù)。如果出現(xiàn)這種情況,可以應(yīng)用 mongodump 的***一次完整備份恢復(fù)整個(gè)數(shù)據(jù)庫(kù),并使用 mongorestore 實(shí)用程序還原它。
在此場(chǎng)景中,我們假設(shè)數(shù)據(jù)庫(kù)為 testdb1,其中的集合(比如 users 和 students)包含一些記錄,如下所示。
第 1 步.驗(yàn)證數(shù)據(jù)庫(kù)和集合
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、驗(yàn)證數(shù)據(jù)庫(kù)和集合:
- > 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 步.備份整個(gè)數(shù)據(jù)庫(kù)
使用以下代碼備份整個(gè)數(shù)據(jù)庫(kù):
- $./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 步.模擬故障
要模擬故障場(chǎng)景,需要完全丟棄數(shù)據(jù)庫(kù)。
a、連接到數(shù)據(jù)庫(kù):
- > use testdb1
- switched to db mydb
b、驗(yàn)證集合:
- > show collections
- student
- users
c、驗(yàn)證當(dāng)前數(shù)據(jù)庫(kù):
- > db
- testdb1
d、丟棄數(shù)據(jù)庫(kù):
- > db.dropDatabase()
- { "dropped" : "testdb1", "ok" : 1 }
第 4 步.還原數(shù)據(jù)庫(kù) testdb1
使用實(shí)用程序 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 步.驗(yàn)證數(shù)據(jù)庫(kù)和集合
要驗(yàn)證數(shù)據(jù)庫(kù)是否已還原,請(qǐng)連接到數(shù)據(jù)庫(kù)并查詢集合:
- > 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})
場(chǎng)景 2.意外丟棄某個(gè)集合
有時(shí),尤其是在數(shù)據(jù)庫(kù)中有成千上萬個(gè)集合時(shí),可能會(huì)意外丟棄某個(gè)集合。要恢復(fù)意外丟棄的集合,需要使用備份位置上該集合(例如 collection.name.bson )的***備份。在此場(chǎng)景中,我將介紹如何使用集合 student 執(zhí)行這些功能,該集合遭到丟棄并使用 mongorestore 實(shí)用程序還原它。
第 1 步.驗(yàn)證集合
使用以下代碼驗(yàn)證集合:
- > 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 步.備份集合
僅在集合級(jí)別上執(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)建了一個(gè)文件 student.bson。
第 3 步.模擬故障
要模擬此故障,可完全丟棄該集合。
a、連接到數(shù)據(jù)庫(kù):
- > use testdb1
- switched to db testdb1
b、丟棄集合:
- > db.student.drop()
- true
c、驗(yàn)證內(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ù)庫(kù)級(jí)備份,如有需要,可以僅從備份目錄還原所需的集合。
第 5 步.驗(yàn)證集合
要驗(yàn)證集合是否已還原,請(qǐng)連接到數(shù)據(jù)庫(kù)并查詢?cè)摷希?nbsp;
- > 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 }
使用一個(gè) crob 作業(yè)創(chuàng)建和運(yùn)行備份腳本
要根據(jù)業(yè)務(wù)需求設(shè)置備份策略,需要設(shè)置自定義的備份腳本: run_backup.sh 。還需要設(shè)置一個(gè) cron 作業(yè)來運(yùn)行此備份。
創(chuàng)建備份腳本
下面的樣本備份腳本 run_backup.sh 基于以下條件。
- 該腳本首先從備份位置刪除超過 30 天的備份鏡像。它在備份位置對(duì)所有數(shù)據(jù)庫(kù)執(zhí)行每日備份。
- 然后該腳本向日志文件 backup.log 寫入注釋,表明備份操作刪除了哪些內(nèi)容以及執(zhí)行備份的時(shí)間。默認(rèn)情況下, mongodump 不會(huì)捕獲本地?cái)?shù)據(jù)庫(kù)的內(nèi)容。如有需要,應(yīng)該單獨(dú)添加它。要使用應(yīng)用程序名稱唯一地標(biāo)識(shí)各個(gè)數(shù)據(jù)庫(kù)備份,必須在備份腳本中定義一些參數(shù)。下一節(jié)將展示此操作。
創(chuàng)建一個(gè)備份目錄
以 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" [email protected]
- 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)建一個(gè) cron 作業(yè)來運(yùn)行備份腳本
在 mongo_data/backup 位置創(chuàng)建一個(gè)名為 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)建一個(gè)新 cron 作業(yè):
- mongo@pre-mongo01:/mongo_data/backup$ vi mycron.txt
根據(jù)備份策略添加運(yùn)行此 crob 作業(yè)的備份時(shí)間表。例如:
- 30 02 * * * /mongo_data/backup/run_backup.sh >> /mongo_data/backup/run_backup.sh.out
設(shè)置 cron 作業(yè)并驗(yàn)證它:
- 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ù)庫(kù)服務(wù)器配置并運(yùn)行了備份腳本,并更好地了解了如何使用 mongodump 和 mongorestore 實(shí)用程序執(zhí)行備份和還原。您使用一個(gè) cron 作業(yè)調(diào)度并運(yùn)行了備份腳本??梢允褂迷搨浞菽_本來調(diào)度、維護(hù)和管理 MongoDB 數(shù)據(jù)庫(kù)服務(wù)器的備份。
網(wǎng)站題目:為MongoDB服務(wù)器配置備份腳本
URL鏈接:http://fisionsoft.com.cn/article/ccddeii.html


咨詢
建站咨詢
