事務複製的基本機制,在聯機文件上也有介紹。
如圖,主要依靠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個階段進行 一是讀階段 在此階段當然是讀資料元素並且在事務區域性位址空間計算寫的值。二是有效性確認階段,排程...