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://newlifex.com/core/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);
由于是顺序读取数据,读取性能很高,数据同步的瓶颈一般在于写入数据库。具体性能及错误分析,建议参考星尘监控。