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);
由於是順序讀取數據,讀取性能很高,數據同步的瓶頸一般在於寫入數據庫。具體性能及錯誤分析,建議參考星塵監控。
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現用法,代碼配置連接字符串
- 數據模型文件。建立表格字段和索引,名字以及數據類型規範,推薦字段(時間,用戶,IP)
- 實體類詳解。數據類業務類,泛型基類,接口
- 功能設置。連接字符串,調試開關,SQL日誌,慢日誌,參數化,執行超時。代碼與配置文件設置,連接字符串局部設置
- 反向工程。自動建立數據庫數據表
- 數據初始化。InitData寫入初始化數據
- 高級增刪改。重載攔截,自增字段,Valid驗證,實體模型(時間,用戶,IP)
- 髒數據。如何產生,怎麼利用
- 增量累加。高併發統計
- 事務處理。單表和多表,不同連接,多種寫法
- 擴展屬性。多表關聯,Map映射
- 高級查詢。複雜條件,分頁,自定義擴展FieldItem,查總記錄數,查彙總統計
- 數據層緩存。Sql緩存,更新機制
- 實體緩存。全表整理緩存,更新機制
- 對象緩存。字典緩存,適用用戶等數據較多場景。
- 百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
- 實體工廠。元數據,通用處理程序
- 角色權限。Membership
- 導入導出。Xml,Json,二進制,網絡或文件
- 分表分庫。常見拆分邏輯
- 高級統計。聚合統計,分組統計
- 批量寫入。批量插入,批量Upsert,異步保存
- 實體隊列。寫入級緩存,提升性能。
- 備份同步。備份數據,恢復數據,同步數據
- 數據服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版
- 大數據分析。ETL抽取,調度計算處理,結果持久化