求 mongodb驱动下载 samus 驱动文档

一直使用 MongoDb 的 Samus C#驱动。
其有一个缺陷,就是无法支持struct的读写。
但是一般数据都用Class包装,所以也没有太在意。
随着这些天尝试写入 KLineData 时,遇到了非常龌龊的问题。
KLineData这个Class内部有一个TICK[4] 这样一个数组,TICK是一个结构类型
Samus可以顺利的写入KLineData
但是读取时,立刻发生了异常。
查看内部实现,发现其用Emit做的ORM,代码如下:
private ExtendedPropertiesMap CreateExtendedPropertiesMap(Type classType){
var extPropMember = _profile.FindExtendedPropertiesMember(classType);
if(extPropMember == null)
return new ExtendedPropertiesMap(
extPropMember.Name,
extPropMember.GetReturnType(),
MemberReflectionOptimizer.GetGetter(extPropMember),
MemberReflectionOptimizer.GetSetter(extPropMember));
}其中GetSetter代码如下
public static Action&object, object& GetSetter(MemberInfo memberInfo)
if(memberInfo == null)
throw new ArgumentNullException(&memberInfo&);
if(memberInfo.MemberType != MemberTypes.Field && memberInfo.MemberType != MemberTypes.Property)
throw new ArgumentException(&Only fields and properties are supported.&, &memberInfo&);
if(memberInfo.MemberType == MemberTypes.Field)
return GetFieldSetter(memberInfo as FieldInfo);
if(memberInfo.MemberType == MemberTypes.Property)
return GetPropertySetter(memberInfo as PropertyInfo);
throw new InvalidOperationException(&Can only create setters for fields or properties.&);
我们关注其中的Field的Emit反射
public static Action&object, object& GetFieldSetter(FieldInfo fieldInfo)
if(fieldInfo == null)
throw new ArgumentNullException(&fieldInfo&);
var key = CreateKey(fieldInfo);
Action&object, object&
lock (SyncObject)
if (SetterCache.TryGetValue(key, out setter))
if (fieldInfo.IsInitOnly || fieldInfo.IsLiteral)
throw new InvalidOperationException(&Cannot create a setter for a readonly field.&);
var sourceType = fieldInfo.DeclaringT
var method = new DynamicMethod(&Set& + fieldInfo.Name, null, new[] {typeof (object), typeof (object)}, true);
var gen = method.GetILGenerator();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Castclass, sourceType);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Unbox_Any, fieldInfo.FieldType);
gen.Emit(OpCodes.Stfld, fieldInfo);
gen.Emit(OpCodes.Ret);
setter = (Action&object, object&) method.CreateDelegate(typeof (Action&object, object&));
lock (SyncObject)
SetterCache[key] =
} & &&gen.Emit(OpCodes.Ldarg_0); // 把参数0入栈
& & & & & & gen.Emit(OpCodes.Castclass, sourceType);//把参数0的类型转为sourceType : & x as NewType
& & & & & & gen.Emit(OpCodes.Ldarg_1);// 把参数1入栈
& & & & & & gen.Emit(OpCodes.Unbox_Any, fieldInfo.FieldType);//把参数1的类型强制转换为FieldType: &(NewType)x
& & & & & & gen.Emit(OpCodes.Stfld, fieldInfo);// SetField( 参数0,参数1 )
& & & & & & gen.Emit(OpCodes.Ret);// 返回
以上代码有一个问题,就是要求参数0是Class,如果是Value是有异常的,即使可行也是没有意义的,因为ValueType是指传递
setter函数的设计模式(&object,object&) 天然就无法处理Value
public void AddProperty(string name, object value)
#region Original Codes
//var memberMap = _classMap.GetMemberMapFromAlias(name);
//if (memberMap != null)
memberMap.SetValue(_instance, value);
//else if ((!_classMap.HasDiscriminator || _classMap.DiscriminatorAlias != name) && _extendedProperties != null)
_extendedProperties.Add(name, value);
#endregion
#region norsd Codes
if(_bIsClass)
var memberMap = _classMap.GetMemberMapFromAlias(name);
if (memberMap != null)
memberMap.SetValue(_instance, value);
else if ((!_classMap.HasDiscriminator || _classMap.DiscriminatorAlias != name) && _extendedProperties != null)
_extendedProperties.Add(name, value);
_SetStructValue(name, ref _instance, value);
#endregion
注意_bIsClass就走原始流程,如果是Struct就走 _SetStructValue 流程
下面贴出整个类的代码
设置一个全局静态变量
readonly static System.Collections.Generic.Dictionary&System.Reflection.FieldInfo, SETSTVALUE& _s_dtStSetter = new Dictionary&System.Reflection.FieldInfo, SETSTVALUE&();
用于缓存SetStructValue函数
同时一个类私有变量readonly System.Collections.Generic.Dictionary&string, SETSTVALUE& _dtStSetter = new Dictionary&string, SETSTVALUE&();
用于快速在FieldInfo.Name -& SetStructValue
_CreateStSetter是动态创建函数
using MongoDB.Configuration.Mapping.M
using System.Collections.G
namespace MongoDB.Serialization.Builders
internal class ConcreteClassMapBuilder : IObjectBuilder
private readonly IClassMap _classM
#region Original
//private readonly object _
#endregion
#region norsd
//由于struct需要装箱拆箱,_instance无法设为Null
private object _instance =
#endregion
private readonly IDictionary&string, object& _extendedP
public ConcreteClassMapBuilder(IClassMap classMap)
_classMap = classM
_instance = classMap.CreateInstance();
#region norsd
_bIsClass = _instance.GetType().IsC
if (!_bIsClass)
var fields = _instance.GetType().GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
foreach (var fi in fields)
SETSTVALUE setter =
_s_dtStSetter.TryGetValue(fi, out setter);
if(setter == null)
setter = _CreateStSetter(_instance.GetType(),fi);
if(null == setter)
_s_dtStSetter.Add(fi, setter);
_dtStSetter.Add(fi.Name, setter);
#endregion
if(!_classMap.HasExtendedProperties)
var extPropType = _classMap.ExtendedPropertiesMap.MemberReturnT
if (extPropType == typeof(IDictionary&string, object&))
extPropType = typeof(Dictionary&string, object&);
_extendedProperties = (IDictionary&string, object&)Activator.CreateInstance(extPropType);
_classMap.ExtendedPropertiesMap.SetValue(_instance, _extendedProperties);
public void AddProperty(string name, object value)
#region Original Codes
//var memberMap = _classMap.GetMemberMapFromAlias(name);
//if (memberMap != null)
memberMap.SetValue(_instance, value);
//else if ((!_classMap.HasDiscriminator || _classMap.DiscriminatorAlias != name) && _extendedProperties != null)
_extendedProperties.Add(name, value);
#endregion
#region norsd Codes
if(_bIsClass)
var memberMap = _classMap.GetMemberMapFromAlias(name);
if (memberMap != null)
memberMap.SetValue(_instance, value);
else if ((!_classMap.HasDiscriminator || _classMap.DiscriminatorAlias != name) && _extendedProperties != null)
_extendedProperties.Add(name, value);
_SetStructValue(name, ref _instance, value);
#endregion
public object BuildObject()
public PropertyDescriptor GetPropertyDescriptor(string name)
var memberMap = _classMap.GetMemberMapFromAlias(name);
if (memberMap == null)
var type = memberMap.MemberReturnT
var isDictionary =
if (memberMap is CollectionMemberMap)
type = ((CollectionMemberMap)memberMap).ElementT
else if (memberMap is DictionaryMemberMap)
type = ((DictionaryMemberMap)memberMap).ValueT
isDictionary =
return new PropertyDescriptor { Type = type, IsDictionary = isDictionary };
#region norsd
delegate void SETSTVALUE(ref object instance, object value);
void _SetStructValue(string arg_strName , ref object arg_rInstance , object value)
SETSTVALUE setter =
_dtStSetter.TryGetValue(arg_strName ,out setter);
if (setter == null)
//throw new NotImplementedException();
setter(ref arg_rInstance, value);
SETSTVALUE _CreateStSetter(Type arg_sourceType, System.Reflection.FieldInfo arg_fieldinfo)
var sourceType = arg_sourceT
var fieldInfo = arg_
var method2 = new System.Reflection.Emit.DynamicMethod(&Set& + fieldInfo.Name, null, new[] { typeof(object).MakeByRefType(), typeof(object) }, true);
var g = method2.GetILGenerator();
var local = g.DeclareLocal(sourceType, true);
g.Emit(System.Reflection.Emit.OpCodes.Ldarg_0);
g.Emit(System.Reflection.Emit.OpCodes.Ldind_Ref);
g.Emit(System.Reflection.Emit.OpCodes.Unbox_Any, sourceType);
g.Emit(System.Reflection.Emit.OpCodes.Stloc_0);//将前面Load的数据Set到Local 0
g.Emit(System.Reflection.Emit.OpCodes.Ldloca_S, local);
g.Emit(System.Reflection.Emit.OpCodes.Ldarg_1);
g.Emit(System.Reflection.Emit.OpCodes.Unbox_Any, fieldInfo.FieldType);
g.Emit(System.Reflection.Emit.OpCodes.Stfld, fieldInfo);
g.Emit(System.Reflection.Emit.OpCodes.Ldarg_0);
g.Emit(System.Reflection.Emit.OpCodes.Ldloc_0);
g.Emit(System.Reflection.Emit.OpCodes.Box, sourceType);
g.Emit(System.Reflection.Emit.OpCodes.Stind_Ref);
g.Emit(System.Reflection.Emit.OpCodes.Ret);
var setter = (SETSTVALUE)method2.CreateDelegate(typeof(SETSTVALUE));
bool _bIsClass =
readonly System.Collections.Generic.Dictionary&string, SETSTVALUE& _dtStSetter = new Dictionary&string, SETSTVALUE&();
//全局缓存,
readonly static System.Collections.Generic.Dictionary&System.Reflection.FieldInfo, SETSTVALUE& _s_dtStSetter = new Dictionary&System.Reflection.FieldInfo, SETSTVALUE&();
#endregion
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:398535次
积分:6906
积分:6906
排名:第1508名
原创:274篇
转载:12篇
评论:104条
(5)(6)(1)(2)(2)(1)(3)(6)(1)(4)(3)(1)(10)(10)(5)(2)(8)(4)(3)(3)(10)(3)(9)(10)(10)(7)(10)(4)(3)(2)(3)(2)(1)(4)(3)(8)(2)(6)(4)(4)(1)(2)(2)(1)(1)(2)(11)(2)(4)(1)(3)(2)(4)(2)(5)(3)(5)(7)(2)(6)(5)(2)(4)(4)(1)(1)(1)(3)(2)(3)(4)(6)(6)(4)(8)(1)(1)(1)(1)windows下安装mongodb及注意事项
1:安装去mongodb的官网http:
www mongodb org downloads下载安装包解压后会出现以下文件在安装的盘C:下建立mongodb文件夹,拷贝bin文件夹到该目录下,这样就相当于安装了mongodb的相关命令。为了启动mongodb方
去mongodb的官网下载安装包
解压后会出现以下文件
在安装的盘C:下建立mongodb文件夹,拷贝bin文件夹到该目录下,这样就相当于安装了mongodb的相关命令。
为了启动mongodb方便,将mongod.exe路径加入环境变量,电脑-&属性-&高级系统设置-&环境变量,在path里加入路径:
这样在命令行任何地方都能用到mongod命令。
2:建立数据文件及启动
然后在D盘新建一个mongodb文件夹用来放数据文件并在mongodb文件夹下建立data,log文件夹,在log文件夹下建立mongodb.log文件
启动mongodb服务:打开命令行输入命令
&mongod --dbpath &d://mongodb//data& --logpath &d://mongodb//log//mongodb.log& --logappend
出现以下情况表示在27017端口启动成功。
解析:mongod --dbpath 命令是创建数据库文件的存放位置,启动mongodb服务时需要先确定数据库文件存放的位置,否则系统不会自动创建,启动会不成功。
    --logpath 表示日志文件存放的路径 & & --logappend &表示以追加的方式写日志文件
在浏览器上会看到该信息:
默认27017端口,也可以通过--port 命令来修改端口,如:mongod --port 9888 &d:\\mongodb\\data&
&3:以服务方式启动
每次启动服务都需要输入以上命令,为了方便,可以将启动数据库写成window服务的方式。
&mongod&--logpath &d://mongodb//log//mongodb.log& --logappend&--dbpath &d://mongodb//data& --directoryperdb&--serviceName&MongoDB&--install
这样只需要在命令行输入net start MongoDB &就可以启动服务,但不知道什么原因,我这样设置了,在&服务&里,也找不到MongoDB?
改为以管理员身份启动cmd后 ,输入命令:
sc create mongodb binPath= &c:\mongodb\bin\mongod.exe --service --dbpath D:\mongodb\data --logpath=d:\mongodb\log\mongodb.log --logappend --directoryperdb&
删除服务指令:&mongod.exe --remove --serviceName &MongoDB&
注意要用管理员方式启动命令行
这样在服务里面就有MongoDB的服务了
在折腾mongodb服务的过程中,发现数据库服务启动不了,弹框报错:&服务没有响应或控制功能&,尝试过很多其他的方法都无解
最后执行 sc delete mongodb &强制删除mongodb服务
然后用sc create 的命令再次创建服务 & 就能启动了。
本站欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果
转载请注明: 文章转载自:爱思资源网
[ 你可能感兴趣的文章 ]
[前端书籍推荐] BOOK
《锋利的JQuery》高清扫描版百度网盘pdf下载
爱思资源网 Copyright
All rights reserved.(晋ICP备号-1)MongoDB学习笔记(二) 通过samus驱动实现基本数据操作 - 半桶水 - ITeye技术网站
传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由
(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没
有列、行和关系概念,这体现了模式自由的特点。
一、关于MongoDB的驱动
  MongoDB支持多种语言的驱动,在此我们只介绍C#的驱动。仅C#驱动都有很多种,每种驱动的形式大致相同,但是细节各有千秋,因此代码不
能通用。比较常用的是官方驱动和samus驱动。samus驱动除了支持一般形式的操作之外,还支持linq方式操纵数据。各人比较喜欢这种方式。
  官方驱动下载地址:
  samus驱动下载地址:
  本篇将从samus驱动入手讲解数据库访问,国际惯例,存取“Hello World!”。
二、通过samus驱动实现HelloWorld存取
  在进行下述操作之前,请先确定MongoDB服务已经开启,不知道怎么开启服务,请看上篇。下载驱动,新建控制台项目,并添加对MongoDB.dll的引用,如果你下载的是驱动源码,编译一遍引用生成的DLL即可。
  基本代码如下:
connectionString =
"mongodb://localhost
databaseName =
"myDatabase"
collectionName =
"myCollection"
Mongo mongo =
Mongo(connectionString);
MongoDatabase mongoDatabase = mongo.GetDatabase(databaseName)
MongoCollection&Document& mongoCollection = mongoDatabase.GetCollection&Document&(collectionName)
MongoCollection&Document&;
mongo.Connect();
Document doc =
Document();
"Hello World!"
mongoCollection.Insert(doc);
Document docFind = mongoCollection.FindOne(
Document { {
Console.WriteLine(Convert.ToString(docFind[
mongo.Disconnect();
  运行程序,成功打印helloword。同时,我们打开数据文件夹,发现多了两个文件“myDatabase.ns”和“myDatabase.0”。
  代码下载:
  本篇简洁的讲解了基本存取操作,下篇将结合MVC框架通过MongoDB实现model层单个集合的基本增删查改操作。
作者:李盼(Lipan)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。
浏览: 59148 次
来自: 北京
[flash=200,200][/flash]
.classpath文件在哪里?
请问,你是如何调用LSMessage,并弹出窗口的?MongoDB的驱动有好几个,里使用的是,monogodb-csharp不是强类型,使用起来不方便。转向使用支持强类型访问MongoDB的。NoRM 驱动和MongoDB-CSharp的一个区别的地方就是NoRM使用强类型的类操作MongoDB-CSharp的Document类。
使用NoRM很简单,引用NoRM.dll就可以了,下面的例子是一个控制台程序:
模型类,代表保存到数据库的数据
using System.Collections.G
using System.L
using System.T
namespace FirstMongoDb
    public class Customer: IHaveIdentifier
    {
        public ObjectId _id { }
        public string Name { }
        public DateTime LastOrderUtc { }
        public List&string& OrderedItems { }
        public Customer()
        {
            OrderedItems = new List&string&();
        }
    }
这个足够简单了,下面我们连到数据库
public class MongoDbDataContext : IDisposable
    {
        private readonly MongoQueryP
        public MongoQueryProvider Provider
        {
            get { }
        }
        public static string DatabaseName { }
        public MongoDbDataContext()
        {
            if ( string.IsNullOrEmpty( DatabaseName ) )
            {
                throw new InvalidOperationException( &You must set the static DatabaseName property.& );
            }
            provider = new MongoQueryProvider(
                new Mongo( DatabaseName, &127.0.0.1&, &27017&, null ) );
        }
使用NoRM去冬连接到数据需要提供一个数据库名,服务器地址和端口,参看上述红色代码。
插入一个对象到数据库
private static void Insert()
        {
            Customer c = new Customer();
            c.Name = &Jake&;
            c.LastOrderUtc = DateTime.UtcN
            c.OrderedItems.Add(&frappa&);
            c.OrderedItems.Add( &beer& );
            c.OrderedItems.Add( &redbull!& );
            c.OrderedItems.Add( &wings& );
            using ( MongoDbDataContext ctx = new MongoDbDataContext() )
            {
                ctx.Add(c);
            }
        }
使用LINQ查询数据库
using ( MongoDbDataContext ctx = new MongoDbDataContext() )
                var query =
                    from c in ctx.Customers
                    where c.Name == &Michael&
                    orderby c.LastOrderUtc descending
                   
                foreach (var customer in query)
                {
                    Console.WriteLine(&{0} bought {1}&,
                        customer.Name,
                        customer.OrderedItems.FirstOrDefault()
                        );
                }
            }
阅读(...) 评论()mongodb备份与恢复(上)
mongodb备份与恢复(上)
一. 备份单台mongodb
1. 文件快照方式
这是最简单的备份方法。但是,需要系统文件支持快照和mongod必须启用journal。如果都符合这两条要求,可以在任何时刻创建快照。
恢复时,确保没有运行mongod,执行快照恢复操作命令,然后启动mongod进程,mongod将重放journal日志。
2. 复制数据文件方式
直接拷贝数据目录下的一切文件。但是在拷贝过程中必须阻止数据文件发生更改。因此需要对加锁,以防止数据写入。
& db.fsyncLock()
上面的命令将阻塞写入操作,并将脏数据刷新到磁盘上,确保数据一致。
然后,拷贝数据文件到备份目录下
# cp -R /data/db/* /backup
文件复制完成后,对数据库进行解锁,允许写操作
& db.fsyncUnlock()
注意: 在执行db.fsyncLock()和db.fsyncUnlock()时,不能关闭当前的shell窗口,否则可能无法连接而需要重新启动mongod服务。
恢复时,确保mongod没有运行,清空数据目录,将备份的数据拷贝到数据目录下,然后启动mongod
# cp -R /backup/* /data/db/
# mongod -f mongod.conf
3. 使用mongodump方式
千万不要fsyncLock与mongodump配合使用,如果数据库被锁定了,mongodump将永远挂起。&
使用mongodump备份比较慢,在备份复制集时还有些问题,后续会说到。但是,用来备份单个数据库、集合、子集合还是比较好的方法。
# ./mongodump --help
& --help & & & & & & & & & & & & & & & &显示帮助信息
& -v [ --verbose ] & & & & & & & & & & &打印出更多信息,如时间等等 -vvvvv
& --version & & & & & & & & & & & & & & 打印版本信息
& -h [ --host ] arg & & & & & & & & & & 指定连接的mongodb主机,复制集时设置为&set name&/s1,s2
& --port arg & & & & & & & & & & & & & &指定mongodb端口号,也可以这么指定--host hostname:port
& --ipv6 & & & & & & & & & & & & & & & &启用支持IPv6 support
& -u [ --username ] arg & & & & & & & & 用户名
& -p [ --password ] arg & & & & & & & & 密码
& --authenticationDatabase arg & & & & &user source (defaults to dbname)
& --authenticationMechanism arg (=MONGODB-CR)
& & & & & & & & & & & & & & & & & & & & authentication mechanism
& --dbpath arg & & & & & & & & & & & & &直接访问mongod的数据库文件,而不是连接到mongodb服务器。需要锁定数据目录,如果mongod当前在访问相同路径将不能使用。也就是说,mongod运行的情况下不能使用--dbpath,mongod未运行的情况下可以直接指定--dbpath
& --directoryperdb & & & & & & & & & & &每个db一个单独的目录,需要指定dbpath
& --journal & & & & & & & & & & & & & & 启用journaling,需要指定dbpath
& -d [ --db ] arg & & & & & & & & & & & 指定数据库
& -c [ --collection ] arg & & & & & & & 指定集合
& -o [ --out ] arg (=dump) & & & & & & &指定输出目录,&-&表示标准输出
& -q [ --query ] arg & & & & & & & & & &json查询
& --oplog & & & & & & & & & & & & & & & 使用oplog来生产时间点快照
& --repair & & & & & & & & & & & & & & &尝试恢复崩溃的数据库
& --forceTableScan & & & & & & & & & & &强制表扫描,不使用$snapshot
# mongodump -p 27017
将在当前目录下创建dump目录,备份所有的数据库,所有的数据存储在.bson文件中,可以使用mongodb提供的bsondump工具来检索它。
mongod未运行情况下:
# mongodump --dbpath /data/db
恢复时,使用mongorestore工具恢复
# ./mongorestore --help & //相同部分参数意义参加上面的mongodump
& -v [ --verbose ] & & & & & & & & & &&
& --version & & & & & & & & & & & & & &
& -h [ --host ] arg & & & & & & & & & &
& --port arg & & & & & & & & & & & & &&
& --ipv6 & & & & & & & & & & & & & & &&
& -u [ --username ] arg & & & & & & & &
& -p [ --password ] arg & & & & & & & &
& --authenticationDatabase arg & & & &&
& --authenticationMechanism arg (=MONGODB-CR)
& --dbpath arg & & & & & & & & & & & &
& --directoryperdb & & & & & & & & & &&
& --journal
& -d [ --db ] arg&
& -c [ --collection ] arg&
& --objcheck & & & & & & & & & & & & & &在插入前验证对象,默认启用
& --noobjcheck & & & & & & & & & & & & &不在插入前验证对象
& --filter arg & & & & & & & & & & & & &插入前过滤
& --drop & & & & & & & & & & & & & & & &在插入前删除所有文档
& --oplogReplay & & & & & & & & & & & & 在恢复时应用oplog
& --oplogLimit arg & & & & & & & & & & &include oplog entries before the
& & & & & & & & & & & & & & & & & & & & provided Timestamp (seconds[:ordinal])
& & & & & & & & & & & & & & & & & & & & dur the ordinal
& & & & & & & & & & & & & & & & & & & & value is optional
& --keepIndexVersion & & & & & & & & & &don't upgrade indexes to newest version
& --noOptionsRestore & & & & & & & & & &don't restore collection options
& --noIndexRestore & & & & & & & & & & &don't restore indexes
& --w arg (=0) & & & & & & & & & & & & &minimum number of replicas per write
恢复整个数据库:
# mongorestore -p 27017 dump/
恢复到特定的库和集合:
# mongorestore --db ttlsa_com --collection posts dump/old_ttlsa_com/old_posts.bson
注意: mongodump和mongorestore版本最好相匹配。
二. 备份复制集
通常情况下,在secondary进行备份,降低primary负载,只在secondary上锁定,以免影响业务(假设没有发送读请求到secondary)。 可以使用上面的任意方式进行备份,不过推荐使用文件快照方式和复制数据文件方式。&
使用mongodump备份,上面提到了一个问题,那就是在mongodump备份过程中,发生写操作。在复制集架构环境下,要避免这种情况发生,mongodump需要加上--oplog参数,来跟踪备份时服务器上发生的所有操作,获取一个pointin-time快照,否则备份的状态将与集群中其他节点不匹配。在恢复时,还必须创建oplog,并指定--oplogReplay参数来应用这些操作,否则恢复的成员将不知道从何处开始同步,从而在某个时间点上与源服务器保持一致。
在备份复制集时,可以设置mongodump连接&setName/s1,s2,s3&, 它会自动选择一个可用的secondary进行备份。
备份复制集:
# mongodump -h &ttlsa/10.1.1.155,10.1.1.156,10.1.1.157& --oplog -o /backup/mongodbbackup/
恢复复制集步骤:
1. 将复制集中要恢复的成员移除集群
2. 运行mongorestore --oplogReplay命令
# mongorestore --oplogReplay dump/
3. 创建oplog
& use local
& db.createCollection(&oplog.rs&, {&capped& : true, &size& : })
4. 恢复oplog
# mongorestore -d local -c oplog.rs dump/oplog.bson
注意:oplog.bson不位于dump/local/oplog.rs.bson, oplog.bson记录mongodump过程中发生的操作。
5. 将该节点添加到复制集集群中
三. 备份分片
在分片集群下,不可能在一个时间点上得到一个完整集群状态的快照。当集群越来越大时,从备份恢复整个架构的几率越来越小的。 因此,对于分片集群的备份,只需独自备份config server和复制集。&
在对分片集群进行备份与恢复操作前,要关闭balancer。
对于比较小的分片集群,可以直接从mongos来备份与恢复。
在大多数情况下,我们只需要恢复集群中的某个节点。 如果需要恢复整个集群,那你够倒霉的了,整个集群数据丢失可能性比较小的。备份时,直接连接分片集群的mongod而不是通过mongos。
对于比较小型的分片集群,可以直接通过mongodump连接到mongos进行备份,备份的文件将包含config服务器的元数据信息和实际数据。
对于大型的分片集群,备份步骤如下:
1. 关闭balancer
注意:连接到mongos而不是config server实例。
& sh.setBalancerState(false) 或
& sh.stopBalancer() 或
& use config
& db.settings.update( { _id: &balancer& }, { $set : { stopped: true } } , true );
2. 备份集群元数据
使用mongodump备份任意一台config server。
可以直接连接任意一台的config mongod实例,也可以通过mongos连接。
# mongodump --db config
3. 备份shard集群内各个replica set
可并行执行。
4. 启用balancer
注意:连接到mongos而不是config server实例。
& sh.setBalancerState(true) 或
& sh.startBalancer() 或
& use config
& db.settings.update( { _id: &balancer& }, { $set : { stopped: false } } , true );

我要回帖

更多关于 mongodb java驱动 的文章

 

随机推荐