我的位置:首頁 >   > 

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

    發表時間:
    2015-01-09 |
    1396




    在 MySql 之中,我們常用 mysqldump 命令來備份資料,至於 MongoDB,其實也帶有基本的資料庫匯出匯入工具,就是 mongodump 與 mongorestore 這兩個命令列工具。Document Database 不同於 Relational Database,所匯出的資料並不是可以直接閱讀的 SQL 本文檔,而是一般的二進位檔案。實際上這些工具都只能用作備份資料量比較小的環境中,如果資料庫的容量已經是數 TB,不管是 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 目錄下產生備份檔案,以資料庫名稱作為資料夾進行分類。執行畫面如下:



    利用 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: 如果資料庫存在就刪除及重新建立 (小心使用)

    執行畫面如下:

    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 就會全部備份,不需要的人請自行修改,謝謝。