我了解的資料庫事務複製

2021-09-21 09:04:20 字數 3208 閱讀 5304

事務複製的基本機制,在聯機文件上也有介紹。

如圖,主要依靠2個**,1.日誌讀取**(log reader agent),2.分發**(distribution agent)。

其中log reader agent,負責從發布資料庫上讀取日誌並且寫入到分發資料庫(distribution)中。然後distribution agent負責從distribution讀取資料並且寫入到訂閱中。

開profiler,使用tsql模板即可。在已經有複製環境的狀態下,對發布專案執行:

begin

trango

insert

into

dbo.

rename_sc

default

values

go10

commit

最主要的部分:

如圖,log reader agent使用會話55去發布庫的日誌上讀取事務,如果發現有需要分發的,那麼會呼叫sp_msadd_replcmds,這個儲存過程會把抓到的指令存放到

dbo.

msrepl_commands

和msrepl_transactions2個表中。然後就會使用過程sp_repldone標記事務已經被複製。

在sql server中查詢sys.sysprocesses 這2個spid 會發現

program_name

='repl-logreader-0-p1-9

也就是log reader agent在sql server 上有2個會話乙個負責讀,乙個負責寫。這樣log reader agent的一次讀取完成。

log reader agent寫入完之後就是有distribution agent 把事務應用到訂閱庫。

在儲存過程

sys.sp_msget_repl_commands對錶

dbo.

msrepl_commands

讀取,之後就是在訂閱伺服器上面執行sp_msins命令。

仔細觀察其實不難發現msrepl_command表中存的是明碼,通過和

sp_browsereplcmds

對比就能發現,那麼也就是說其實在插入msrepl_commands的時候就已經知道了。

但是這裡有個問題

agent

是怎麼知道要呼叫這個儲存過程的。

在這裡會注意到有2個不同的會話在處理,乙個負責讀,乙個負責寫入,其中65負責從分發庫中讀取,51負責應用到訂閱庫

最後會修改訂閱伺服器中的msreplication_subscriptions中的一些字段,其中最終要的是timestamp,這個字段表示現在訂閱已經應用到了那個事務。奇特的事情又出現,會發現有2個

update

語句。不知道是不是為了版本相容。

update

msreplication_subscriptions

settransaction_timestamp

=cast

(@p1

asbinary

(15))

+cast

(substring

(transaction_timestamp

, 16, 1)

asbinary

(1))

,"time"

=@p2

where

upper

(publisher)=

upper

(@p3

)and

publisher_db

=@p4

andpublication

=@p5

andsubscription_type

= 1

and(substring

(transaction_timestamp

, 16, 1)

= 0

ordatalength

(transaction_timestamp

)< 16

)update

msreplication_subscriptions

settransaction_timestamp

=cast

(@p1

asbinary

(15))

+cast

(case

datalength

(transaction_timestamp

)when 16

then

isnull

(substring

(transaction_timestamp

, 16, 1), 0)

else 0

endasbinary

(1))

,"time"

=@p2

where

upper

(publisher)=

upper

(@p3

)and

publisher_db

=@p4

andpublication

=@p5

andsubscription_type

= 1

distribution agent完成一次分發。

MySQL 資料庫事務與複製

好久沒有寫技術文章了,因為一直在思考 後端分布式 這個系列到底怎麼寫才合適。最近基本想清楚了,後端分布式 包括 分布式儲存 和 分布式計算 兩大類。結合實際工作中碰到的問題,以尋找答案的方式來剖解技術,很多時候我們都不是在創造新技術,而是在應用技術。為了更有效率與效果的用好技術,我們需要了解一些技術...

MySQL 資料庫事務與複製

好久沒有寫技術文章了,因為一直在思考 後端分布式 這個系列到底怎麼寫才合適。最近基本想清楚了,後端分布式 包括 分布式儲存 和 分布式計算 兩大類。結合實際工作中碰到的問題,以尋找答案的方式來剖解技術,很多時候我們都不是在創造新技術,而是在應用技術。為了更有效率與效果的用好技術,我們需要了解一些技術...

資料庫的事務我懂了嗎(3)

除了加鎖之外我們還可以通過時間戳的方法的控制併發。基於時間戳的併發控制其實是一種基於撤回的方法 基於有效性確認的併發控制的方法,用rs t ws t 儲存讀資料的集合和寫資料的集合。事務分為3個階段進行 一是讀階段 在此階段當然是讀資料元素並且在事務區域性位址空間計算寫的值。二是有效性確認階段,排程...