首页 技术 正文
技术 2022年11月17日
0 收藏 383 点赞 3,743 浏览 2931 个字

1.基于数据文件的备份

直接将原始的数据文件Copy至备份的地方,这个方法的优点是比较快,因为备份和恢复都不需要转换数据格式。缺点就是需要锁住数据库服务器,但是此方案通常备份是在从节点上进行,备份过程不影响应用的正常运行。

如果不锁住数据,经常会导致复制文件中断,另外就是保证数据文件的一致性状态。

主要命令:

加锁的命令–db.fsyncLock()

注意:锁之后的任何尝试写入都会被阻止,而且读操作也会被阻止。新的连接尝试也会被阻止。

解锁的命令–db.fsyncUnlock()

注意:这仅仅是个解锁请求,数据库可能无法正确解锁。运行db.currentOp方法可以验证数据库是否还处于锁状态。

2.mongodump

mongodump导出的是bson格式,是二进制形式。此工具对于恢复整个实例、单个数据库、指定集合都十分有用。他们可以用于备份实时运行的数据库(无需锁住或者关闭数据库)。

mongorestore用于读取恢复这些文件。

部分主要命令参数 如下:

-h [ –host ]   –数据库所在主机IP地址;

–port           –mongodb使用的端口号;

-u [ –username ]–登陆用户名;

-p [ –password ] –用户的登陆密码;

-d [ –db ]  –准备备份的数据库;

-c [ –collection ] –准备备份的集合;

-o [ –out ] –导出数据将要保存在的目录;

-q [ –query ] –指定备份的查询条件;

–oplog –快照式备份,保证数据的时间一致性和完整性;

–authenticationDatabase –用户的登录验证数据库

–gzip –备份文件压缩

例子:

将端口为37017的MongoDB数据备份到 /opt/backup/mongodump-2011-10-24 路径下,登入验证需输入密码。

mongodump --host mongodb1.example.net --port  --username user --password "pass" --out /opt/backup/mongodump---

3.mongoexport

mongoexport命令行用于数据的导出,默认导出的文件格式为JSON格式,还支持csv格式。

部分主要命令参数 如下:

-h,–host :代表远程连接的数据库地址,默认连接本地Mongo数据库;

–port:代表远程连接的数据库的端口,默认连接的远程端口27017;

-u,–username:代表连接远程数据库的账号,如果设置数据库的认证,需要指定用户账号;

-p,–password:代表连接数据库的账号对应的密码;

-d,–db:代表连接的数据库;

-c,–collection:代表连接数据库中的集合;

-f, –fields:代表集合中的字段,可以根据设置选择导出的字段;

–type:代表导出输出的文件类型,包括csv和json文件;

-o, –out:代表导出的文件名;

-q, –query:代表查询条件;

与mongodump相比,从功能上来讲,mongoexport可以细化到集合中的字段,可以根据需要只导出指定的字段。从文件格式上来看,不再是Bson格式的文件,而是直接可读的Json或CSV文件,容易被第三方程序读取利用。缺点就是备份性能减低了。

在开发的数据变更需求中,有时候 考虑到 数据的重要性和可溯性,部分需求会要求我们将数据临时备份到一个集合中,便于回滚和查询比较。这时候登录到服务器上,根据条件执行mongoexport 导出和 mongoimport 再次导入, 虽然可以实现备份的需求,但这有一个前提要求,就是有服务器登入和执行的权限,且过程还相对繁琐。如果MongodB部署在云上,上面mongoexport的备份方案就歇菜了,我们不能登入云库的物理机。此外,云上数据库虽然还可以还原实例,但代价相对较大。

相信这时候,我们会不由自主的怀念 SQL Server / MySQL 的   insert into XXXX_bak  select * from XXXX。如果 MongoDB也有这种轻量级的备份该多好啊。

其实,在MongoDB的命令中,也有类似功能代码。在这里我们,我们讲解下Cursor游标和聚合框架的$out。

4.cursor.forEach()

Cursor,又称游标。

游标不是查询结果,可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口.客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量、跳过部分结果、或对结果集按任意键进行排序等。

db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段(省略此参数返回匹配文档中的所有字段)。并返回到匹配文档的游标,可以随意修改查询限制、跳跃、和排序顺序的功能。

游标有一个重要的迭代函数—cursor.forEach(回调函数),允许我们自定义回调函数来逐个处理每个单元.

基本语法格式:

db.collection.find().forEach(<function>)

例如,我们需要修改集合QQOrder中创建时间为指定时间,状态为10的订单,因为订单数据不能轻易修改,除流程控制外,要求DBA在修改前备份一下。

以下代码是将符合条件的数据备份至QQOrder_bak集合中。

db.QQOrder.find(
{"Status" : "",
"Rec_CreateTime" : {$gt:ISODate("2018-11-18T15:37:20.740+08:00"),$lt:ISODate("2018-11-20T15:37:20.740+08:00")}
}
).forEach(
function(x){
db.QQOrder_bak.insert(x)
}
)

5.聚合框架–$out

我们知道在聚合框架中有一个步骤–$out,可以把管道的结果写入某个集合中(2.6版新增)。

使用$out操作符,可以自动把聚合管道的输出结果保存到集合里。如果集合不存在的话,则$out操作符将会创建一个集合,或者如果存在就会完全取代现有的集合。此外,如果创建新的集合失败的话,MongoDB不会修改之前的集合。

所以,针对上面的需求,使用下面的代码也可以实现。

(测试过程中,将上一个案例备份集合由QQOrder_bak替换成了QQOrder_bak_2)

db.QQOrder.aggregate([
{$match: {"Status" : "","Rec_CreateTime" : {$gt:ISODate("2018-11-18T15:37:20.740+08:00"),$lt:ISODate("2018-11-20T15:37:20.740+08:00")}}},
{$out:'QQOrder_bak_2'}
])

需要特别注意的话,QQOrder_bak_2只可以临时存放数据,如果再次执行新的导出,会将集合中原来的数据覆盖掉。

以上五种备份,可以涵盖我们日常所有的备份需求了。包含 实例、库的日常灾备,也有业务需求的临时备份。

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,103
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,579
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,427
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,199
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,834
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,917