fbpx

MongoDB 教學 – 如何備份與還原 MongoDB

mongo-db-alternate-logoMySql 我們常用 mysqldump 命令備份資料,MongoDB 也一樣帶有基本的資料庫匯出匯入工具,就是 mongodump 與 mongorestore 這兩個命令列工具。Document Database 不同於 Relational Database,所匯出的資料並不是可以直接閱讀的 SQL 本文檔,而是一般的二進位檔案。這些工具在實務上其實都只能用在備份資料量比較小的環境中,如果資料庫已經好幾 T,不管是 MySQL 還是 MongoDB 這樣傳統的備份方法就不適用了,還是要用到 Replication 或 Sharding 這些 Online Backup 的方式比較好用。

利用 mongodump 命令備份 Mongo 資料庫

透過以下命令進行資料庫備份:

mongodump -h 127.0.0.1 -d my-mongo -o ./mongo-backup

mongodump 常用參數說明如下:

-h: 要備份的 MongoDB 連線位置
-d: 要備份的 Database 名稱
-u: 資料庫使用者名稱
-p: 資料庫密碼

執行完成後會在 mongo-backup 目錄下產生備份檔案,以資料庫名稱作為資料夾進行分類。執行畫面如下:

mongodump

利用 mongorestore 命令還原 Mongo 資料庫

要還原剛剛備份的資料庫可以透過以下命令

mongorestore -h 127.0.0.1 -d my-mongo-new --directoryperdb ./mongo-backup/my-mongo

常用參數說明如下:

-h: 要還原的 MongoDB 連線位置
-d: 要還原的 Database 名稱
-u: 資料庫使用者名稱
-p: 資料庫密碼
--directoryperdb: 指定要還原的資料庫檔案來源目錄名稱
--drop: 如果資料庫存在就刪除重新建立 (小心使用)

執行畫面如下:

mongorestore

還原 MongoDB 發生錯誤

如果沒有設定預設環境編碼,還原資料庫時會出現以下錯誤:

terminate called after throwing an instance of 'std::runtime_error'
  what():  locale::facet::_S_create_c_locale name not valid
Aborted (core dumped)

只要設定一下 LC_ALL 這個環境變數即可排除,如下:

export LC_ALL="en_US.UTF-8"

Linux 建立每日備份 Shell Script

#!/bin/sh

# Definded Dump Configuartion
rollingDays=7
dumpFilename="mongodb"
dumpTmpDir="/tmp/mongo-dump-tmp"
backupPath="/root/mongo-backup"
username="username"
password="password"
hostname="127.0.0.1"
database="my-mongo"

#Start Dumpping.......
today=`date "+%Y-%m-%d"`
echo "Today: ${today}"
echo "Start Dumpping......."

# Make backup directory
if ! [ -d "${backupPath}" ] ; then
    echo "make dir : ${backupPath}"
    mkdir -p "${backupPath}"
fi
if ! [ -d "${dumpTmpDir}" ] ; then
    echo "make dir : ${dumpTmpDir}"
    mkdir -p "${dumpTmpDir}"
fi

# Make parameter
dn="-h ${hostname}"
if [ "${username}" != "" ] && [ "${password}" != "" ] ; then
    dn="${dn} -u ${username} -p ${password}"
fi
if [ "${databse}" != "" ] ; then
    dn="${dn} -d ${database}"
fi

# Run backup script
rm -rf -R ${dumpTmpDir}
command="mongodump ${dn} -o ${dumpTmpDir}"
echo $command
$command
if [ $? == 0 ] ; then
    cd "${dumpTmpDir}"
    /bin/tar -zcvf "${backupPath}/${dumpFilename}-${today}.tar.gz" *
    find ${backupPath}/${dumpFilename}-* -mtime +${rollingDays} -exec rm -f {} \;
fi
rm -rf -R ${dumpTmpDir}

上述 Script 如果不給 $database 就會全部備份,需要的人請自行享用,謝謝。

MongoDB 系列文章

  1 comment for “MongoDB 教學 – 如何備份與還原 MongoDB

發佈留言