SQL Server資料全同步及價值分析[終結版],server價值分析
SQL Server資料全同步[終結版]著作權,轉載請註明出處,謝謝!經過兩天的同步編寫和測試,出了第一個Release版本:
1. 本函數僅支援單向同步,即從一個主要資料庫想多個從資料庫同步
2.主要資料庫的任何增刪改都會同步到所有從資料庫上
3. 最重要的一點:同步資料庫的價值所在:當主要資料庫伺服器不可用時,程式可以使用其他從資料庫或者備用資料庫,這對於未來公用雲端和私人雲端應用具有重大價值!
代碼:
<span style="font-size:18px;">/// <summary> /// Note: for columns, the first string must be primary key name! /// </summary> /// <param name="server"></param> /// <param name="database"></param> /// <param name="uid"></param> /// <param name="password"></param> /// <param name="tableName"></param> /// <param name="columns"></param> /// <param name="ignoreUpdateColumns"></param> /// <param name="ignoreInsertColumns"></param> public void BulkUpdateTo(string server, string database, string uid, string password, string tableName, List<string> columns, List<string> ignoreUpdateColumns, List<string> ignoreInsertColumns) { string primaryKeyName = columns[0]; string connectionString = "Server=" + server + ";Database=" + database + ";User Id=" + uid + ";Password=" + password; // Create destination connection SqlConnection destinationConnector = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand("SELECT * FROM " + tableName, destinationConnector); // Open source and destination connections. this.EnsureConnectionIsOpen(); destinationConnector.Open(); Dictionary<int, string> Index_PrimaryKeyValue = new Dictionary<int, string>(); SqlDataReader readerSource = cmd.ExecuteReader(); Dictionary<string, Dictionary<string, string>> recordsDest = new Dictionary<string, Dictionary<string, string>>(); int i = 0; while (readerSource.Read()) { Index_PrimaryKeyValue.Add(i, readerSource[primaryKeyName].ToString()); string recordIndex = Index_PrimaryKeyValue[i]; recordsDest[recordIndex] = new Dictionary<string, string>(); foreach (string keyName in columns) { recordsDest[recordIndex].Add(keyName, readerSource[keyName].ToString()); } i++; } // Select data from Products table cmd = new SqlCommand("SELECT * FROM " + tableName, mySqlConn); // Execute reader SqlDataReader reader = cmd.ExecuteReader(); Dictionary<string, Dictionary<string, string>> recordsSource = new Dictionary<string, Dictionary<string, string>>(); Dictionary<int, string> Index_PrimaryKeyValue2 = new Dictionary<int, string>(); int j = 0; while (reader.Read()) { Index_PrimaryKeyValue2.Add(j, reader[primaryKeyName].ToString()); string recordIndex = Index_PrimaryKeyValue2[j]; recordsSource[recordIndex] = new Dictionary<string, string>(); foreach (string keyName in columns) { recordsSource[recordIndex].Add(keyName, reader[keyName].ToString()); } j++; } reader.Close(); readerSource.Close(); foreach (var record in recordsSource) { string setScripts = string.Empty; string insertKeysScripts = string.Empty; string insertValuesScripts = string.Empty; int setScriptsIndex = 0; int insertScriptsIndex = 0; string primaryKeyValue = record.Key; if (recordsDest.ContainsKey(primaryKeyValue)) { foreach (string keyName in columns) { if (!ignoreUpdateColumns.Contains(keyName)) { if (recordsDest[primaryKeyValue][keyName] == record.Value[keyName]) { //do nothing } else { if (setScriptsIndex == 0) { setScripts += keyName + "='" + recordsSource[primaryKeyValue][keyName] + "' "; } else { setScripts += "," + keyName + "='" + recordsSource[primaryKeyValue][keyName] + "' "; } setScriptsIndex++; } } } } else { foreach (string keyName in columns) { if (!ignoreInsertColumns.Contains(keyName)) { if (insertScriptsIndex == 0) { insertKeysScripts += keyName; insertValuesScripts += "'" + recordsSource[primaryKeyValue][keyName] + "' "; } else { insertKeysScripts += "," + keyName; insertValuesScripts += ",'" + recordsSource[primaryKeyValue][keyName] + "' "; } insertScriptsIndex++; } } } //update source to dest if (setScriptsIndex > 0) { cmd = new SqlCommand("Update " + tableName + " set " + setScripts + " where " + primaryKeyName + "='" + recordsSource[primaryKeyValue][primaryKeyName] + "'", destinationConnector); cmd.ExecuteNonQuery(); } //insert source to dest if (insertScriptsIndex > 0) { cmd = new SqlCommand("insert into " + tableName + " (" + insertKeysScripts + ") values (" + insertValuesScripts + ")", destinationConnector); cmd.ExecuteNonQuery(); } } //after update and insert, the count still not match, means we delete some records in source db, then we also need to delete the records in destination db foreach (var re in recordsDest) { //get the delete record primary key value if (!recordsSource.ContainsKey(re.Key)) { cmd = new SqlCommand("delete from " + tableName + " where " + primaryKeyName + "='" + re.Value[primaryKeyName].ToString() + "'", destinationConnector); cmd.ExecuteNonQuery(); } } // Close objects destinationConnector.Close(); mySqlConn.Close(); }</span>
代碼的基礎類其他部分請看下列文章:
1. C#同步SQL Server資料庫中的資料--資料庫同步工具[同步已有的有變化的資料] 2.分析下自己寫的SQL Server同步工具的效能和缺陷 3.C#同步SQL Server資料庫中的資料--資料庫同步工具[同步新資料] 4.C#同步SQL Server資料庫Schema
SqlServer的資料同步
方法有很多種:
1. bcp.
2. 行集合函式(openrowset等)
3. 資料庫高可用性中的replication功能.
4. linked server
MS SQL SERVER 2005的資料同步怎做
利用資料庫複寫技術 實現資料同步更新
複製的概念
複製是將一組資料從一個資料來源拷貝到多個資料來源的技術,是將一份資料發布到多個儲存網站上的有效方式。使用複製技術,使用者可以將一份資料發布到多台伺服器上,從而使不同的伺服器使用者都可以在許可權的許可的範圍內共用這份資料。
複製技術可以確保分布在不同地點的資料自動同步更新,從而保證資料的一致性。
SQL複製的基本元素包括
出版伺服器、訂閱伺服器、散發者、出版物、文章
SQL複製的工作原理
SQL SERVER 主要採用出版物、訂閱的方式來處理複製。來源資料所在的伺服器是出版伺服器,負責發表資料。出版伺服器把要發表的資料的所有改變情況的拷貝複製到散發者,散發者包含有一個散發資料庫,可接收資料的所有改變,並儲存這些改變,再把這些改變分發給訂閱伺服器
SQL SERVER複製技術類型
SQL SERVER提供了三種複製技術,分別是:
1、快照式複寫(呆會我們就使用這個)
2、事務複製
3、合併式複寫
只要把上面這些概念弄清楚了那麼對複製也就有了一定的理解。接下來我們就一步一步來實現複製的步驟。
第一先來配置出版伺服器
(1)選中指定[伺服器]節點
(2)從[工具]下拉式功能表的[複製]子功能表中選擇[發布、訂閱伺服器和分發]命令
(3)系統彈出一個對話方塊點[下一步]然後看著提示一直操作到完成。
(4)當完成了出版伺服器的設定以後系統會為該伺服器的樹形結構中添加一個複製監視器。同時也產生一個散發資料庫(distribution)
第二建立出版物
(1)選中指定的伺服器
(2)從[工具]菜單的[複製]子功能表中選擇[建立和管理髮布]命令。此時系統會彈出一個對話方塊
(3)選擇要建立出版物的資料庫,然後單擊[建立發布]
(4)在[建立發布嚮導]的提示對話方塊中單擊[下一步]系統就會彈出一個對話方塊。對話方塊上的內容是複製的三個類型。我們現在選第一個也就是預設的快照發布(其他兩個大家可以去看看協助)
(5)單擊[下一步]系統要求指定可以訂閱該發布的資料庫伺服器類型,SQLSERVER允許在不同的資料庫如 ORACLE或ACCESS之間進行資料複製。但是在這裡我們選擇運行"SQL SERVER 2000"的資料庫伺服器
(6)單擊[下一步]系統就彈出一個定義文章的對話方塊也就是選擇要出版的表
(7)然後[下一步]直到操作完成。當完成出版物的建立後建立出版物的資料庫也就變成了一個共用資料庫。
第三設計訂閱
(1)選中指定的訂閱伺服器
(2)從[工具]下拉式功能表中選擇[複製]子功能表的[提取訂閱]
(3)按照單擊[下一步]操作直到系統會提示檢查SQL SERVER代理服務的運行狀態,執行複製操作的前提條件是SQL SERVER代理服務必須已經啟動。
(4)單擊[完成]。完成訂閱操作。
完成上面的步驟其實複製也就是成功了。但是如何來知道複製是否成功了呢?這裡可以通過這種方法來快速看是否成功。展開出版伺服器下面的複製——發布內容——右鍵發布內容——屬性——擊活——狀態然後點立即運行代理程式接著點代理程式屬性擊活調度把調度設定為每一天發生,每一分鐘,在0:00:00和23:59:59之間。接下來就是判斷複製是否成功了開啟C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database下面看是不是有一些以時間做為檔案......餘下全文>>