[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库,包括创建数据表。
此处为语雀视频卡片,点击链接查看:码神数据同步.mp4DbPackage类
数据备份恢复功能由DbPackage类提供支持。使用时仅需要指定Dal数据库连接,例如 dp.Dal = DAL.Create("memberShip") 。
DbPackage 操作数据有几大核心:
- 二进制备份数据,占用空间小;
- Actor并行处理,读写同时进行,极快速度;
- 中性备份文件,数据库无关性,支持异构备份与恢复;
主要设置如下:
///
/// 数据库连接
///
public DAL Dal { get; set; }
/// 数据页事件
public event EventHandler OnPage;
/// 批量处理时,忽略单表错误,继续处理下一个。默认true
public Boolean IgnoreError { get; set; } = true;
///
/// 性能追踪器
///
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 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 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抽取,调度计算处理,结果持久化