[NewLife.XCode]备份恢复与同步(数据搬运专家)

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。

码神工具跨库数据同步

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

此处为语雀视频卡片,点击链接查看:码神数据同步.mp4

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);

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

 

系列教程

NewLife.XCode教程系列[2019版]

  1. 增删改查入门。快速展现用法,代码配置连接字符串
  2. 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)
  3. 实体类详解。数据类业务类,泛型基类,接口
  4. 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置
  5. 反向工程。自动建立数据库数据表
  6. 数据初始化。InitData写入初始化数据
  7. 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)
  8. 脏数据。如何产生,怎么利用
  9. 增量累加。高并发统计
  10. 事务处理。单表和多表,不同连接,多种写法
  11. 扩展属性。多表关联,Map映射
  12. 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计
  13. 数据层缓存。Sql缓存,更新机制
  14. 实体缓存。全表整理缓存,更新机制
  15. 对象缓存。字典缓存,适用用户等数据较多场景。
  16. 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存
  17. 实体工厂。元数据,通用处理程序
  18. 角色权限。Membership
  19. 导入导出。Xml,Json,二进制,网络或文件
  20. 分表分库。常见拆分逻辑
  21. 高级统计。聚合统计,分组统计
  22. 批量写入。批量插入,批量Upsert,异步保存
  23. 实体队列。写入级缓存,提升性能。
  24. 备份同步。备份数据,恢复数据,同步数据
  25. 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版
  26. 大数据分析。ETL抽取,调度计算处理,结果持久化 
posted @ 2022-01-20 15:53  大石头  阅读(571)  评论(0编辑  收藏  举报