国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 贞丰县| 潜江市| 珠海市| 贵港市| 阿勒泰市| 桓仁| 惠东县| 离岛区| 方山县| 天水市| 广灵县| 东城区| 廉江市| 承德县| 蒙自县| 商都县| 巫溪县| 德州市| 昌乐县| 金堂县| 威信县| 信丰县| 长葛市| 揭西县| 沂南县| 晋江市| 灯塔市| 吉林省| 灌南县| 昆明市| 杭锦后旗| 广德县| 七台河市| 临夏市| 清河县| 昆山市| 荣成市| 孝义市| 格尔木市| 尚义县| 清水县|