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>
本文来自博客园,作者:尹正杰,转载请注明原文链接:https://www.cnblogs.com/yinzhengjie/p/18905703,个人微信: "JasonYin2020"(添加时请备注来源及意图备注,有偿付费)
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。