Mongodb備份恢復(mongodump,mongorestore方式)

Mongodb備份恢復(mongodump,mongorestore方式)

2015年07月03日 14:53:11mysql

閱讀數:7262sql

一:備份

 

1.1 備份全部數據庫

 

[root@ser6-52 mongodbbackup.bak]# mongodump -u superuser -p 123456  --authenticationDatabase admin -o /backup/mongodb/full_bak_201507021651.bak
connected to: 127.0.0.1
2015-07-02T16:51:08.291+0800 all dbs
2015-07-02T16:51:08.291+0800 DATABASE: admin	 to 	/backup/mongodb/full_bak_201507021651.bak/admin
2015-07-02T16:51:08.292+0800 	admin.system.indexes to /backup/mongodb/full_bak_201507021651.bak/admin/system.indexes.bson
2015-07-02T16:51:08.292+0800 	  3 documents
2015-07-02T16:51:08.292+0800 	admin.system.version to /backup/mongodb/full_bak_201507021651.bak/admin/system.version.bson
2015-07-02T16:51:08.293+0800 	  1 documents
2015-07-02T16:51:08.293+0800 	Metadata for admin.system.version to /backup/mongodb/full_bak_201507021651.bak/admin/system.version.metadata.json
2015-07-02T16:51:08.293+0800 	admin.system.users to /backup/mongodb/full_bak_201507021651.bak/admin/system.users.bson
2015-07-02T16:51:08.294+0800 	  2 documents
2015-07-02T16:51:08.294+0800 	Metadata for admin.system.users to /backup/mongodb/full_bak_201507021651.bak/admin/system.users.metadata.json
2015-07-02T16:51:08.294+0800 DATABASE: myTest	 to 	/backup/mongodb/full_bak_201507021651.bak/myTest
2015-07-02T16:51:08.294+0800 	myTest.system.indexes to /backup/mongodb/full_bak_201507021651.bak/myTest/system.indexes.bson
2015-07-02T16:51:08.295+0800 	  2 documents
2015-07-02T16:51:08.295+0800 	myTest.c to /backup/mongodb/full_bak_201507021651.bak/myTest/c.bson
2015-07-02T16:51:08.298+0800 	  2000 documents
2015-07-02T16:51:08.299+0800 	Metadata for myTest.c to /backup/mongodb/full_bak_201507021651.bak/myTest/c.metadata.json
2015-07-02T16:51:08.299+0800 	myTest.d to /backup/mongodb/full_bak_201507021651.bak/myTest/d.bson
2015-07-02T16:51:08.299+0800 	  11 documents
2015-07-02T16:51:08.299+0800 	Metadata for myTest.d to /backup/mongodb/full_bak_201507021651.bak/myTest/d.metadata.json

 

 

1.2 備份單個數據庫

 

 

[root@ser6-52 myTest]# mongodump -d myTest -u superuser -p 123456  --authenticationDatabase admin -o /backup/mongodb/myTest_bak_201507021653.bak
connected to: 127.0.0.1
2015-07-02T16:53:35.183+0800 DATABASE: myTest	 to 	/backup/mongodb/myTest_bak_201507021653.bak/myTest
2015-07-02T16:53:35.184+0800 	myTest.system.indexes to /backup/mongodb/myTest_bak_201507021653.bak/myTest/system.indexes.bson
2015-07-02T16:53:35.185+0800 	  2 documents
2015-07-02T16:53:35.185+0800 	myTest.c to /backup/mongodb/myTest_bak_201507021653.bak/myTest/c.bson
2015-07-02T16:53:35.189+0800 	  2000 documents
2015-07-02T16:53:35.189+0800 	Metadata for myTest.c to /backup/mongodb/myTest_bak_201507021653.bak/myTest/c.metadata.json
2015-07-02T16:53:35.189+0800 	myTest.d to /backup/mongodb/myTest_bak_201507021653.bak/myTest/d.bson
2015-07-02T16:53:35.194+0800 	  11 documents
2015-07-02T16:53:35.194+0800 	Metadata for myTest.d to /backup/mongodb/myTest_bak_201507021653.bak/myTest/d.metadata.json

 

 

1.3 備份某個表

 

 

[root@ser6-52 myTest]# mongodump -u  superuser -p 123456  --authenticationDatabase admin -d myTest -c d -o /backup/mongodb/myTest_d_bak_201507021701.bak
connected to: 127.0.0.1
2015-07-02T17:01:47.554+0800 DATABASE: myTest	 to 	/backup/mongodb/myTest_d_bak_201507021701.bak/myTest
2015-07-02T17:01:47.555+0800 	myTest.d to /backup/mongodb/myTest_d_bak_201507021701.bak/myTest/d.bson
2015-07-02T17:01:47.558+0800 	  11 documents
2015-07-02T17:01:47.558+0800 	Metadata for myTest.d to /backup/mongodb/myTest_d_bak_201507021701.bak/myTest/d.metadata.json

 

 

二:恢復

 

2.1 恢復單個表

 

 
  1. > db.d.find();mongodb

  2. { "_id" : ObjectId("5594f048a9a970e631c4c20c"), "d" : 0 }數據庫

  3. { "_id" : ObjectId("5594f048a9a970e631c4c20d"), "d" : 1 }json

  4. { "_id" : ObjectId("5594f048a9a970e631c4c20e"), "d" : 2 }測試

  5. { "_id" : ObjectId("5594f048a9a970e631c4c20f"), "d" : 3 }ui

  6. { "_id" : ObjectId("5594f048a9a970e631c4c210"), "d" : 4 }this

  7. { "_id" : ObjectId("5594f048a9a970e631c4c212"), "d" : 6 }spa

  8. { "_id" : ObjectId("5594f048a9a970e631c4c213"), "d" : 7 }rest

  9. { "_id" : ObjectId("5594f048a9a970e631c4c214"), "d" : 8 }

  10. { "_id" : ObjectId("5594f048a9a970e631c4c215"), "d" : 9 }

  11. { "_id" : ObjectId("5594f0bea9a970e631c4c216"), "d" : 99 }

  12. { "_id" : ObjectId("5594f119a9a970e631c4c217"), "d" : 199 }

  13. > db.d.find().count();

  14. 11

  15.  
  16. > db.d.drop();

  17. true

  18.  
  19. [root@ser6-52 myTest]# mongorestore -u superuser -p 123456 --authenticationDatabase admin -d myTest -c d /backup/mongodb/myTest_d_bak_201507021701.bak/myTest/d.bson

  20. connected to: 127.0.0.1

  21. 2015-07-02T17:23:20.593+0800 /backup/mongodb/myTest_d_bak_201507021701.bak/myTest/d.bson

  22. 2015-07-02T17:23:20.593+0800 going into namespace [myTest.d]

  23. 11 objects found

  24. 2015-07-02T17:23:20.594+0800 Creating index: { key: { _id: 1 }, name: "_id_", ns: "myTest.d" }

  25.  
  26.  
  27. > db.d.find().count();

  28. 11

  29.  

 

 

 

2.2 恢復單個數據庫

 

[root@ser6-52 myTest]# mongorestore -u  superuser -p 123456  --authenticationDatabase admin   /backup/mongodb/myTest_bak_201507021653.bak
connected to: 127.0.0.1
2015-07-02T17:41:00.378+0800 /backup/mongodb/myTest_bak_201507021653.bak/myTest/d.bson
2015-07-02T17:41:00.378+0800 	going into namespace [myTest.d]
Restoring to myTest.d without dropping. Restored data will be inserted without raising errors; check your server log
11 objects found
2015-07-02T17:41:00.378+0800 	Creating index: { key: { _id: 1 }, name: "_id_", ns: "myTest.d" }
2015-07-02T17:41:00.383+0800 /backup/mongodb/myTest_bak_201507021653.bak/myTest/c.bson
2015-07-02T17:41:00.383+0800 	going into namespace [myTest.c]
Restoring to myTest.c without dropping. Restored data will be inserted without raising errors; check your server log
2000 objects found
2015-07-02T17:41:00.390+0800 	Creating index: { key: { _id: 1 }, name: "_id_", ns: "myTest.c" }

 

 

--這裏恢復數據庫的時候沒有指定-d 數據庫名稱,不然報錯(我看網上有的指定了)。個人mongodb版本是2.6.9,也許是個bug吧。

 

2.3 恢復全部數據庫

 

[root@ser6-52 ~]# mongorestore -u  superuser -p 123456  --authenticationDatabase admin   /backup/mongodb/full_bak_201507021651.bak/
connected to: 127.0.0.1
2015-07-03T09:30:20.275+0800 	going into namespace [admin.system.version]
Restoring to admin.system.version without dropping. Restored data will be inserted without raising errors; check your server log
1 objects found
2015-07-03T09:30:20.276+0800 	Creating index: { key: { _id: 1 }, name: "_id_", ns: "admin.system.version" }
2015-07-03T09:30:20.277+0800 /backup/mongodb/full_bak_201507021651.bak/admin/system.users.bson
2015-07-03T09:30:20.277+0800 	going into namespace [admin.system.users]
Restoring to admin.system.users without dropping. Restored data will be inserted without raising errors; check your server log
2 objects found
2015-07-03T09:30:20.282+0800 	Creating index: { key: { _id: 1 }, name: "_id_", ns: "admin.system.users" }
2015-07-03T09:30:20.282+0800 	Creating index: { unique: true, key: { user: 1, db: 1 }, name: "user_1_db_1", ns: "admin.system.users" }
2015-07-03T09:30:20.285+0800 /backup/mongodb/full_bak_201507021651.bak/myTest/d.bson
2015-07-03T09:30:20.285+0800 	going into namespace [myTest.d]
11 objects found
2015-07-03T09:30:20.286+0800 	Creating index: { key: { _id: 1 }, name: "_id_", ns: "myTest.d" }
2015-07-03T09:30:20.288+0800 /backup/mongodb/full_bak_201507021651.bak/myTest/c.bson
2015-07-03T09:30:20.288+0800 	going into namespace [myTest.c]
Restoring to myTest.c without dropping. Restored data will be inserted without raising errors; check your server log
2000 objects found
2015-07-03T09:30:20.295+0800 	Creating index: { key: { _id: 1 }, name: "_id_", ns: "myTest.c" }

 

 

三:mysql與mongodb簡單對比

 

3.1 對比描述

Mongodb:

 

mongorestore恢復的時候,默認不是恢復到備份時刻的狀態。

 

如:

①:假如我備份後,新增了幾條數據,用備份恢復後,那幾條新增的數據還在。

②:若是備份後某條數據被update了,用備份恢復後,數據是update後的結果,不是備份時間點的數據(如本來name='dan',備份後,將dan更新成了nihao,恢復後,數據仍是nihao)

估計是恢復時,遇到_id同樣的值,就沒有作任何處理。

 

Mysql:

mysqldump是先刪表,再建表,插入數據的,默認就能恢復到備份時刻的狀態。

 

3.2 示例

 

3.2.1 mongodb

--備份記錄請參考1.3

 

D表備份的數據有:

 

 
  1. > db.d.find();

  2. { "_id" : ObjectId("5594f048a9a970e631c4c20c"), "d" : 0 }

  3. { "_id" : ObjectId("5594f048a9a970e631c4c20d"), "d" : 1 }

  4. { "_id" : ObjectId("5594f048a9a970e631c4c20e"), "d" : 2 }

  5. { "_id" : ObjectId("5594f048a9a970e631c4c20f"), "d" : 3 }

  6. { "_id" : ObjectId("5594f048a9a970e631c4c210"), "d" : 4 }

  7. { "_id" : ObjectId("5594f048a9a970e631c4c212"), "d" : 6 }

  8. { "_id" : ObjectId("5594f048a9a970e631c4c213"), "d" : 7 }

  9. { "_id" : ObjectId("5594f048a9a970e631c4c214"), "d" : 8 }

  10. { "_id" : ObjectId("5594f048a9a970e631c4c215"), "d" : 9 }

  11. { "_id" : ObjectId("5594f0bea9a970e631c4c216"), "d" : 99 }

  12. { "_id" : ObjectId("5594f119a9a970e631c4c217"), "d" : 199 }

  13.  
  14. #在備份完成後插入一條數據:

  15. d表插入999999後的數據是:

  16. > db.d.find();

  17. { "_id" : ObjectId("5594f048a9a970e631c4c20c"), "d" : 0 }

  18. { "_id" : ObjectId("5594f048a9a970e631c4c20d"), "d" : 1 }

  19. { "_id" : ObjectId("5594f048a9a970e631c4c20e"), "d" : 2 }

  20. { "_id" : ObjectId("5594f048a9a970e631c4c20f"), "d" : 3 }

  21. { "_id" : ObjectId("5594f048a9a970e631c4c210"), "d" : 4 }

  22. { "_id" : ObjectId("5594f048a9a970e631c4c212"), "d" : 6 }

  23. { "_id" : ObjectId("5594f048a9a970e631c4c213"), "d" : 7 }

  24. { "_id" : ObjectId("5594f048a9a970e631c4c214"), "d" : 8 }

  25. { "_id" : ObjectId("5594f048a9a970e631c4c215"), "d" : 9 }

  26. { "_id" : ObjectId("5594f0bea9a970e631c4c216"), "d" : 99 }

  27. { "_id" : ObjectId("5594f119a9a970e631c4c217"), "d" : 199 }

  28. { "_id" : ObjectId("5595ffbcdeae2abeba569b24"), "d" : 999999 }

  29.  
  30. #如今不刪表進行恢復:

  31.  
  32. [root@ser6-52 ~]# mongorestore -u superuser -p 123456 --authenticationDatabase admin -d myTest -c d /backup/mongodb/myTest_d_bak_201507021701.bak/myTest/d.bson

  33. connected to: 127.0.0.1

  34. 2015-07-03T11:41:49.188+0800 /backup/mongodb/myTest_d_bak_201507021701.bak/myTest/d.bson

  35. 2015-07-03T11:41:49.188+0800 going into namespace [myTest.d]

  36. Restoring to myTest.d without dropping. Restored data will be inserted without raising errors; check your server log

  37. 11 objects found

  38. 2015-07-03T11:41:49.189+0800 Creating index: { key: { _id: 1 }, name: "_id_", ns: "myTest.d" }

  39.  
  40. > db.d.find();

  41. { "_id" : ObjectId("5594f048a9a970e631c4c20c"), "d" : 0 }

  42. { "_id" : ObjectId("5594f048a9a970e631c4c20d"), "d" : 1 }

  43. { "_id" : ObjectId("5594f048a9a970e631c4c20e"), "d" : 2 }

  44. { "_id" : ObjectId("5594f048a9a970e631c4c20f"), "d" : 3 }

  45. { "_id" : ObjectId("5594f048a9a970e631c4c210"), "d" : 4 }

  46. { "_id" : ObjectId("5594f048a9a970e631c4c212"), "d" : 6 }

  47. { "_id" : ObjectId("5594f048a9a970e631c4c213"), "d" : 7 }

  48. { "_id" : ObjectId("5594f048a9a970e631c4c214"), "d" : 8 }

  49. { "_id" : ObjectId("5594f048a9a970e631c4c215"), "d" : 9 }

  50. { "_id" : ObjectId("5594f0bea9a970e631c4c216"), "d" : 99 }

  51. { "_id" : ObjectId("5594f119a9a970e631c4c217"), "d" : 199 }

  52. { "_id" : ObjectId("5595ffbcdeae2abeba569b24"), "d" : 999999 }

  53. > db.d.find().count();

  54. 12

恢復後999999依然存在,說明備份後新增的數據在恢復時不會被刪除。

若是備份後某條數據被update了,恢復的時候,數據是怎樣的呢?

 

#準備測試數據

 
  1. use myTest;

  2. > db.e.save({"id":"1","name":"dan","age":25});

  3. WriteResult({ "nInserted" : 1 })

  4. > db.e.save({"id":"2","name":"jiao","age":25});

  5. WriteResult({ "nInserted" : 1 })

  6. > db.e.find();

  7. { "_id" : ObjectId("559627a7deae2abeba569b26"), "id" : "1", "name" : "dan", "age" : 25 }

  8. { "_id" : ObjectId("559627b4deae2abeba569b27"), "id" : "2", "name" : "jiao", "age" : 25 }

#備份

[root@ser6-52 ~]# mongodump -u superuser -p -d myTest -c e -o /backup/mongodb/myTest_e_bak.bak --authenticationDatabase admin
Enter password: 
connected to: 127.0.0.1
2015-07-03T14:13:54.877+0800 DATABASE: myTest	 to 	/backup/mongodb/myTest_e_bak.bak/myTest
2015-07-03T14:13:54.878+0800 	myTest.e to /backup/mongodb/myTest_e_bak.bak/myTest/e.bson
2015-07-03T14:13:54.879+0800 	  2 documents
2015-07-03T14:13:54.879+0800 	Metadata for myTest.e to /backup/mongodb/myTest_e_bak.bak/myTest/e.metadata.json

#更新其中一條數據:

--將id爲2的記錄,name由jiao更新爲jiaojiao

 
  1. > db.e.update({"id":"2"},{$set:{"name":"jiaojiao"}},true,false);

  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

  3. > db.e.find();

  4. { "_id" : ObjectId("559627a7deae2abeba569b26"), "id" : "1", "name" : "dan", "age" : 25 }

  5. { "_id" : ObjectId("559627b4deae2abeba569b27"), "id" : "2", "name" : "jiaojiao", "age" : 25 }

#恢復

[root@ser6-52 ~]# mongorestore -u superuser -p --authenticationDatabase admin -d myTest -c e  /backup/mongodb/myTest_e_bak.bak/myTest/e.bson 
Enter password: 
connected to: 127.0.0.1
2015-07-03T14:19:57.511+0800 /backup/mongodb/myTest_e_bak.bak/myTest/e.bson
2015-07-03T14:19:57.511+0800 	going into namespace [myTest.e]
Restoring to myTest.e without dropping. Restored data will be inserted without raising errors; check your server log
2 objects found
2015-07-03T14:19:57.512+0800 	Creating index: { key: { _id: 1 }, name: "_id_", ns: "myTest.e" }
> db.e.find();
{ "_id" : ObjectId("559627a7deae2abeba569b26"), "id" : "1", "name" : "dan", "age" : 25 }
{ "_id" : ObjectId("559627b4deae2abeba569b27"), "id" : "2", "name" : "jiaojiao", "age" : 25 }

恢復後結果仍然是jiaojiao,不是jiao,說明備份後假若某條記錄被更新了,默認沒法恢復到備份點的狀態。

這和mysqldump不一樣。mysql會恢復到備份點的狀態。

 

恢復的時候加上--drop參數,就能將數據恢復到備份時刻的狀態了。

3.2.2 mysql

#準備測試數據

 

mysql> use dba;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
mysql> create table t1(id int);
Query OK, 0 rows affected (1.62 sec)
 
mysql> insert into t1(id) values(1);
Query OK, 1 row affected (1.88 sec)
 
mysql> insert into t1(id) values(2);
Query OK, 1 row affected (0.27 sec)
 
mysql> commit
    -> ;
Query OK, 0 rows affected (0.00 sec)

 

 

#備份

 

[root@ser6-51 mysql]# mysqldump -u root -p  dba  t1 > /backup/mysql/dba_t1_bak_201507031338.bak
Enter password: 
 
[root@ser6-51 ~]# cd /backup/mysql
[root@ser6-51 mysql]# ls -ltr
total 4
-rw-r--r-- 1 root root 1254 Jul  3 13:37 dba_t1_bak_201507031338.bak

 

 

該備份腳本內容:

[root@ser6-51 mysql]# cat dba_t1_bak_201507031338.bak 

 

-- MySQL dump 10.13  Distrib 5.6.20, for Linux (x86_64)
--
-- Host: localhost    Database: dba
-- ------------------------------------------------------
-- Server version	5.6.20-r5436-log
 
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 
--
-- Table structure for table `t1`
--
 
DROP TABLE IF EXISTS `t1`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
 
--
-- Dumping data for table `t1`
--
 
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
INSERT INTO `t1` VALUES (1),(2);
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
-- Dump completed on 2015-07-03 13:49:24

 

 

 

#插入一條數據

mysql> insert into t1(id) values(3);

Query OK, 1 row affected (0.60 sec)

 

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

 

#恢復

[root@ser6-51 mysql]# mysql -u root -p  dba < /backup/mysql/dba_t1_bak_201507031338.bak 

Enter password: 

 

mysql> select * from t1;

+------+

| id   |

+------+

|    1 |

|    2 |

+------+

2 rows in set (0.00 sec)

 

新插入的id爲3的記錄沒有了。

 

此時,我刪除其中一條數據:

mysql> delete from t1 where id = 1;

Query OK, 1 row affected (0.33 sec)

 

mysql> commit;

 

恢復:

[root@ser6-51 mysql]# mysql -u root -p  dba < /backup/mysql/dba_t1_bak_201507031338.bak 

Enter password: 

 

 

mysql> select * from t1;

+------+

| id   |

+------+

|    1 |

|    2 |

+------+

2 rows in set (0.04 sec)

 

由於Mysql就是先刪表,再插入的,只能恢復到備份時刻那個點的狀態。

 

#我用的是mongodb版本是2.6.9 

 #初學,本身研究的,可能有漏洞,僅供參考,歡迎指正。

相關文章
相關標籤/搜索