>

Subversion版本库数据迁移,从一台服务器迁移到另

- 编辑:澳门新葡亰平台游戏 -

Subversion版本库数据迁移,从一台服务器迁移到另

Subversion版本库数据迁移

 

2018率先篇手艺小说,从前写过一篇关于CoreData基础的小说Magical Record 全面分析。关于CoreData迁移相关的作品英特网有局部,可是都不是极度周到,所以这里总括一下,一方面自个儿巩固,一方面期待能帮到须求的校友。

 

[root@NGINX-APACHE-SVN pro]# pwd
/var/www/html/svn/pro
[root@NGINX-APACHE-SVN pro]# svnadmin dump /var/www/html/svn/pro/ >/nc/pro.dump

[root@NGINX-APACHE-SVN nc]# ll -h pro.dump 
-rw-r--r-- 1 root root 2.1G Aug  6 23:51 pro.dump
#转存文件pro.dump,这个转存文件比原文件的版本库本身大很多倍,因为在转存文件中,每个文件的每个版本都以完整的文本形式保存下来。

[root@NGINX-APACHE-SVN nc]# du -sh /var/www/html/svn/pro/
1.2G    /var/www/html/svn/pro/
[root@NGINX-APACHE-SVN nc]# ls /var/www/html/svn/pro/
conf  db  format  hooks  locks  README.txt

[root@NGINX-APACHE-SVN nc]# du -sh /home/pro/
4.3G    /home/pro/

CoreData迁移重借使多少个地方,二个是数据库版本迁移,叁个是多少迁移。

商家的 Subversion 服务器由于计算机硬件原因,日常自动关机,须求重新安装一台服务器。原本的 Subversion 服务器是在 Windows XP 上经过 VisualSVN Server 架设的,未来借此机缘将其搬迁至 Linux 系统。因而需求将本来的版本库迁移到新的服务器上。

将pro.dump文件拷贝到新的劳务机上,然后创立新的本子库,将pro.dump导入。

Migration is required when the model doesn't match the store.

  www.2cto.com  

[root@new-svn nc]# svnadmin create pro
[root@new-svn nc]# tree pro
pro
├── conf
│   ├── authz
│   ├── passwd
│   └── svnserve.conf
├── db
│   ├── current
│   ├── format
│   ├── fsfs.conf
│   ├── fs-type
│   ├── min-unpacked-rev
│   ├── rep-cache.db
│   ├── revprops
│   │   └── 0
│   │       └── 0
│   ├── revs
│   │   └── 0
│   │       └── 0
│   ├── transactions
│   ├── txn-current
│   ├── txn-current-lock
│   ├── txn-protorevs
│   ├── uuid
│   └── write-lock
├── format
├── hooks
│   ├── post-commit.tmpl
│   ├── post-lock.tmpl
│   ├── post-revprop-change.tmpl
│   ├── post-unlock.tmpl
│   ├── pre-commit.tmpl
│   ├── pre-lock.tmpl
│   ├── pre-revprop-change.tmpl
│   ├── pre-unlock.tmpl
│   └── start-commit.tmpl
├── locks
│   ├── db.lock
│   └── db-logs.lock
└── README.txt

10 directories, 28 files

[root@new-svn nc]# svnadmin load /nc/pro </nc/pro.dump 

首先推荐三个运用内调度的工具FLEX,能够一向查看数据库文件。

Linux 上安装 Subversion 服务器的艺术,前边的文章中已有介绍。本文只介绍在前方配置好的 Subversion 服务器上产生版本库数据的迁徙职业。

图片 1

 

CoreData数据库版本迁移

数据库版本迁移比较轻便。一般景况下是在疯长了一张表之后,更新一下数据文件。

选中xcdatamodel文件从此,点击editor。能够观望如下选项。

图片 2

这边包涵了关于xcdatamodel大部分操作。接纳Add Model Version。

做到之后方可知见

图片 3

入选个中八个xcdatamodel文件,查看文件属性。这里带有了xcdatamodel各样品质,值得注意的是有个langua和coredatamodel,那四个后边会用到。

图片 4

选料当前版本为新建的版本不只能了。实现之后小绿勾就能够议及展览示在转移的本子上。

透过上边五个简易的手续就做到版本库迁移了。

CoreData数据迁移

大凡会挑起NSManagedObjectModel托管对象模型变化的,都最棒开展数据迁移,幸免顾客升高使用之后就闪退。会引起NSManagedObjectModel托管对象模型变化的有以下多少个操作,增加产量了一张表,新添了一张表里面包车型大巴多少个实体,新添一个实体的三个性情,把一个实体的某些属性迁移到别的一个实体的某部属性之中等等

  1. 在旧服务器准将版本库导出

轻量级迁移

可见由此自行测算的迁移叫做轻量级迁移。假设只是做了相当的小的更动,举个例子给实体新扩展了质量,CoreData能够依据活动测算做活动数据迁移。轻量级迁移与一般迁移基本一样,分化之处在于我们协和毫不提供映射模型( mapping model)。

一般来讲场景能够使用轻量级迁移:

  • 简单来讲的骤增、删除属性
  • 重命名实体、属性
  • 属性的可选与不可选之间的变通
  • 可选变为不可选,而且定义了暗许值。

极其注意,假使改换属性类型,CoreData不能够自动估摸,也就不是轻量级迁移。

轻量级迁移代码如下:

NSError *error = nil;
NSURL *storeURL = <#The URL of a persistent store#>;
NSPersistentStoreCoordinator *psc = <#The coordinator#>;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

BOOL success = [psc addPersistentStoreWithType:<#Store type#>
                    configuration:<#Configuration or nil#> URL:storeURL
                    options:options error:&error];
if (!success) {
    // Handle the error.
}

由此Demo测量试验能够总括出

举例不用自行迁移则会冒出如下现象:

  • 实业名字的更换会把在此以前的保存数据删除,原实体表删除。
  • 天性名称的更动之后保存数据总体刨除。

翻开自动员搬迁移则会:

  • 实体名字的修改会把前边的保留数据删除,原实体表删除。
  • 品质名称的修改以往数据可见成功迁移过来。

顺便提一下,magicRecord只提供了轻量级迁移的办法。

那么怎么判别CoreData是或不是能够开展机动员搬迁移呢(实际上全体的迁移都以都过NSMappingModel实现的,自动员搬迁移也等于自动生成了NSMappingModel而已)。能够自定义,通过如下方法,分别传入源store,和目的store实现。

- (BOOL)migrateStore:(NSURL *)storeURL toVersionTwoStore:(NSURL *)dstStoreURL error:(NSError **)outError {

    // Try to get an inferred mapping model.
    NSMappingModel *mappingModel =
        [NSMappingModel inferredMappingModelForSourceModel:[self sourceModel]
                        destinationModel:[self destinationModel] error:outError];

    // If Core Data cannot create an inferred mapping model, return NO.
    if (!mappingModel) {
        return NO;
    }

    // Create a migration manager to perform the migration.
    NSMigrationManager *manager = [[NSMigrationManager alloc]
        initWithSourceModel:[self sourceModel] destinationModel:[self destinationModel]];

    BOOL success = [manager migrateStoreFromURL:storeURL type:NSSQLiteStoreType
        options:nil withMappingModel:mappingModel toDestinationURL:dstStoreURL
        destinationType:NSSQLiteStoreType destinationOptions:nil error:outError];

    return success;
}

若是使用了MagicRecord,能够运用 [MagicalRecord setupAutoMigratingCoreDataStack]一行代码实现轻量级迁移。

在本来 Subversion 安装的 Window 中校版本库导出成 dump 文件。

重量级迁移

尽管CoreData不可能自动测度,就须求用有个别复杂的防备四去迁移数据。原理正是亟需定义怎么去改造数据,全数的音信包括在炫丽模型中,映射模型是一文山会海迁移消息的集纳。上边提到的轻量级迁移是经过自动生成NSMappingModel达成的,重量级迁移须求大家自个儿去成立NSMappingModel。Xcode提供了可视化的工具来创立映射模型。

 

大面积对象

就那样类推对象模型,CoreData提供了针对,模型,实体,属性的搬迁工具(NSMappingModel, NSEntityMapping, 和 NSPropertyMapping).。

  • NSMappingModel:包括了NSEntityMapping,NSPropertyMapping的照射模型
  • NSEntityMapping:包罗源实体,目的实体还恐怕有映射的体系(新扩张,移除,拷贝,大概转移)
  • NSPropertyMapping:包蕴在源实体和对象实体的名号,和三个发布式值。

除却还提供了自定义的办法。

能够在在Xcode的本性面板上直接选择自定义的表明式来做轻松的动员搬迁(复杂的迁移也是根据那么些表明式)

图片 5

  • 搬迁从贰性子能到另叁本品质:譬喻amount属性重命名称叫totalCost。输入表明式$source.amount。
  • 调换值:比方由temperature华氏摄氏度到摄氏度,表达式($source.temperature - 32.0) / 1.8.

共计有有6个预约义的key.

NSMigrationManagerKey: $manager

NSMigrationSourceObjectKey: $source

NSMigrationDestinationObjectKey: $destination

NSMigrationEntityMappingKey: $entityMapping

NSMigrationPropertyMappingKey: $propertyMapping

NSMigrationEntityPolicyKey: $entityPolicy

> svnadmin dump myrepos > myrepos.dump

因此Xcode创设映射模型

此处以二个Student实体为例
先插入数据,便于查看变化:

 [[NSManagedObjectContext MR_defaultContext] MR_saveWithBlock:^(NSManagedObjectContext * _Nonnull localContext) {
        for (int i = 0; i < 100; i++) {
            Student *sdt = [Student MR_createEntityInContext:localContext];
            sdt.name = [NSString stringWithFormat:@"sdt_%d",i];
            sdt.age = @(i);
        }
    } completion:^(BOOL contextDidSave, NSError * _Nullable error) {
        if (contextDidSave) {
            NSLog(@"Save Success");
        }
    }];

图片 6

创办新的xcdatamodel文件

图片 7

新建七个实体用于迁移Student中的age,name属性

图片 8

新建映射模型文件,而且采取源和目标xcdatamodel:

图片 9

图片 10

图片 11

创建完事后能够看来

图片 12

此处的$source.age和地点介绍得输入表明式同样。能够利用方面预订义的6个key

亟待特别注意一下底下的这几个某些,迁移的平整都以从这里安装的

图片 13

设置好source和destination

图片 14

搬迁的做事到此地就着力产生了,最终设置一下脚下xcdatamodel文件的版。然后跑起来就可以在新型的数据库文件之中来看如下结果:

实在多了两张表

图片 15

三张表的内容如下

图片 16

图片 17

图片 18

数据确实从Student表里面迁移到了StudentAge表和StudentName表。

因此长久的年华获得三个急剧的转存文件 myrepos.dump,那一个转存文件比原先的版本库自己大过多倍,因为在转存文件中,各样文件的各种版本都是全体的公文形式保留下来。

代码数据迁移

透过下面可视化的操作已经足以高达迁移的目标了,通过代码进行搬迁首即使在数量迁移进度中,假令你还想做一些怎么别的作业,举例说你想清理一下污源数据,实时显示数据迁移的快慢。

  • 直接上代码

检验是或不是需求迁移:

- (BOOL)isMigrationNecessaryForStore:(NSURL*)storeUrl
{
    NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));

    if (![[NSFileManager defaultManager] fileExistsAtPath:[self storeURL].path])
    {
        NSLog(@"SKIPPED MIGRATION: Source database missing.");
        return NO;
    }

    NSError *error = nil;
    NSDictionary *sourceMetadata =
    [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                               URL:storeUrl error:&error];
    NSManagedObjectModel *destinationModel = _coordinator.managedObjectModel;

    if ([destinationModel isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata])
    {
        NSLog(@"SKIPPED MIGRATION: Source is already compatible");
        return NO;
    }

    return YES;
}
  • 何以进展搬迁:
- (BOOL)migrateStore:(NSURL*)sourceStore {

    NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));
    BOOL success = NO;
    NSError *error = nil;

    // STEP 1 - 收集 Source源实体, Destination目标实体 和 Mapping Model文件
    NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator
                                    metadataForPersistentStoreOfType:NSSQLiteStoreType
                                    URL:sourceStore
                                    error:&error];

    NSManagedObjectModel *sourceModel =
    [NSManagedObjectModel mergedModelFromBundles:nil
                                forStoreMetadata:sourceMetadata];

    NSManagedObjectModel *destinModel = _model;

    NSMappingModel *mappingModel =
    [NSMappingModel mappingModelFromBundles:nil
                             forSourceModel:sourceModel
                           destinationModel:destinModel];

    // STEP 2 - 开始执行 migration合并, 前提是 mapping model 不是空,或者存在
    if (mappingModel) {
        NSError *error = nil;
        NSMigrationManager *migrationManager =
        [[NSMigrationManager alloc] initWithSourceModel:sourceModel
                                       destinationModel:destinModel];
        [migrationManager addObserver:self
                           forKeyPath:@"migrationProgress"
                              options:NSKeyValueObservingOptionNew
                              context:NULL];
NSURL *destinStore =
        [[self applicationStoresDirectory]
         URLByAppendingPathComponent:@"Temp.sqlite"];

        success =
        [migrationManager migrateStoreFromURL:sourceStore
                                         type:NSSQLiteStoreType options:nil
                             withMappingModel:mappingModel
                             toDestinationURL:destinStore
                              destinationType:NSSQLiteStoreType
                           destinationOptions:nil
                                        error:&error];
        if (success)
        {
            // STEP 3 - 用新的migrated store替换老的store
            if ([self replaceStore:sourceStore withStore:destinStore])
            {
                NSLog(@"SUCCESSFULLY MIGRATED %@ to the Current Model",
                          sourceStore.path);
                [migrationManager removeObserver:self
                                      forKeyPath:@"migrationProgress"];
            }
        }
        else
        {
            NSLog(@"FAILED MIGRATION: %@",error);
        }
    }
    else
    {
        NSLog(@"FAILED MIGRATION: Mapping Model is null");
    }

    return YES; // migration已经完成
}
  • 搬迁进程有生成,会经过观望者,observeValueForKeyPath来报告客商进程,这里能够监听该进度,若无达成,能够来禁止客户实践有些操作。
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {

    if ([keyPath isEqualToString:@"migrationProgress"]) {

        dispatch_async(dispatch_get_main_queue(), ^{

            float progress =
            [[change objectForKey:NSKeyValueChangeNewKey] floatValue];

            int percentage = progress * 100;
            NSString *string =
            [NSString stringWithFormat:@"Migration Progress: %i%%",
             percentage];
            NSLog(@"%@",string);

        });
    }
}

代码迁移那块,读者能够本身试一试。

 

推而广之阅读

Wha Is Core Data?
Next Core Data Model Versioning and Data Migration
iOS Core Data 数据迁移 指南

svnadmin dump 从版本库中读取修订版本树与另外“读者”(譬如 svn checkout)的经过同样,所以能够在别的时候安全的运营那几个命令。

  www.2cto.com  

  1. 在新服务器中将版本库导入

将 myrepos.dump 文件拷贝到新服务器上,然后创建一个新的本子库,将 dump 文件导入。

 

$ svnadmin create /home/svn/repos/myrepos

$ svnadmin load /home/svn/repos/myrepos < myrepos.dump  

又是等待贰个旷日长久的日子,svnadmin load 命令会将 dump 文件中的每一种修订版本依次导入,那几个进度与利用普通 Subversion 客商端间接交给到版本库的操作一样,因而最后赢得三个与原先版本库一模一样的新版本库。

公司的 Subversion 服务器由于计算机硬件原因,通常自动关机,要求重新安装一台服务器。原本的 Subversion 服务器是在...

本文由操作系统发布,转载请注明来源:Subversion版本库数据迁移,从一台服务器迁移到另