惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Hacker News
The Hacker News
F
Full Disclosure
Cloudbric
Cloudbric
Blog — PlanetScale
Blog — PlanetScale
W
WeLiveSecurity
N
News and Events Feed by Topic
T
Troy Hunt's Blog
V2EX - 技术
V2EX - 技术
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
B
Blog
GbyAI
GbyAI
C
Check Point Blog
B
Blog RSS Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Recorded Future
Recorded Future
The Last Watchdog
The Last Watchdog
N
News and Events Feed by Topic
T
The Blog of Author Tim Ferriss
O
OpenAI News
V
V2EX
人人都是产品经理
人人都是产品经理
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
WordPress大学
WordPress大学
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Security @ Cisco Blogs
C
Cisco Blogs
Security Latest
Security Latest
S
Security Affairs
V
Visual Studio Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
Last Week in AI
Last Week in AI
AWS News Blog
AWS News Blog
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
PCI Perspectives
PCI Perspectives
博客园_首页
U
Unit 42
Google DeepMind News
Google DeepMind News
Hugging Face - Blog
Hugging Face - Blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
The Register - Security
The Register - Security
N
Netflix TechBlog - Medium
L
LINUX DO - 热门话题
H
Hacker News: Front Page

博客园 - 大石头

[NewLife.XCode]实体队列(多线程生产的大数据集中保存) [NewLife.XCode]批量添删改操作(提升吞吐率) [NewLife.Net]单机400万长连接压力测试 [NewLife.XCode]高级统计(数据报表利器) [NewLife.XCode]分表分库(百亿级大数据存储) [NewLife.XCode]导入导出(实体对象百变魔君) [NewLife.XCode]角色权限 [NewLife.XCode]实体工厂(拦截处理实体操作) [NewLife.XCode]百亿级性能 [NewLife.XCode]对象字典缓存(百万军中取敌首级) [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能) [NewLife.XCode]数据层缓存(网站性能翻10倍) [NewLife.XCode]高级查询(化繁为简、分页提升性能) [NewLife.XCode]扩展属性(替代多表关联Join提升性能) [NewLife.XCode]事务处理(算准你的每一分钱) [NewLife.XCode]增量累加 [NewLife.XCode]脏数据 [NewLife.XCode]高级增删改 [NewLife.XCode]数据初始化
[NewLife.XCode]备份恢复与同步(数据搬运专家)
大石头 · 2022-01-20 · via 博客园 - 大石头

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

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