国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

我了解的數(shù)據(jù)庫事務復制

2024-07-21 02:47:44
字體:
來源:轉載
供稿:網(wǎng)友
我了解的數(shù)據(jù)庫事務復制事務復制

事務復制的基本機制,在聯(lián)機文檔上也有介紹。

基本原理

如圖,主要依靠2個代理,1.日志讀取代理(log reader agent),2.分發(fā)代理(distribution agent)。

其中l(wèi)og reader agent,負責從發(fā)布數(shù)據(jù)庫上讀取日志并且寫入到分發(fā)數(shù)據(jù)庫(distribution)中。然后distribution agent負責從distribution讀取數(shù)據(jù)并且寫入到訂閱中。

Log Reader Agent

開PRofiler,使用tsql模板即可。在已經(jīng)有復制環(huán)境的狀態(tài)下,對發(fā)布項目執(zhí)行:

BEGIN TRAN

go

INSERT INTO dbo.rename_sc DEFAULT VALUES

GO 10

COMMIT

最主要的部分:

如圖,Log Reader Agent使用會話55去發(fā)布庫的日志上讀取事務,如果發(fā)現(xiàn)有需要分發(fā)的,那么會調用sp_MSadd_replcmds,這個存儲過程會把抓到的指令存放到dbo.MSrepl_commands和MSrepl_transactions2個表中。然后就會使用過程sp_repldone標記事務已經(jīng)被復制。

SELECT spid,program_name FROM sys.sysprocesses WHERE spid IN( 57,55)

在sql server中查詢sys.sysprocesses 這2個spid 會發(fā)現(xiàn)program_name='Repl-LogReader-0-p1-9

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

Distribution Agent

Log Reader Agent寫入完之后就是有Distribution Agent 把事務應用到訂閱庫。

獲取事務

在存儲過程sys.sp_MSget_repl_commands對表dbo.MSrepl_commands讀取,之后就是在訂閱服務器上面運行sp_MSins命令。

仔細觀察其實不難發(fā)現(xiàn)msrepl_command表中存的是明碼,通過和sp_browsereplcmds對比就能發(fā)現(xiàn),那么也就是說其實在插入MSrepl_commands的時候就已經(jīng)知道了。

但是這里有個問題Agent是怎么知道要調用這個存儲過程的。

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

SELECT spid,program_name FROM sys.sysprocesses WHERE spid IN( 65 ,51)

修改訂閱

最后會修改訂閱服務器中的MSreplication_subscriptions中的一些字段,其中最終要的是timestamp,這個字段表示現(xiàn)在訂閱已經(jīng)應用到了那個事務。奇特的事情又出現(xiàn),會發(fā)現(xiàn)有2個update語句。不知道是不是為了版本兼容。

UPDATE MSreplication_subscriptions

SET transaction_timestamp = CAST(@P1 AS BINARY(15))

+ CAST(SUBSTRING(transaction_timestamp, 16, 1) AS BINARY(1)) ,

"time" = @P2

WHERE UPPER(publisher) = UPPER(@P3)

AND publisher_db = @P4

AND publication = @P5

AND subscription_type = 1

AND( SUBSTRING(transaction_timestamp, 16, 1) = 0

OR DATALENGTH(transaction_timestamp) < 16

)

UPDATE MSreplication_subscriptions

SET transaction_timestamp = CAST(@P1 AS BINARY(15))

+ CAST(CASE DATALENGTH(transaction_timestamp)

WHEN 16

THEN ISNULL(SUBSTRING(transaction_timestamp, 16, 1), 0)

ELSE 0

END AS BINARY(1)) ,

"time" = @P2

WHERE UPPER(publisher) = UPPER(@P3)

AND publisher_db = @P4

AND publication = @P5

AND subscription_type = 1

Distribution Agent完成一次分發(fā)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴海县| 贵阳市| 梁平县| 梧州市| 崇信县| 江口县| 聂荣县| 南通市| 孟村| 抚顺县| 嵊州市| 烟台市| 慈利县| 乌恰县| 乡城县| 新兴县| 武鸣县| 香河县| 丽江市| 安福县| 台东市| 阆中市| 蓬安县| 乐山市| 琼中| 襄汾县| 洞口县| 嘉义市| 阿拉善左旗| 绵阳市| 南木林县| 疏勒县| 石首市| 新绛县| 河北区| 五华县| 隆昌县| 上林县| 开封市| 高州市| 邹平县|