备份恢复与同步(数据搬运专家)
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。
碼神工具跨庫數據同步
把數據從一個庫同步到另一個庫,以下視頻從SQLite庫同步數據到MySql庫,包括創建數據表。
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);由于是順序讀取數據,讀取性能很高,數據同步的瓶頸一般在于寫入數據庫。具體性能及錯誤分析,建議參考星塵監控。
總結
以上是生活随笔為你收集整理的备份恢复与同步(数据搬运专家)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 运算符的优先级和关联性
- 下一篇: Autofac实现有条件的DI