Sql-Server

複製超過 160 億條記錄的表時如何解決鎖定問題

  • September 9, 2021

我有兩個要複製的 SQL Server 數據庫。我能夠毫無問題地複制小表。

但是,我有一個包含超過 160 億行的表,這很成問題。

我目前正在使用事務複製來複製大表。從我線上閱讀的文件中,當您選擇事務複製時,該過程使用 @sync_method = N’concurrent’ 參數,該參數不應該鎖定表,但是當我啟動該過程時,該表似乎已鎖定,這使其無法鎖定可用。同時,當我在目標伺服器上啟動訂閱時,它也會在目標伺服器上鎖定表。

我想知道失去了什麼或做錯了什麼導致表鎖定。請記住,當複制發生時,該表也在使用中。所以它不應該在任何給定時間鎖定。

已在數據庫上啟用讀取送出的快照隔離。這是我嘗試執行的初始快照。

一個有 160 億行的表需要更多的關注,並且無論你如何複製都需要更長的時間。

我有一個關於鎖定的類似問題,但它是在我的訂閱伺服器上而不是發布者上 - 很多個月前,正如你在這裡看到的那樣。

正如您在此處看到的,我在複製中的 READ_COMMITTED_SNAPSHOT 方面有很好的經驗。

發布者上的事務複製不會鎖定複製的表,這是這樣做 的:修改數據和日誌讀取器代理

但是,在初始化訂閱時或任何時候需要新的完整快照時,是的,表上會有鎖,但不會有獨占鎖,而且不會在整個快照期間鎖定:

他是:

並發快照處理(事務複製的預設設置)不會在整個快照生成期間保持共享鎖定,這允許使用者在複製創建初始快照文件時繼續不間斷地工作。

有這個問題處理同樣的問題:

如何在不鎖定表的情況下生成複制快照

解決這個問題的方法之一是

使用數據庫備份初始化 SQL Server 複製

如果您在快照代理執行時談論表鎖,我認為避免它的唯一方法是在數據庫上啟用“讀取送出的快照隔離”,但只有在應用程序已經過測試時才必須這樣做這啟用了。

引用自:https://dba.stackexchange.com/questions/299180