MongoDB集群的备份和恢复之mongoexport和mongoimport

                                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.备份工具介绍

1.备份的目的

虽然有复制集的高可用性保证,数据丢失的可能很低,但仍然需要备份。

备份的效果:
	- 1.防止硬件故障引起的数据丢失;
	- 2.防止人为错误误删除数据;
	- 3.时间回溯;
	- 4.监管要求;

2.mongoexport/mongoimport概述

mongoexport/mongoimport可以实现逻辑备份,类似于mysqldump,可以导出json或CSV格式文件。

应用场景总结:
	- 1.异构平台迁移,比如:MySQL和MongoDB;
	- 2.同平台跨大版本的MongoDB数据导出导入,比如:MongoDB 5.x ---> MongoDB 8.x;

3.安装备份工具

	1.下载数据库工具包
如上图所示,按照步骤点击下载软件包。

参考链接:
	https://www.mongodb.com/try/download/database-tools


	2.解压软件包
[root@node-exporter41 ~]# tar xf mongodb-database-tools-ubuntu2204-x86_64-100.12.1.tgz  -C /usr/local/
[root@node-exporter41 ~]# 


	3.配置环境变量
[root@node-exporter41 ~]# cat /etc/profile.d/mongo.sh
#!/bin/bash
# Filename: mongo.sh

export MONGODB_HOME=/usr/local/mongodb-database-tools-ubuntu2204-x86_64-100.12.1
export PATH=$PATH:$MONGODB_HOME/bin
[root@node-exporter41 ~]# 
[root@node-exporter41 ~]# source /etc/profile.d/mongo.sh
[root@node-exporter41 ~]# 
[root@node-exporter41 ~]# mongo  # 连续按2次tab键
mongod        mongoexport   mongoimport   mongos        mongostat     
mongodump     mongofiles    mongorestore  mongosh       mongotop      
[root@node-exporter41 ~]# mongo

二.mongoexport/mongoimport备份工具实战

1.mongoexport导出工具

1.1 常用参数解读

[root@node-exporter41 ~]# mongoexport --help
...
    -h, --host=<hostname>
        指定数据库宿主机的IP。
    -u, --username=<username>
        指定数据库的用户名。
    -p, --password=<password>
        指定数据库的密码。
    -d, --db=<database-name>
        指定数据库的名称。
    -c, --collection=<collection-name>
        指定collection的名称。
    -f, --fields=<field>[,<field>]* 
        指定要导出哪些列。
    --type=csv | --csv
        指定导出的csv格式,默认json格式。        
    -o, --out=<filename> 
        指定要导出的文件名。
    -q, --query=<json>
        指定要导出数据的过滤条件。
    --authenticationDatabase <验证库>
        指定验证库。

1.2 备份数据实战案例

	1.准备测试数据
use yinzhengjie
db.createCollection('blog')
db.blog.insertOne({"blog":"https://www.cnblogs.com/yinzhengjie"})
db.blog.insertMany([{"auther": "尹正杰"},{"age": 18},{"hobby": ["K8S","BigData"]}])
for(i=0;i<10;i++){db.teacher.insertOne({tid: i, name: "杰哥讲运维"+i,age: 18,date: new Date()})}

	2.单标备份至json格式
[root@node-exporter41 ~]# mongoexport --port 27017 -d yinzhengjie -c blog -o /tmp/yinzhengjie-blog.json
2025-05-23T14:11:40.983+0800	connected to: mongodb://localhost:27017/
2025-05-23T14:11:40.985+0800	exported 4 records
[root@node-exporter41 ~]# 
[root@node-exporter41 ~]# ll /tmp/yinzhengjie-blog.json
-rw-r--r-- 1 root root 277 May 23 14:11 /tmp/yinzhengjie-blog.json
[root@node-exporter41 ~]# 
[root@node-exporter41 ~]# cat /tmp/yinzhengjie-blog.json
{"_id":{"$oid":"6830105aa681ba465501337b"},"blog":"https://www.cnblogs.com/yinzhengjie"}
{"_id":{"$oid":"6830116e3410b32c7301337b"},"auther":"尹正杰"}
{"_id":{"$oid":"6830116e3410b32c7301337c"},"age":18}
{"_id":{"$oid":"6830116e3410b32c7301337d"},"hobby":["K8S","BigData"]}
[root@node-exporter41 ~]# 


	
	3.单表备份至csv格式,则需要使用'--type=csv'参数
[root@node-exporter41 ~]# mongoexport --port 27017  -d yinzhengjie -c blog --type=csv -f auther,hobby -o /tmp/yinzhengjie-blog.csv
2025-05-23T14:12:21.343+0800	connected to: mongodb://localhost:27017/
2025-05-23T14:12:21.345+0800	exported 4 records
[root@node-exporter41 ~]# 
[root@node-exporter41 ~]# ll /tmp/yinzhengjie-blog.csv
-rw-r--r-- 1 root root 53 May 23 14:12 /tmp/yinzhengjie-blog.csv
[root@node-exporter41 ~]# 
[root@node-exporter41 ~]# cat /tmp/yinzhengjie-blog.csv
auther,hobby
,
尹正杰,
,
,"[""K8S"",""BigData""]"
[root@node-exporter41 ~]#

2.mongoimport导入工具

2.1 常用参数解读

[root@node-exporter41 ~]# mongoimport --help
...
    -h, --host=<hostname>
        指定数据库宿主机的IP。
    -u, --username=<username>
        指定数据库的用户名。
    -p, --password=<password>
        指定数据库的密码。
    -d, --db=<database-name>
        指定数据库的名称。
    -c, --collection=<collection-name>
        指定collection的名称。
    -f, --fields=<field>[,<field>]* 
        指定要导出哪些列。
    --type=csv | --csv
        指定导出的csv格式,默认json格式。     
	-j, --numInsertionWorkers
		同时插入的数量,默认为。
	--headerline 
		指明第一行是列名,不需要导入。

22. 还原数据实战案例

	1.删除表
[root@node-exporter41 ~]# mongosh 
Current Mongosh Log ID:	683013250d6866c14701337a
Connecting to:		mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.4.2
Using MongoDB:		8.0.5
Using Mongosh:		2.4.2

...

test> use yinzhengjie
switched to db yinzhengjie
yinzhengjie> show tables
blog
teacher
yinzhengjie> db.blog.drop()
true
yinzhengjie> 

yinzhengjie> show tables
teacher
yinzhengjie>

	2.进行数据库还原
[root@node-exporter41 ~]# mongoimport -d yinzhengjie -c blog /tmp/yinzhengjie-blog.json 
2025-05-23T14:24:44.112+0800	connected to: mongodb://localhost/
2025-05-23T14:24:44.122+0800	4 document(s) imported successfully. 0 document(s) failed to import.
[root@node-exporter41 ~]# 


	3.再次查看数据
yinzhengjie> show tables
blog
teacher
yinzhengjie> db.blog.find()
[
  {
    _id: ObjectId('6830105aa681ba465501337b'),
    blog: 'https://www.cnblogs.com/yinzhengjie'
  },
  { _id: ObjectId('6830116e3410b32c7301337b'), auther: '尹正杰' },
  { _id: ObjectId('6830116e3410b32c7301337c'), age: 18 },
  {
    _id: ObjectId('6830116e3410b32c7301337d'),
    hobby: [ 'K8S', 'BigData' ]
  }
]
yinzhengjie> 

三.异构平台数据迁移案例将MySQL数据迁移至MongoDB

1 部署MySQL数据库

	1.基于docker部署MySQL 
可以基于二进制或者docker方式部署。

	2.
cat  > /etc/my.cnf <<EOF
[mysqld]
host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
# 确保文件内容能够导出
secure-file-priv=/tmp

[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/
EOF


	3.创建测试数据
DROP TABLE student;
CREATE TABLE student(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL, salary  VARCHAR(255) NOT NULL);
INSERT INTO student(name,salary) VALUES ('YinZhengJie', rand()*10000); 
INSERT INTO student(name,salary) VALUES ('JasonYin', rand()*10000); 
mysql> SELECT * FROM student;
+----+-------------+--------------------+
| id | name        | salary             |
+----+-------------+--------------------+
|  1 | YinZhengJie | 3912.788577296574  |
|  2 | JasonYin    | 1372.7828779935678 |
+----+-------------+--------------------+
2 rows in set (0.00 sec)

mysql> 

2 导出MySQL数据为csv格式

	1.导出MySQL数据到文件
mysql> SELECT * FROM student INTO OUTFILE '/tmp/student.csv';  -- 直接导出到文件,默认以空格分隔字符。
Query OK, 2 rows affected (0.00 sec)

mysql>
mysql> SELECT * FROM student INTO OUTFILE '/tmp/student-field.csv' FIELDS TERMINATED BY ',';  -- 指定分隔符。
Query OK, 2 rows affected (0.00 sec)

mysql> 


	2.查看导入的数据
bash-4.4# cat /tmp/student.csv 
1	YinZhengJie	3912.788577296574
2	JasonYin	1372.7828779935678
bash-4.4# 
bash-4.4# cat /tmp/student-field.csv 
1,YinZhengJie,3912.788577296574
2,JasonYin,1372.7828779935678
bash-4.4#  


温馨提示:
	mysql加载类似于csv格式的数据操作如下:(模拟将mangoDB数据迁移至MySQL)
mysql> CREATE TABLE t1 LIKE student;
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> LOAD DATA INFILE '/tmp/student-field.csv' INTO TABLE t1 FIELDS TERMINATED BY ',';
Query OK, 2 rows affected (0.01 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM t1;
+----+-------------+--------------------+
| id | name        | salary             |
+----+-------------+--------------------+
|  1 | YinZhengJie | 3912.788577296574  |
|  2 | JasonYin    | 1372.7828779935678 |
+----+-------------+--------------------+
2 rows in set (0.00 sec)

mysql> 

3 基于cvs格式导入MongoDB数据库

	1.导入数据
[root@node-exporter41 ~]# mongoimport  -d yinzhengjie -c student -f id,name,salary --type=csv --file /tmp/student-field.csv
2025-05-31T22:31:39.891+0800	connected to: mongodb://localhost/
2025-05-31T22:31:39.902+0800	2 document(s) imported successfully. 0 document(s) failed to import.
[root@node-exporter41 ~]# 


	2.查看数据
[root@node-exporter41 ~]# mongosh
...	
test> use yinzhengjie
switched to db yinzhengjie
yinzhengjie> show tables
blog
student
teacher
yinzhengjie> db.student.find();
[
  {
    _id: ObjectId('683b12cb1c355e1edaed1571'),
    id: 1,
    name: 'YinZhengJie',
    salary: 3912.788577296574
  },
  {
    _id: ObjectId('683b12cb1c355e1edaed1572'),
    id: 2,
    name: 'JasonYin',
    salary: 1372.7828779935678
  }
]
yinzhengjie> 
posted @ 2025-05-31 23:08  尹正杰  阅读(161)  评论(0)    收藏  举报