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