[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庫,包括創建數據表。

此處爲語雀視頻卡片,點擊鏈接查看:碼神數據同步.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://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);

由於是順序讀取數據,讀取性能很高,數據同步的瓶頸一般在於寫入數據庫。具體性能及錯誤分析,建議參考星塵監控。

 

系列教程

NewLife.XCode教程系列[2019版]

  1. 增刪改查入門。快速展現用法,代碼配置連接字符串
  2. 數據模型文件。建立表格字段和索引,名字以及數據類型規範,推薦字段(時間,用戶,IP)
  3. 實體類詳解。數據類業務類,泛型基類,接口
  4. 功能設置。連接字符串,調試開關,SQL日誌,慢日誌,參數化,執行超時。代碼與配置文件設置,連接字符串局部設置
  5. 反向工程。自動建立數據庫數據表
  6. 數據初始化。InitData寫入初始化數據
  7. 高級增刪改。重載攔截,自增字段,Valid驗證,實體模型(時間,用戶,IP)
  8. 髒數據。如何產生,怎麼利用
  9. 增量累加。高併發統計
  10. 事務處理。單表和多表,不同連接,多種寫法
  11. 擴展屬性。多表關聯,Map映射
  12. 高級查詢。複雜條件,分頁,自定義擴展FieldItem,查總記錄數,查彙總統計
  13. 數據層緩存。Sql緩存,更新機制
  14. 實體緩存。全表整理緩存,更新機制
  15. 對象緩存。字典緩存,適用用戶等數據較多場景。
  16. 百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
  17. 實體工廠。元數據,通用處理程序
  18. 角色權限。Membership
  19. 導入導出。Xml,Json,二進制,網絡或文件
  20. 分表分庫。常見拆分邏輯
  21. 高級統計。聚合統計,分組統計
  22. 批量寫入。批量插入,批量Upsert,異步保存
  23. 實體隊列。寫入級緩存,提升性能。
  24. 備份同步。備份數據,恢復數據,同步數據
  25. 數據服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版
  26. 大數據分析。ETL抽取,調度計算處理,結果持久化 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章