在上文中,我們了解了教你如何利用MySQL學習MongoDB之授權和權限,本文中我們繼續我們的學習之旅,學習兩者的備份和恢復。
在數據庫表丟失或損壞的情況下,備份你的數據庫是很重要的。如果發生系統崩潰,你肯定想能夠將你的表盡可能丟失最少的數據恢復到崩潰發生時的狀態。
1、MySQL備份和恢復
MySQL備份方式大體上分為以下3種:
直接拷貝數據庫文件
使用mysqlhotcopy備份數據庫
使用mysqldump備份數據庫
(1)、直接拷貝數據庫文件
最為直接、快速、方便,缺點是基本上不能實現增量備份。為了保證數據的一致性,需要在靠背文件前,執行以下 SQL 語句:
FLUSH TABLES WITH READ LOCK;
也就是把內存中的數據都刷新到磁盤中,同時鎖定數據表,以保證拷貝過程中不會有新的數據寫入。這種方法備份出來的數據恢復也很簡單,直接拷貝回原來的數據庫目錄下即可。
但對於 Innodb 類型表來說,還需要備份其日志文件,即 ib_logfile* 文件。因為當 Innodb 表損壞時,就可以依靠這些日志文件來恢復。
(2)、使用mysqlhotcopy備份數據庫
mysqlhotcopy 是perl程序。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 來快速備份數據庫。對於備份數據庫或單個表來說它是最快的途徑,但它只能運行在本地服務器上,且mysqlhotcopy 只能備份 MyISAM表,對於Innodb表則無招可施了。
(3)、使用mysqldump備份數據庫
mysqldump 是SQL級別的備份,它將數據表導成 SQL 腳本文件,在不同的 MySQL 版本之間升級時相對比較合適,這也是最主流的備份方法。
2、MongoDB備份和恢復
MongoDB提供了兩個命令來備份(mongodump )和恢復(mongorestore )數據庫。
(1)、mongodump備份工具
我們先看一下此工具的幫助信息:
- [root@localhost bin]# ./mongodump --help
- options:
- --help produce help message
- -v [ --verbose ] be more verbose (include multiple times for more
- verbosity e.g. -vvvvv)
- -h [ --host ] arg mongo host to connect to ( /s1,s2 for
- sets)
- --port arg server port. Can also use --host hostname:port
- --ipv6 enable IPv6 support (disabled by default)
- -u [ --username ] arg username
- -p [ --password ] arg password
- --dbpath arg directly access mongod database files in the given
- path, instead of connecting to a mongod server -
- needs to lock the data directory, so cannot be used
- if a mongod is currently accessing the same path
- --directoryperdb if dbpath specified, each db is in a separate
- directory
- -d [ --db ] arg database to use
- -c [ --collection ] arg collection to use (some commands)
- -o [ --out ] arg (=dump) output directory or "-" for stdout
- -q [ --query ] arg json query
- --oplog Use oplog for point-in-time snapshotting
- --repair try to recover a crashed database
- [root@localhost bin]#
例如我們的系統中有一個叫做”foo”庫,下面我們將演示如何將這個庫備份出來:
- [root@localhost bin]# ./mongodump -d foo -o /data/dump
- connected to: 127.0.0.1
- DATABASE: foo to /data/dump/foo
- foo.system.indexes to /data/dump/foo/system.indexes.bson
- 3 objects
- foo.system.users to /data/dump/foo/system.users.bson
- 1 objects
- foo.t2 to /data/dump/foo/t2.bson
- 1 objects
- foo.t1 to /data/dump/foo/t1.bson
- 2 objects
- [root@localhost bin]#
通過工具返回信息,我們可以看到foo中的數據已經被備份成bson格式的文件了, 接下來我們到備份的目錄下去驗證一下:
- [root@localhost dump]# ll /data/dump/foo/
- 總計 16
- -rw-r--r-- 1 root root 193 04-22 11:55 system.indexes.bson
- -rw-r--r-- 1 root root 91 04-22 11:55 system.users.bson
- -rw-r--r-- 1 root root 66 04-22 11:55 t1.bson
- -rw-r--r-- 1 root root 49 04-22 11:55 t2.bson
- [root@localhost dump]#
結果證明foo庫中的表已經被成功備份出來,接下來我們將演示如何將備份恢復回去。
(2)、mongorestore恢復工具
我們先看一下此工具的幫助信息:
- [root@localhost bin]# ./mongorestore --help
- usage: ./mongorestore [options] [directory or filename to restore from]
- options:
- --help produce help message
- -v [ --verbose ] be more verbose (include multiple times for more
- verbosity e.g. -vvvvv)
- -h [ --host ] arg mongo host to connect to ( /s1,s2 for sets)
- --port arg server port. Can also use --host hostname:port
- --ipv6 enable IPv6 support (disabled by default)
- -u [ --username ] arg username
- -p [ --password ] arg password
- --dbpath arg directly access mongod database files in the given
- path, instead of connecting to a mongod server -
- needs to lock the data directory, so cannot be used
- if a mongod is currently accessing the same path
- --directoryperdb if dbpath specified, each db is in a separate
- directory
- -d [ --db ] arg database to use
- -c [ --collection ] arg collection to use (some commands)
- --objcheck validate object before inserting
- --filter arg filter to apply before inserting
- --drop drop each collection before import
- --oplogReplay replay oplog for point-in-time restore
- [root@localhost bin]#
例如我們先將”foo”庫刪除了:
- [root@localhost bin]# ./mongo
- MongoDB shell version: 1.8.1
- connecting to: test
- > use foo
- switched to db foo
- > db.dropDatabase();
- { "dropped" : "foo", "ok" : 1 }
- > show dbs
- admin 0.0625GB
- local (empty)
- test 0.0625GB
- >
然後下面我們將演示如何恢復這個庫:
- [root@localhost bin]# ./mongorestore --directoryperdb /data/dump
- connected to: 127.0.0.1
- Sun Apr 22 12:01:27 /data/dump/foo/t1.bson
- Sun Apr 22 12:01:27 going into namespace [foo.t1]
- Sun Apr 22 12:01:27 2 objects found
- Sun Apr 22 12:01:27 /data/dump/foo/t2.bson
- Sun Apr 22 12:01:27 going into namespace [foo.t2]
- Sun Apr 22 12:01:27 1 objects found
- Sun Apr 22 12:01:27 /data/dump/foo/system.users.bson
- Sun Apr 22 12:01:27 going into namespace [foo.system.users]
- Sun Apr 22 12:01:27 1 objects found
- Sun Apr 22 12:01:27 /data/dump/foo/system.indexes.bson
- Sun Apr 22 12:01:27 going into namespace [foo.system.indexes]
- Sun Apr 22 12:01:27 { name: "_id_", ns: "foo.system.users", key: { _id: 1 }, v: 0 }
- Sun Apr 22 12:01:27 { name: "_id_", ns: "foo.t2", key: { _id: 1 }, v: 0 }
- Sun Apr 22 12:01:27 { name: "_id_", ns: "foo.t1", key: { _id: 1 }, v: 0 }
- Sun Apr 22 12:01:27 3 objects found
- [root@localhost bin]#
通過工具返回信息,我們可以看到foo中的數據已經被恢復回來了, 接下來我們到庫裡去驗證一下:
- [root@localhost bin]# ./mongo
- MongoDB shell version: 1.8.1
- connecting to: test
- > use foo
- switched to db foo
- > show collections;
- system.indexes
- system.users
- t1
- t2
- >
結果證明foo庫表已經被成功恢復回來了。