下列問題和解答提供複寫資料庫系統管理員所面對的各種工作指引。
設定複寫
在資料集發佈時,是否需要停止其上的活動?
否。 建立發行集時,活動可以在資料庫上繼續。 請注意,產生快照集可能會耗用大量資源,因此最好在資料庫上較低活動期間產生快照集(根據預設,當您完成 [新增發行集精靈] 時會產生快照集)。
資料表在快照生成過程中是否鎖定?
鎖定的時間長度取決於所使用的復寫類型:
針對合併發行,快照代理程式不會取得任何鎖定。
針對交易出版物,快照代理程式預設只會在快照產生的初始階段進行鎖定。
針對快照發行,快照代理程式會在整個快照產生過程中進行鎖定。
因為鎖定會防止其他使用者更新數據表,因此快照代理程式應該排程於資料庫活動較少時執行,尤其是快照發行。
何時有可用的訂用帳戶;何時可以使用訂閱資料庫?
快照套用至訂閱資料庫之後,訂閱才可供使用。 即使在此之前可以存取訂閱資料庫,快照集套用後才能使用資料庫。 使用複寫監視器來檢查快照集產生和應用程式的狀態:
快照集是由快照集代理程式所產生。 在復寫監視器的 [代理程式] 索引標籤上,檢視發行集快照產生的狀態。 如需詳細資訊,請參閱使用複寫監視器來檢視資訊及執行工作。
快照集是由散發代理程式或合併代理程式套用。 在復寫監視器的 [ 散發代理程式 ] 或 [ 合併代理程式 ] 頁面中,檢視快照集應用程式的狀態。
當散發或合併代理程式啟動時,如果快照集代理程式尚未完成,會發生什麼情況?
如果散發代理程式或合併代理程式與快照集代理程式同時執行,則不會產生錯誤。 不過,您必須注意下列事項:
如果散發代理程式或合併代理程式設定為持續執行,代理程式會在快照集代理程式完成之後自動套用快照集。
如果散發代理程式或合併代理程式設定為依排程或隨選執行,而且代理程式執行時沒有可用的快照集,代理程式將會關閉,並顯示快照集尚無法使用的訊息。 您必須再次執行代理程式,才能在快照代理程式完成之後套用快照。 如需有關執行代理程式的更多資訊,請參閱 同步處理推送訂閱、同步處理提取訂閱 和 複寫代理程式可執行檔概念。
我應該編寫複寫組態的腳本嗎?
是的。 編寫複寫組態腳本是複製拓撲之任何災害復原計劃的重要部分。 如需腳本的詳細資訊,請參閱 腳本複寫。
復寫資料庫需要哪些恢復模式?
使用任何恢復模式進行複寫功能均能正常運作:簡單、大量記錄或完整。 合併式複寫會藉由將資訊儲存在元數據表中來追蹤變更。 事務複製會藉由標記事務記錄來追蹤變更,但此標記過程不會受到恢復模式的影響。
復寫為何會將欄新增至復寫數據表?如果數據表未發佈,是否會移除它?
若要追蹤變更,合併式複寫和事務複製與佇列更新訂閱必須能夠唯一識別每個已發佈數據表中的每個數據列。 若要完成這個程序:
合併式復寫會將數據行 rowguid 新增至每個數據表,除非數據表已經有具有 ROWGUIDCOL 屬性集的數據類型 uniqueidentifier 數據行(在此情況下會使用此數據行)。 如果資料表從發行項目中刪除,則會移除 rowguid 欄位;如果現有的欄位用於追蹤,則不會移除該欄位。
如果交易式發行集支援佇列更新訂閱,複寫會將數據行 msrepl_tran_version 新增至每個數據表。 如果從發行項目中卸除資料表,則不會移除 msrepl_tran_version 欄。
篩選不得包含
rowguidcol複寫用來識別資料列的 。 根據預設,這是您在設定合併式複寫時新增的數據行,並命名為 rowguid。
如何管理已發行數據表的條件約束?
關於已發行數據表的條件約束,有幾個需要考慮的問題:
事務複製需要每個已發佈數據表的主鍵約束。 合併式複寫不需要主鍵,但如果有主鍵,則必須進行複寫。 快照式複寫不需要主鍵。
根據預設,主鍵條件約束、索引和檢查條件約束會復寫至訂閱者。
依預設,NOT FOR REPLICATION 選項將指定給外鍵約束和檢查約束;此約束對使用者操作而非代理操作強制執行。
如需設定控制是否複寫條件約束之架構選項的資訊,請參閱 指定架構選項。
如何管理識別欄位?
復寫為包含訂閱者端更新的復寫拓撲提供自動識別範圍管理。 如需詳細資訊,請參閱 複寫識別數據行。
相同的物品是否可以發布到不同的出版物中?
是的,但有一些限制。 如需詳細資訊,請參閱 發行數據和資料庫物件主題中的「在多個發行中發行資料表」一節。
多個發行集可以使用相同的分發資料庫嗎?
是的。 對可以使用相同散發資料庫之發行集的數目或類型沒有任何限制。 所有來自指定出版社的出版物必須使用相同的分銷商和分銷資料庫。
如果您有多個發行集,您可以在散發者端設定多個散發資料庫,以確保流經每個散發資料庫的數據來自單一發行集。 使用 [ 散發者屬性 ] 對話框或 sp_adddistributiondb (Transact-SQL) 來新增散發資料庫。 如需存取對話框的詳細資訊,請參閱 檢視和修改散發者和發行者屬性。
如何尋找散發者和發行者的相關信息,例如資料庫中哪些對象已發佈?
此資訊可透過 SQL Server Management Studio 和一些復寫預存程式取得。 如需詳細資訊,請參閱 散發者和發行者資訊腳本。
複寫是否加密數據?
否。 複寫不會加密儲存在資料庫中或透過網路傳輸的數據。 如需詳細資訊,請參閱 SQL Server 複寫安全性主題的一節。
如何透過因特網復寫數據?
使用下列方式透過因特網複寫資料:
虛擬專用網(VPN)。 如需詳細資訊,請參閱 使用 VPN 透過因特網發佈數據。
用於合併複寫的 Web 同步選項。 如需詳細資訊,請參閱 合併複寫的 Web 同步化。
所有類型的 Microsoft SQL Server 複寫都可以透過 VPN 複寫數據,但如果您使用合併式複寫,您應該考慮使用 Web 同步處理。
如果卸除連線,復寫是否會繼續
是的。 復寫處理會在中斷連接時繼續執行。 如果您透過不可靠的網路使用合併式複寫,請考慮使用邏輯記錄,以確保相關變更會以單位方式處理。 如需詳細資訊,請參閱 使用邏輯記錄將相關數據列的變更分組。
複寫是否可透過低頻寬連線運作? 它是否使用壓縮?
是,復寫會透過低頻寬連線運作。 針對透過 TCP/IP 的連線,它會使用通訊協定提供的壓縮,但不提供額外的壓縮。 針對透過 HTTPS 的 Web 同步處理連線,它會使用通訊協定所提供的壓縮,以及用於複製變更之 XML 檔案的額外壓縮。
登入和對象擁有權
登入和密碼是否複寫?
否。 您可以建立 DTS 套件,將登入和密碼從發行者傳輸到一或多個訂閱者。
什麼是架構及其復寫方式?
從 Microsoft SQL Server 2005 開始, 架構 有兩個意義:
對象的定義,例如 CREATE TABLE 語句。 根據預設,複寫會將所有復寫物件的定義複製到訂閱者。
物件建立所在的命名空間: <Database>。<架構>。<物件>。 架構是使用 CREATE SCHEMA 語句來定義。
在 [新增發行集精靈] 中,複寫在架構和物件擁有權方面具有下列預設行為:
對於相容性層級為 90 或更高的合併發行集、快照發行集和交易發行集中的文章:根據預設,訂閱者端的物件擁有者與發行者端相應物件的擁有者相同。 如果擁有對象的架構不存在於訂閱者端,則會自動建立它們。
對於相容性層級低於 90 的合併式發行集發行項:根據預設,擁有者會保留空白,並在訂閱者上建立對象期間指定為 dbo 。
針對 Oracle 出版物中的文章:根據預設,擁有者會指定為 dbo。
對於使用字元模式快照的發行集中的發行項(用於非 SQL Server 訂閱者和 SQL Server Compact 訂閱者),預設情況下,擁有者為空白。 預設的擁有者是與散發代理程式或合併代理程式用於連接訂閱者的帳戶相關聯的擁有者。
對象擁有者可以透過 [ 發行項屬性 - <發行項> ] 對話框和下列預存程式來變更: sp_addarticle、 sp_addmergearticle、 sp_changearticle和 sp_changemergearticle。 如需詳細資訊,請參閱 檢視和修改發行集屬性、 定義發行項和 檢視及修改發行項屬性。
如何設定訂閱資料庫的授與,以符合發行集資料庫的授與?
根據預設,複寫不會在訂閱資料庫上執行 GRANT 語句。 如果您要訂閱資料庫的許可權符合發行集資料庫的許可權,請使用下列其中一種方法:
直接在訂閱資料庫執行 GRANT 語句。
使用快照後腳本來執行指令。 如需詳細資訊,請參閱 套用快照集前後執行腳本。
使用預存程式 sp_addscriptexec 來執行語句。
如果重新初始化訂閱,在訂用帳戶資料庫中授與的許可權會發生什麼事?
根據預設,位於訂閱者端的物件在重新初始化訂閱時會被移除並重新建立,這會導致所有已授予這些物件的許可權被撤銷。 有兩種方式可以處理此動作:
重新初始化後,請按照上一節所述的技術重新套用補助。
指定重新初始化訂閱時,不應該卸除物件。 在重新初始化之前,請執行下列其中一項:
執行 sp_changearticle 或 sp_changemergearticle。 指定參數@property的值為 'pre_creation_cmd' (sp_changearticle) 或 'pre_creation_command' (sp_changemergearticle),並指定參數@value的值為 'none'、'delete' 或 'truncate'。
在 [目的地物件] 區段中的 [發行項屬性 - <發行項>] 對話框中,選取 [讓現有物件保持不變]、[刪除數據] 的值。如果發行項具有數據列篩選,則只刪除符合篩選的數據。如果名稱正在使用中,請針對 [動作] 選項,截斷現有物件中的所有數據。 如需存取此對話框的詳細資訊,請參閱 檢視和修改發行集屬性。
資料庫維護
為什麼我無法在已發佈的數據表上執行 TRUNCATE TABLE?
TRUNCATE TABLE 是不記錄的操作,不會觸發觸發器。 不允許這麼做,因為復寫無法追蹤作業所造成的變更:事務複製會透過事務歷史記錄追蹤變更;合併式復寫會透過發行數據表上的觸發程式追蹤變更。
在複寫的資料庫上執行大量插入命令的效果為何?
對於事務複寫,批次插入會與其他插入一樣被追蹤和複製。 針對合併式複寫,您必須確定變更追蹤元數據已正確更新。
備份和還原是否有任何復寫考慮?
是的。 與資料庫複製有關的資料庫需要考慮一些特殊事項。 如需詳細資訊,請參閱 備份及還原複寫的資料庫。
復寫是否會影響事務歷史記錄的大小?
合併式複製和快照式複製不會影響事務記錄檔大小,但事務性複製可以。 如果資料庫包含一或多個交易性出版物,在與該出版物相關的所有交易傳送至散發資料庫之前,記錄檔不會被截斷。 如果事務歷史記錄成長太大,且記錄讀取器代理程式是以排程方式執行,請考慮縮短執行之間的間隔。 或者,將它設定為以連續模式執行。 如果設定為以連續模式執行 (預設值),請確定它正在執行。 如需檢查記錄讀取器代理程序狀態的詳細資訊,請參閱 使用複寫監視器檢視資訊和執行工作。
此外,如果您已在發行集資料庫或散發資料庫上設定 [同步備份] 選項,則在備份所有交易之前,不會截斷交易日志。 如果事務歷史記錄成長太大,而且您已設定此選項,請考慮縮短事務歷史記錄備份之間的間隔。 如需有關備份和還原事務複製相關資料庫的詳細資訊,請參閱 備份和還原快照式和事務複製的策略。
如何重建複寫資料庫中的索引或數據表?
重建索引有各種機制。 它們全都可以在不考慮複寫的特殊處理下使用,但有以下例外:交易式發行集中的資料表需要主鍵,因此您無法刪除並重新建立這些資料表的主鍵。
如何在發行集和訂閱資料庫上新增或變更索引?
索引可以在發行者或訂閱者端新增,對於複寫没有特殊考慮(請注意索引可能會影響效能)。 CREATE INDEX 和 ALTER INDEX 不會被複製,因此,如果您在發行者上新增或變更索引,您必須在訂閱者上進行相同的新增或變更,這樣才能在那裡反映出來。
如何移動或重新命名復寫相關資料庫的檔案?
在 SQL Server 2005 之前的 SQL Server 版本中,移動或重新命名資料庫檔案需要卸離和重新附加資料庫。 由於無法卸離複寫的資料庫,因此必須先從這些資料庫移除複寫。 從 SQL Server 2005 開始,您可以移動或重新命名檔案,而不中斷連結和重新附加資料庫,而不會影響復寫。 如需移動和重新命名檔案的詳細資訊,請參閱 ALTER DATABASE (Transact-SQL) 。
如何刪除正在複製的資料表?
請先使用 sp_droparticle、sp_dropmergearticle 或 [發行集屬性 - <發行> 集] 對話框來從發行集中卸除此條目,然後從資料庫中卸載它DROP <Object>。 在加入訂閱之後,您無法從快照式或交易式發行中刪除項目。您必須先刪除訂閱。 如需詳細資訊,請參閱 將文章新增至現有出版物或移除文章。
如何在已發佈數據表上新增或卸除數據行?
SQL Server 在已發佈的物件上支援各種不同的架構變更,包括新增和卸除數據行。 例如,在發行者端執行 ALTER TABLE ... DROP COLUMN,該語句會複製到訂閱者,並執行以刪除該欄位。 在 SQL Server 2005 之前的 SQL Server 版本中,訂閱者支援透過預存程序 sp_repladdcolumn 和 sp_repldropcolumn 來新增和刪除資料行。 如需詳細資訊,請參閱對發行集資料庫進行結構描述變更。
複寫維護
如何判斷訂閱者端的數據是否與發行者端的數據同步處理?
使用驗證。 驗證報告檢驗某個訂閱者是否與發行者同步。 如需詳細資訊,請參閱驗證複製的資料。 如果有任何數據列未正確同步,驗證不會提供哪些數據列的相關信息,但 tablediff 公用程式 會提供。
如何將數據表新增至現有的發行集?
不需要停止發行集或訂閱資料庫上的活動,才能加入數據表(或其他物件)。 透過 [發行屬性 - <發行>] 對話框,或使用預存程序 sp_addarticle 和 sp_addmergearticle,將資料表新增至發行。 如需詳細資訊,請參閱 將文章新增至現有出版物或移除文章。
如何從發行集移除數據表?
使用 sp_droparticle、 sp_dropmergearticle 或 [ 發行集屬性 - <發行集> ] 對話框,從發行集移除數據表。 在加入訂閱之後,您無法從快照式或交易式發行集卸除發行項;您必須先卸除訂用帳戶。 如需詳細資訊,請參閱 將文章新增至現有出版物或移除文章。
哪些動作需要重新初始化訂用帳戶?
有許多發行項和發行集變更需要重新初始化訂閱。 如需詳細資訊,請參閱 更改出版物和文章屬性。
哪些動作會導致快照集失效?
有許多發行項和發行集變更會使快照集失效,而且需要產生新的快照集。 如需詳細資訊,請參閱 變更出版物和文章屬性。
如何移除複寫?
從資料庫移除複寫所需的動作取決於資料庫是否做為發行集資料庫、訂閱資料庫或兩者。
如何判斷是否有要復寫的交易或數據列?
針對事務複製,請使用預存程序或在複寫監視器中的 未散發命令 索引標籤。 如需詳細資訊,請參閱 檢視散發資料庫中的複寫命令和其他資訊(複寫 Transact-SQL 程序設計), 以及 使用複寫監視器檢視資訊和執行工作。
針對合併式複寫,請使用預存程式 sp_showpendingchanges。 如需詳細資訊,請參閱 sp_showpendingchanges (Transact-SQL) 。
散發代理程式落後多遠? 我應該重新初始化嗎?
使用複寫監視器中的 sp_replmonitorsubscriptionpendingcmds 預存程式或 [未散發的命令] 索引 標籤。 預存程序和索引標籤顯示:
散發資料庫中尚未傳遞至所選訂閱者的命令數目。 命令包含一個 Transact-SQL 數據作語言 (DML) 語句或一個數據定義語言 (DDL) 語句。
將命令傳遞至訂閱者所需的估計時間。 如果此值大於產生並套用快照至訂閱者所需的時間,請考慮重新初始化訂閱者。 如需詳細資訊,請參閱 重新初始化訂閱。
如需詳細資訊,請參閱sp_replmonitorsubscriptionpendingcmds(Transact-SQL)和使用複寫監視器檢視資訊和執行工作。
複寫和其他資料庫功能
複寫是否可與記錄傳送和資料庫鏡像搭配運作?
是的。 如需詳細資訊,請參閱記錄傳送和複寫(SQL Server)和資料庫鏡像和復寫(SQL Server)。
複寫是否可與叢集搭配運作?
是的。 不需要任何特殊考慮,因為所有數據都會儲存在叢集上的一組磁碟上。