备份恢复与同步(数据搬运专家)

NewLife.XCode是一个有20年历史的开源数据中间件,支持net6/net5/net45/net40,由新生命团队(2002~2020)开发完成并维护至今,以下简称XCode。

整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。

开源地址:https://github.com/NewLifeX/X (求star, 1450+)

Nuget包:NewLife.XCode

源代码:https://github.com/NewLifeX/X/blob/master/XCode/DataAccessLayer/DbPackage.cs

数据应用开发中,经常需要用到备份、恢复和同步功能,XCode内置支持跨数据库备份同步。特别在分析线上问题时,经常是恨不得把线上某些表数据“弄”回来本地。所以,你需要XCode。

码神工具跨库数据同步

把数据从一个库同步到另一个库,以下视频从SQLite库同步数据到MySql库,包括创建数据表。

DbPackage类

数据备份恢复功能由DbPackage类提供支持。使用时仅需要指定Dal数据库连接,例如 dp.Dal = DAL.Create("memberShip") 。

DbPackage 操作数据有几大核心:

    • 二进制备份数据,占用空间小;

    • Actor并行处理,读写同时进行,极快速度;

    • 中性备份文件,数据库无关性,支持异构备份与恢复;

主要设置如下:

/// <summary>
/// 数据库连接
/// </summary>
public DAL Dal { get; set; }/// <summary>数据页事件</summary>
public event EventHandler<PageEventArgs> OnPage;/// <summary>批量处理时,忽略单表错误,继续处理下一个。默认true</summary>
public Boolean IgnoreError { get; set; } = true;/// <summary>
/// 性能追踪器
/// </summary>
public ITracer Tracer { get; set; } = DAL.GlobalTracer;

备份

数据备份,把一个或多个表数据备份为压缩文件,支持备份数据表结构。

采用Actor架构,双线并行处理,主线程逐页抽取数据,Actor线程写入备份文件。

数据库结构备份为xml文件,单表数据备份为DbTable的二进制格式,因此备份文件非常小。

数据备份文件为NET类型的中性文件,与数据库类型及版本无关,可以恢复到其它任意类型数据库。数据备份文件头部记录字段名及字段类型,之后的数据逐行存储。

数据备份文件格式可阅读DbTable说明, https://www.yuque.com/smartstone/nx/dbtable

主要方法:

// 备份单表数据,抽取数据和写入文件双线程
Int32 Backup(IDataTable table, Stream stream);
// 备份单表数据到文件
Int32 Backup(IDataTable table, String file = null);
// 备份一批表到指定压缩文件
Int32 BackupAll(IList<IDataTable> tables, String file, Boolean backupSchema = true);

数据抽取逻辑,如果有自增字段,则按照自增字段分批抽取。否则使用直接分页的方式抽取,在数据量较大时(大于1万行),性能会越来越慢。

由于是顺序写入,写入性能很高,数据备份的瓶颈一般在于原始数据抽取。具体性能及错误分析,建议参考星尘监控。

恢复

数据恢复,把一个压缩文件恢复到目标数据库,支持恢复数据表结构,包括创建表和修改表。

采用Actor架构,双线并行处理,主线程逐页读取文件,Actor线程分批写入数据库。

由于备份文件是数据库无关的中性文件,因此目标数据库可以是不同于备份库的其它数据库类型。

备份时仅记录基础数据类型,因此个别特殊类型字段可能恢复失败。

主要方法:

// 从数据流恢复数据
Int32 Restore(Stream stream, IDataTable table);
// 从文件恢复数据
Int64 Restore(String file, IDataTable table, Boolean setSchema = true);
// 从指定压缩文件恢复一批数据到目标库
IDataTable[] RestoreAll(String file, IDataTable[] tables = null, Boolean setSchema = true);

由于是顺序读取文件,读取性能很高,数据恢复的瓶颈一般在于写入数据库。具体性能及错误分析,建议参考星尘监控。

同步

数据同步,把一个库的单表或多表同步到另一个库,支持同步数据表结构,包括创建表和修改表。

采用Actor架构,双线并行处理,主线程逐页抽取数据,Actor线程分批写入目标库。

由于同步过程中转为数据库无关的DbTable中性数据集,因此目标库可以是不同于源库的其它数据库类型。

支持同步所有基础数据类型,特殊数据类型有可能同步失败。

主要方法:

// 同步单表数据
Int32 Sync(IDataTable table, String connName, Boolean syncSchema = true);
// 备份一批表到另一个库
IDictionary<String, Int32> SyncAll(IDataTable[] tables, String connName, Boolean syncSchema = true);

由于是顺序读取数据,读取性能很高,数据同步的瓶颈一般在于写入数据库。具体性能及错误分析,建议参考星尘监控。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简析TCP的三次握手与四次分手

TCP是什么&#xff1f; 具体的关于TCP是什么&#xff0c;我不打算详细的说了&#xff1b;当你看到这篇文章时&#xff0c;我想你也知道TCP的概念了&#xff0c;想要更深入的了解TCP的工作&#xff0c;我们就继续。它只是一个超级麻烦的协议&#xff0c;而它又是互联网的基础&am…

for循环延时_前端中的事件循环eventloop机制

我们知道 js 是单线程执行的&#xff0c;那么异步的代码 js 是怎么处理的呢&#xff1f;例如下面的代码是如何进行输出的&#xff1a;console.log(1);setTimeout(function() { console.log(2);}, 0);new Promise(function(resolve) { console.log(3); resolve(Date.no…

由于未分配内存的指针导致段错误

代码如下 #include<iostream> using namespace std;void f(char **s) {*s "chenyu"; }typedef struct _node {int val;struct _node *next; } Node;typedef struct _link {Node *front;Node *rear; } Link;void queue(Link *link) { // link.front link.rear…

androidActivity生命周期

Activity生命周期Activity是一个用来提供用户交互界面的组件&#xff0c;它是四大组件之一&#xff0c;对于我们刚刚学习android的菜鸟来说是非常重要的&#xff0c;我们可以将一个屏幕理解为一个Activity&#xff0c;Activity通常是一个全屏的界面&#xff0c;每一个应用程序可…

Autofac实现有条件的DI

Autofac.Annotation框架是我用.netcore写的一个DI框架&#xff0c;基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成。开源地址&#xff1a;https://github.com/yuzd/Autofac.Annotation本期讲的是最新实现的功能有条件的DI有些时候我们想…

Spark ML - 协同过滤

http://ihoge.cn/2018/ML1.html 协同过滤算法 ​ 获取spark自带的MovieLens数据集&#xff0c;其中每行包含一个用户、一个电影、一个该用户对该电影的评分以及时间戳。我们使用默认的ALS.train() 方法&#xff0c;即显性反馈&#xff08;默认implicitPrefs 为false&#xff…

转:java的各个拓展类库的推荐方案

from: 链接&#xff1a;https://www.zhihu.com/question/21142149/answer/109854408 Java是世界上最强大的编程语言之一&#xff0c;很多开发人员和大型企业都偏爱Java&#xff0c;并且在各种应用场景中使用它。在本文中&#xff0c;我们为大家介绍几种Java库来帮助开发人员解决…

字符串常量到底存放在哪个存储区

字符串常量&#xff0c;放在哪个存储区呢&#xff1f;是“自动存储区”还是“静态存储区”中&#xff1f; 比如&#xff1a; char *pstr"hello world!"; 这里&#xff0c;"hello world!"是一个字符串常量&#xff0c; pstr是在栈中的变量。 我想问&#…

公众平台关注用户达到5万即可开通流量主功能 可以推广APP应用

今天微信公众平台发布发布了一些更新&#xff0c;公众帐号的关注用户达到5万&#xff0c;即可开通流量主功能&#xff0c;之前的是要求10万粉丝&#xff0c;这是一个微信开放的信号。广告主可推广苹果商店应用或腾讯开放平台应用。新增卡片和图文广告规格。以下是微信团队的公告…

二进制全排列 java_排列组合算法真厉害,傻瓜都能学会

作者&#xff1a;枕边书来源&#xff1a;https://zhenbianshu.github.io/2019/01/charming_alg_permutation_and_combination.html需求最近工作中碰到一个需求&#xff1a;我们的数据表有多个维度&#xff0c;任意多个维度组合后进行 group by 可能会产生一些”奇妙”的反应&am…

linux运维常用命令

1.删除0字节文件find -type f -size 0 -exec rm -rf {} \;2.查看进程按内存从大到小排列ps -e -o "%C : %p : %z : %a"|sort -k5 -nr3.按cpu利用率从大到小排列ps -e -o "%C : %p : %z : %a"|sort -nr4.打印说cache里的URLgrep -r -a jpg /dat…

如何计算 string 的 crc32 值 ?

咨询区 Nick Berardi请问我如何通过 C# 计算 string 的 crc32 校验和&#xff1f;回答区 Pete我一直震撼的一件事就是 .NET 底层框架中居然没有提供对 CRC32 的直接支持&#xff0c;CRC32 一直都是 ZIP,RAR 压缩中做校验和的绝佳方案&#xff0c;在 .NET 中你可以这么使用。var…

Spark ML - 聚类算法

http://ihoge.cn/2018/ML2.html Spark ML - 聚类算法 1.KMeans快速聚类 首先到UR需要的包&#xff1a; import org.apache.spark.ml.clustering.{KMeans,KMeansModel} import org.apache.spark.ml.linalg.Vectors 开启RDD的隐式转换&#xff1a; import spark.implicits.…

twitter storm源码走读(五)

TridentTopology创建过程详解 从用户层面来看TridentTopology&#xff0c;有两个重要的概念一是Stream,另一个是作用于Stream上的各种Operation。在实现层面来看&#xff0c;无论是stream&#xff0c;还是后续的operation都会转变成为各个Node&#xff0c;这些Node之间的关系通…

C语言宏使用常见问题

代码&#xff1a; #include<stdio.h> #define MAX(a,b) a>b?a:b #define MIN(a,b) a>b?b:a //#define M (xY) #define M1(m) m*m #define M2(m) (m)*(m) #define M3(m) ((m)*(m)) int main(){int x,y,max,min;printf("Input one numbers:");int sum, m…

ad域管理与维护_AD域管理员账号下发

大家好&#xff0c;最近比较忙&#xff0c;好久没发文章了&#xff0c;这次继续讲AD域的相关内容。AD域运行在Windows Server服务器&#xff0c;用于集中管理网内的所有Windows客户端主机&#xff0c;其中最重要的管理手段便是「域组策略」&#xff0c;可管理的条目非常多&…

[Unity 游戏设计的元素]

1.核心游戏机制 2.主题 3.功能集合 4.可能的附加功能 5.备用主题创意转载于:https://www.cnblogs.com/rayshen/p/3968294.html