备份恢复与同步(数据搬运专家)
NewLife.XCode是一個(gè)有20年歷史的開(kāi)源數(shù)據(jù)中間件,支持net6/net5/net45/net40,由新生命團(tuán)隊(duì)(2002~2020)開(kāi)發(fā)完成并維護(hù)至今,以下簡(jiǎn)稱XCode。
整個(gè)系列教程會(huì)大量結(jié)合示例代碼和運(yùn)行日志來(lái)進(jìn)行深入分析,蘊(yùn)含多年開(kāi)發(fā)經(jīng)驗(yàn)于其中,代表作有百億級(jí)大數(shù)據(jù)實(shí)時(shí)計(jì)算項(xiàng)目。
開(kāi)源地址:https://github.com/NewLifeX/X?(求star, 1450+)
Nuget包:NewLife.XCode
源代碼:https://github.com/NewLifeX/X/blob/master/XCode/DataAccessLayer/DbPackage.cs
數(shù)據(jù)應(yīng)用開(kāi)發(fā)中,經(jīng)常需要用到備份、恢復(fù)和同步功能,XCode內(nèi)置支持跨數(shù)據(jù)庫(kù)備份同步。特別在分析線上問(wèn)題時(shí),經(jīng)常是恨不得把線上某些表數(shù)據(jù)“弄”回來(lái)本地。所以,你需要XCode。
碼神工具跨庫(kù)數(shù)據(jù)同步
把數(shù)據(jù)從一個(gè)庫(kù)同步到另一個(gè)庫(kù),以下視頻從SQLite庫(kù)同步數(shù)據(jù)到MySql庫(kù),包括創(chuàng)建數(shù)據(jù)表。
DbPackage類
數(shù)據(jù)備份恢復(fù)功能由DbPackage類提供支持。使用時(shí)僅需要指定Dal數(shù)據(jù)庫(kù)連接,例如 dp.Dal = DAL.Create("memberShip") 。
DbPackage 操作數(shù)據(jù)有幾大核心:
二進(jìn)制備份數(shù)據(jù),占用空間小;
Actor并行處理,讀寫(xiě)同時(shí)進(jìn)行,極快速度;
中性備份文件,數(shù)據(jù)庫(kù)無(wú)關(guān)性,支持異構(gòu)備份與恢復(fù);
主要設(shè)置如下:
/// <summary> /// 數(shù)據(jù)庫(kù)連接 /// </summary> public DAL Dal { get; set; }/// <summary>數(shù)據(jù)頁(yè)事件</summary> public event EventHandler<PageEventArgs> OnPage;/// <summary>批量處理時(shí),忽略單表錯(cuò)誤,繼續(xù)處理下一個(gè)。默認(rèn)true</summary> public Boolean IgnoreError { get; set; } = true;/// <summary> /// 性能追蹤器 /// </summary> public ITracer Tracer { get; set; } = DAL.GlobalTracer;備份
數(shù)據(jù)備份,把一個(gè)或多個(gè)表數(shù)據(jù)備份為壓縮文件,支持備份數(shù)據(jù)表結(jié)構(gòu)。
采用Actor架構(gòu),雙線并行處理,主線程逐頁(yè)抽取數(shù)據(jù),Actor線程寫(xiě)入備份文件。
數(shù)據(jù)庫(kù)結(jié)構(gòu)備份為xml文件,單表數(shù)據(jù)備份為DbTable的二進(jìn)制格式,因此備份文件非常小。
數(shù)據(jù)備份文件為NET類型的中性文件,與數(shù)據(jù)庫(kù)類型及版本無(wú)關(guān),可以恢復(fù)到其它任意類型數(shù)據(jù)庫(kù)。數(shù)據(jù)備份文件頭部記錄字段名及字段類型,之后的數(shù)據(jù)逐行存儲(chǔ)。
數(shù)據(jù)備份文件格式可閱讀DbTable說(shuō)明, https://www.yuque.com/smartstone/nx/dbtable
主要方法:
// 備份單表數(shù)據(jù),抽取數(shù)據(jù)和寫(xiě)入文件雙線程 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ù)抽取邏輯,如果有自增字段,則按照自增字段分批抽取。否則使用直接分頁(yè)的方式抽取,在數(shù)據(jù)量較大時(shí)(大于1萬(wàn)行),性能會(huì)越來(lái)越慢。
由于是順序?qū)懭?#xff0c;寫(xiě)入性能很高,數(shù)據(jù)備份的瓶頸一般在于原始數(shù)據(jù)抽取。具體性能及錯(cuò)誤分析,建議參考星塵監(jiān)控。
恢復(fù)
數(shù)據(jù)恢復(fù),把一個(gè)壓縮文件恢復(fù)到目標(biāo)數(shù)據(jù)庫(kù),支持恢復(fù)數(shù)據(jù)表結(jié)構(gòu),包括創(chuàng)建表和修改表。
采用Actor架構(gòu),雙線并行處理,主線程逐頁(yè)讀取文件,Actor線程分批寫(xiě)入數(shù)據(jù)庫(kù)。
由于備份文件是數(shù)據(jù)庫(kù)無(wú)關(guān)的中性文件,因此目標(biāo)數(shù)據(jù)庫(kù)可以是不同于備份庫(kù)的其它數(shù)據(jù)庫(kù)類型。
備份時(shí)僅記錄基礎(chǔ)數(shù)據(jù)類型,因此個(gè)別特殊類型字段可能恢復(fù)失敗。
主要方法:
// 從數(shù)據(jù)流恢復(fù)數(shù)據(jù) Int32 Restore(Stream stream, IDataTable table); // 從文件恢復(fù)數(shù)據(jù) Int64 Restore(String file, IDataTable table, Boolean setSchema = true); // 從指定壓縮文件恢復(fù)一批數(shù)據(jù)到目標(biāo)庫(kù) IDataTable[] RestoreAll(String file, IDataTable[] tables = null, Boolean setSchema = true);由于是順序讀取文件,讀取性能很高,數(shù)據(jù)恢復(fù)的瓶頸一般在于寫(xiě)入數(shù)據(jù)庫(kù)。具體性能及錯(cuò)誤分析,建議參考星塵監(jiān)控。
同步
數(shù)據(jù)同步,把一個(gè)庫(kù)的單表或多表同步到另一個(gè)庫(kù),支持同步數(shù)據(jù)表結(jié)構(gòu),包括創(chuàng)建表和修改表。
采用Actor架構(gòu),雙線并行處理,主線程逐頁(yè)抽取數(shù)據(jù),Actor線程分批寫(xiě)入目標(biāo)庫(kù)。
由于同步過(guò)程中轉(zhuǎn)為數(shù)據(jù)庫(kù)無(wú)關(guān)的DbTable中性數(shù)據(jù)集,因此目標(biāo)庫(kù)可以是不同于源庫(kù)的其它數(shù)據(jù)庫(kù)類型。
支持同步所有基礎(chǔ)數(shù)據(jù)類型,特殊數(shù)據(jù)類型有可能同步失敗。
主要方法:
// 同步單表數(shù)據(jù) Int32 Sync(IDataTable table, String connName, Boolean syncSchema = true); // 備份一批表到另一個(gè)庫(kù) IDictionary<String, Int32> SyncAll(IDataTable[] tables, String connName, Boolean syncSchema = true);由于是順序讀取數(shù)據(jù),讀取性能很高,數(shù)據(jù)同步的瓶頸一般在于寫(xiě)入數(shù)據(jù)庫(kù)。具體性能及錯(cuò)誤分析,建議參考星塵監(jiān)控。
總結(jié)
以上是生活随笔為你收集整理的备份恢复与同步(数据搬运专家)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# 运算符的优先级和关联性
- 下一篇: Autofac实现有条件的DI