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

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