[NewLife.XCode]備份恢復與同步(數(shù)據(jù)搬運專家)
NewLife.XCode是一個有20年歷史的開源數(shù)據(jù)中間件,支持net6/net5/net45/net40,由新生命團隊(2002~2020)開發(fā)完成并維護至今,以下簡稱XCode。
整個系列教程會大量結合示例代碼和運行日志來進行深入分析,蘊含多年開發(fā)經(jīng)驗于其中,代表作有百億級大數(shù)據(jù)實時計算項目。
開源地址:https://github.com/NewLifeX/X (求star, 1450+)
Nuget包:NewLife.XCode
源代碼:https://github.com/NewLifeX/X/blob/master/XCode/DataAccessLayer/DbPackage.cs
數(shù)據(jù)應用開發(fā)中,經(jīng)常需要用到備份、恢復和同步功能,XCode內(nèi)置支持跨數(shù)據(jù)庫備份同步。特別在分析線上問題時,經(jīng)常是恨不得把線上某些表數(shù)據(jù)“弄”回來本地。所以,你需要XCode。
碼神工具跨庫數(shù)據(jù)同步
把數(shù)據(jù)從一個庫同步到另一個庫,以下視頻從MySql庫同步數(shù)據(jù)到SQLite庫,包括創(chuàng)建數(shù)據(jù)表。
DbPackage類
數(shù)據(jù)備份恢復功能由DbPackage類提供支持。使用時僅需要指定Dal數(shù)據(jù)庫連接,例如 dp.Dal = DAL.Create("memberShip") 。
DbPackage 操作數(shù)據(jù)有幾大核心:
- 二進制備份數(shù)據(jù),占用空間小;
- Actor并行處理,讀寫同時進行,極快速度;
- 中性備份文件,數(shù)據(jù)庫無關性,支持異構備份與恢復;
主要設置如下:
/// <summary>
/// 數(shù)據(jù)庫連接
/// </summary>
public DAL Dal { get; set; }
/// <summary>數(shù)據(jù)頁事件</summary>
public event EventHandler<PageEventArgs> OnPage;
/// <summary>批量處理時,忽略單表錯誤,繼續(xù)處理下一個。默認true</summary>
public Boolean IgnoreError { get; set; } = true;
/// <summary>
/// 性能追蹤器
/// </summary>
public ITracer Tracer { get; set; } = DAL.GlobalTracer;
備份
數(shù)據(jù)備份,把一個或多個表數(shù)據(jù)備份為壓縮文件,支持備份數(shù)據(jù)表結構。
采用Actor架構,雙線并行處理,主線程逐頁抽取數(shù)據(jù),Actor線程寫入備份文件。
數(shù)據(jù)庫結構備份為xml文件,單表數(shù)據(jù)備份為DbTable的二進制格式,因此備份文件非常小。
數(shù)據(jù)備份文件為NET類型的中性文件,與數(shù)據(jù)庫類型及版本無關,可以恢復到其它任意類型數(shù)據(jù)庫。數(shù)據(jù)備份文件頭部記錄字段名及字段類型,之后的數(shù)據(jù)逐行存儲。
數(shù)據(jù)備份文件格式可閱讀DbTable說明, https://www.yuque.com/smartstone/nx/dbtable
主要方法:
// 備份單表數(shù)據(jù),抽取數(shù)據(jù)和寫入文件雙線程
Int32 Backup(IDataTable table, Stream stream);
// 備份單表數(shù)據(jù)到文件
Int32 Backup(IDataTable table, String file = null);
// 備份一批表到指定壓縮文件
Int32 BackupAll(IList<IDataTable> tables, String file, Boolean backupSchema = true);
數(shù)據(jù)抽取邏輯,如果有自增字段,則按照自增字段分批抽取。否則使用直接分頁的方式抽取,在數(shù)據(jù)量較大時(大于1萬行),性能會越來越慢。
由于是順序寫入,寫入性能很高,數(shù)據(jù)備份的瓶頸一般在于原始數(shù)據(jù)抽取。具體性能及錯誤分析,建議參考星塵監(jiān)控。
恢復
數(shù)據(jù)恢復,把一個壓縮文件恢復到目標數(shù)據(jù)庫,支持恢復數(shù)據(jù)表結構,包括創(chuàng)建表和修改表。
采用Actor架構,雙線并行處理,主線程逐頁讀取文件,Actor線程分批寫入數(shù)據(jù)庫。
由于備份文件是數(shù)據(jù)庫無關的中性文件,因此目標數(shù)據(jù)庫可以是不同于備份庫的其它數(shù)據(jù)庫類型。
備份時僅記錄基礎數(shù)據(jù)類型,因此個別特殊類型字段可能恢復失敗。
主要方法:
// 從數(shù)據(jù)流恢復數(shù)據(jù)
Int32 Restore(Stream stream, IDataTable table);
// 從文件恢復數(shù)據(jù)
Int64 Restore(String file, IDataTable table, Boolean setSchema = true);
// 從指定壓縮文件恢復一批數(shù)據(jù)到目標庫
IDataTable[] RestoreAll(String file, IDataTable[] tables = null, Boolean setSchema = true);
由于是順序讀取文件,讀取性能很高,數(shù)據(jù)恢復的瓶頸一般在于寫入數(shù)據(jù)庫。具體性能及錯誤分析,建議參考星塵監(jiān)控。
同步
數(shù)據(jù)同步,把一個庫的單表或多表同步到另一個庫,支持同步數(shù)據(jù)表結構,包括創(chuàng)建表和修改表。
采用Actor架構,雙線并行處理,主線程逐頁抽取數(shù)據(jù),Actor線程分批寫入目標庫。
由于同步過程中轉為數(shù)據(jù)庫無關的DbTable中性數(shù)據(jù)集,因此目標庫可以是不同于源庫的其它數(shù)據(jù)庫類型。
支持同步所有基礎數(shù)據(jù)類型,特殊數(shù)據(jù)類型有可能同步失敗。
主要方法:
// 同步單表數(shù)據(jù)
Int32 Sync(IDataTable table, String connName, Boolean syncSchema = true);
// 備份一批表到另一個庫
IDictionary<String, Int32> SyncAll(IDataTable[] tables, String connName, Boolean syncSchema = true);
由于是順序讀取數(shù)據(jù),讀取性能很高,數(shù)據(jù)同步的瓶頸一般在于寫入數(shù)據(jù)庫。具體性能及錯誤分析,建議參考星塵監(jiān)控。
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現(xiàn)用法,代碼配置連接字符串
- 數(shù)據(jù)模型文件。建立表格字段和索引,名字以及數(shù)據(jù)類型規(guī)范,推薦字段(時間,用戶,IP)
- 實體類詳解。數(shù)據(jù)類業(yè)務類,泛型基類,接口
- 功能設置。連接字符串,調(diào)試開關,SQL日志,慢日志,參數(shù)化,執(zhí)行超時。代碼與配置文件設置,連接字符串局部設置
- 反向工程。自動建立數(shù)據(jù)庫數(shù)據(jù)表
- 數(shù)據(jù)初始化。InitData寫入初始化數(shù)據(jù)
- 高級增刪改。重載攔截,自增字段,Valid驗證,實體模型(時間,用戶,IP)
- 臟數(shù)據(jù)。如何產(chǎn)生,怎么利用
- 增量累加。高并發(fā)統(tǒng)計
- 事務處理。單表和多表,不同連接,多種寫法
- 擴展屬性。多表關聯(lián),Map映射
- 高級查詢。復雜條件,分頁,自定義擴展FieldItem,查總記錄數(shù),查匯總統(tǒng)計
- 數(shù)據(jù)層緩存。Sql緩存,更新機制
- 實體緩存。全表整理緩存,更新機制
- 對象緩存。字典緩存,適用用戶等數(shù)據(jù)較多場景。
- 百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
- 實體工廠。元數(shù)據(jù),通用處理程序
- 角色權限。Membership
- 導入導出。Xml,Json,二進制,網(wǎng)絡或文件
- 分表分庫。常見拆分邏輯
- 高級統(tǒng)計。聚合統(tǒng)計,分組統(tǒng)計
- 批量寫入。批量插入,批量Upsert,異步保存
- 實體隊列。寫入級緩存,提升性能。
- 備份同步。備份數(shù)據(jù),恢復數(shù)據(jù),同步數(shù)據(jù)
- 數(shù)據(jù)服務。提供RPC接口服務,遠程執(zhí)行查詢,例如SQLite網(wǎng)絡版
- 大數(shù)據(jù)分析。ETL抽取,調(diào)度計算處理,結果持久化

浙公網(wǎng)安備 33010602011771號