postgres數(shù)據(jù)庫有幾種同步機制
瀏覽:116
發(fā)布日期:2023-10-12 00:00:00
投稿人:佚名投稿
1、數(shù)據(jù)庫,增量同步和全量同步是什么?
數(shù)據(jù)如果保留多份,就會存在一致性問題,就需要同步,同步分為兩大類:全量和增量2. 概述
數(shù)據(jù)如果要保留副本,要么同時寫(就是多寫),或者進行復(fù)制:異步寫(即從主數(shù)據(jù)拷貝到副本);
同時寫(多寫),引出一個問題,寫多少節(jié)點算成功(場景:分布式系統(tǒng))?全部寫成功才算成功,還是寫大多數(shù)成功算成功,還是寫指定幾個節(jié)點算成功?
異步寫的話,如果采用異步復(fù)制,那么實時性需要考量的話,就需要采用性能優(yōu)先的架構(gòu)。
3.同步方式
數(shù)據(jù)同步一般分為兩種方式:全量和增量。
3.1 全量
全量,這個很好理解。就是每天定時或者周期性全量把數(shù)據(jù)從一個地方拷貝到另外一個地方;
全量的話,可以采用直接全部覆蓋(使用“新”數(shù)據(jù)覆蓋“舊”數(shù)據(jù));或者走更新邏輯(覆蓋前判斷下,如果新舊不一致,就更新);
這里面有一個隱藏的問題:如果采用異步寫,主數(shù)據(jù)物理刪除了,怎么直接通過全量數(shù)據(jù)同步?這就需要借助一些中間操作日志文件,或者其他手段,把這些“看不到”的數(shù)據(jù)記錄起來。
3.2 增量(類如有;堅果云網(wǎng)盤增量同步功能)
增量的基礎(chǔ)是全量,就是你要使用某種方式先把全量數(shù)據(jù)拷貝過來,然后再采用增量方式同步更新。
增量的話,就是指抓取某個時刻(更新時間)或者檢查點(checkpoint)以后的數(shù)據(jù)來同步,不是無規(guī)律的全量同步。這里引入一個關(guān)鍵性的前提:副本一端要記錄或者知道(通過查詢更新日志或者訂閱更新)哪些更新了。 全量備份是指對某一時間點上的所有數(shù)據(jù)進行全量備份,包括系統(tǒng)和所有數(shù)據(jù)。這種備份方式每次都需要對系統(tǒng)和所有數(shù)據(jù)進行一次全量備份。如上,如果兩次備份之間數(shù)據(jù)沒有任何變化,那么兩次備份的數(shù)據(jù)是一樣的。也就是說100GB的數(shù)據(jù)即使沒有發(fā)生任何數(shù)據(jù)變化,也會多耗費100GB的存儲空間去做備份。但這種備份方式最大的好處就是在恢復(fù)丟失數(shù)據(jù)時,只需要對一個完整的備份進行操作就能夠恢復(fù)丟失數(shù)據(jù),大大加快了系統(tǒng)或數(shù)據(jù)恢復(fù)的時間。
增量備份即在第一次全量備份的基礎(chǔ)上,分別記錄每次的變化。由于增量備份在備份前會判斷數(shù)據(jù)是否發(fā)生變化,并僅記錄每次變化情況,所以相較于其他兩種備份方式它最大的好處在于其所需存儲空間最少的(相同的變化情況下),備份速度最快的。當(dāng)然在數(shù)據(jù)還原上來說,它的恢復(fù)時間是最長的,效率較低?;謴?fù)數(shù)據(jù)時,需要在第一次完備的基礎(chǔ)上,整合每次的一個變化情況。
增量同步和全量同步是數(shù)據(jù)庫同步的兩種方式。全量同步是一次性同步全部數(shù)據(jù),增量同步則只同步兩個數(shù)據(jù)庫不同的部分。
2、如何實現(xiàn)同步兩個服務(wù)器的數(shù)據(jù)庫
這個要根據(jù)不同情況具體分析,有幾種方案參考:數(shù)據(jù)庫A和數(shù)據(jù)庫B是建立在兩臺獨立的數(shù)據(jù)庫服務(wù)器上,那么采用dblink方式是一種可行的方式,存在兩個數(shù)據(jù)同步過程:
一、數(shù)據(jù)庫A正常運行的時候需要將數(shù)據(jù)同步到備用庫即數(shù)據(jù)庫B;
二、數(shù)據(jù)庫A不正常的時候啟用數(shù)據(jù)庫B,在數(shù)據(jù)庫A恢復(fù)正常之前的數(shù)據(jù)更新都發(fā)生在數(shù)據(jù)庫B,那么需要將數(shù)據(jù)庫B的數(shù)據(jù)同步給數(shù)據(jù)庫A。
第一種方式:前提是數(shù)據(jù)庫A和數(shù)據(jù)庫B本地網(wǎng)是24小時互通的同時對數(shù)據(jù)同步實時性有比較高的要求,那么可以建立DBLINK,在兩個庫都建觸發(fā)器,不管當(dāng)前在哪個庫發(fā)生數(shù)據(jù)更新的時候?qū)崟r同步數(shù)據(jù)到目標(biāo)數(shù)據(jù)庫;
第二種方式:如果數(shù)據(jù)同步的實時性要求不高,則可以通過定制存儲過程的方式(給兩個庫的數(shù)據(jù)表加時間戳或者更新標(biāo)志,)定時同步數(shù)據(jù);
第三種方式:通過給兩個數(shù)據(jù)庫的數(shù)據(jù)表加更新標(biāo)志字段,以第一種方式為主以滿足實時性的要求,以第二種方式為輔彌補可能存在的觸發(fā)器執(zhí)行更新未成功的情況。
以上的方案都是從數(shù)據(jù)層面所做的處理,對于數(shù)據(jù)實時同步還是會存在一定的風(fēng)險,那么雙機熱備應(yīng)該說是最好的選擇了。
3、數(shù)據(jù)庫怎么實現(xiàn)數(shù)據(jù)同步
不同服務(wù)器數(shù)據(jù)庫之間的數(shù)據(jù)操作 --創(chuàng)建鏈接服務(wù)器 exec sp_addlinkedserver 'ITSV ', '', 'SQLOLEDB ', '遠(yuǎn)程服務(wù)器名或ip地址 'exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用戶名 ', '密碼'--查詢示例 select*from ITSV.數(shù)據(jù)庫名.dbo.表名 --導(dǎo)入示例 select*into 表from ITSV.數(shù)據(jù)庫名.dbo.表名 --以后不再使用時刪除鏈接服務(wù)器 exec sp_dropserver 'ITSV ', 'droplogins '--連接遠(yuǎn)程/局域網(wǎng)數(shù)據(jù)(openrowset/openquery/opendatasource) --1、openrowset --查詢示例 select*fromopenrowset( 'SQLOLEDB ', 'sql服務(wù)器名 '; '用戶名 '; '密碼',數(shù)據(jù)庫名.dbo.表名) --生成本地表 select*into 表fromopenrowset( 'SQLOLEDB ', 'sql服務(wù)器名 '; '用戶名 '; '密碼',數(shù)據(jù)庫名.dbo.表名) --把本地表導(dǎo)入遠(yuǎn)程表 insertopenrowset( 'SQLOLEDB ', 'sql服務(wù)器名 '; '用戶名 '; '密碼',數(shù)據(jù)庫名.dbo.表名) select*from 本地表 --更新本地表 update b set b.列A=a.列A fromopenrowset( 'SQLOLEDB ', 'sql服務(wù)器名 '; '用戶名 '; '密碼',數(shù)據(jù)庫名.dbo.表名)as a innerjoin 本地表 b on a.column1=b.column1 --openquery用法需要創(chuàng)建一個連接 --首先創(chuàng)建一個連接創(chuàng)建鏈接服務(wù)器 exec sp_addlinkedserver 'ITSV ', '', 'SQLOLEDB ', '遠(yuǎn)程服務(wù)器名或ip地址 '--查詢select*FROMopenquery(ITSV, 'SELECT * FROM 數(shù)據(jù)庫.dbo.表名 ') --把本地表導(dǎo)入遠(yuǎn)程表 insertopenquery(ITSV, 'SELECT * FROM 數(shù)據(jù)庫.dbo.表名 ') select*from 本地表 --更新本地表 update b set b.列B=a.列B FROMopenquery(ITSV, 'SELECT * FROM 數(shù)據(jù)庫.dbo.表名 ') as a innerjoin 本地表 b on a.列A=b.列A --3、opendatasource/openrowset SELECT*FROMopendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陸名;Password=密碼 ' ).test.dbo.roy_ta --把本地表導(dǎo)入遠(yuǎn)程表 insertopendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陸名;Password=密碼 ').數(shù)據(jù)庫.dbo.表名 select*fromSQL code 用強制訂閱實現(xiàn)數(shù)據(jù)庫同步操作 大量和批量的數(shù)據(jù)可以用數(shù)據(jù)庫的同步機制處理: // 說明:為方便操作,所有操作均在發(fā)布服務(wù)器(分發(fā)服務(wù)器)上操作,并使用推模式在客戶機器使用強制訂閱方式。 有疑問聯(lián)系作者:zlp321001@hotmail.com 測試通過 //--1:環(huán)境服務(wù)器環(huán)境: 機器名稱: ZehuaDb 操作系統(tǒng):Windows 2000 Server 數(shù)據(jù)庫版本:SQL 2000 Server 個人版 客戶端機器名稱:Zlp 操作系統(tǒng):Windows 2000 Server 數(shù)據(jù)庫版本:SQL 2000 Server 個人版 --2:建用戶帳號在服務(wù)器端建立域用戶帳號我的電腦管理->本地用戶和組->用戶->建立UserName:zlp UserPwd:zlp --3:重新啟動服務(wù)器MSSQLServer我的電腦->控制面版->管理工具->服務(wù)->MSSQLServer 服務(wù) (更改為:域用戶帳號,我們新建的zlp用戶 ./zlp,密碼:zlp) --4:安裝分發(fā)服務(wù)器A:配置分發(fā)服務(wù)器工具->復(fù)制->配置發(fā)布、訂閱服務(wù)器和分發(fā)->下一步->下一步(所有的均采用默認(rèn)配置) B:配置發(fā)布服務(wù)器工具->復(fù)制->創(chuàng)建和管理發(fā)布->選擇要發(fā)布的數(shù)據(jù)庫(SZ)->下一步->快照發(fā)布->下一步-> 選擇要發(fā)布的內(nèi)容->下一步->下一步->下一步->完成C:強制配置訂閱服務(wù)器(推模式,拉模式與此雷同) 工具->復(fù)制->配置發(fā)布、訂閱服務(wù)器和分發(fā)->訂閱服務(wù)器->新建->SQL Server數(shù)據(jù)庫->輸入客戶端服務(wù)器名稱(ZLP)->使用SQL Server 身份驗證(sa,空密碼)->確定->應(yīng)用->確定D:初始化訂閱復(fù)制監(jiān)視器->發(fā)布服務(wù)器(ZEHUADB)->雙擊訂閱->強制新建->下一步->選擇啟用的訂閱服務(wù)器->ZLP-> 下一步->下一步->下一步->下一步->完成--5:測試配置是否成功復(fù)制監(jiān)視器->發(fā)布服務(wù)器(ZEHUADB)->雙擊SZ:SZ->點狀態(tài)->點立即運行代理程序查看:復(fù)制監(jiān)視器->發(fā)布服務(wù)器(ZEHUADB)->SZ:SZ->選擇ZLP:SZ(類型強制)->鼠標(biāo)右鍵->啟動同步處理如果沒有錯誤標(biāo)志(紅色叉),恭喜您配置成功 --6:測試數(shù)據(jù) --在服務(wù)器執(zhí)行:選擇一個表,執(zhí)行如下SQL insertinto WQ_NEWSGROUP_S select'測試成功',5 復(fù)制監(jiān)視器->發(fā)布服務(wù)器(ZEHUADB)->SZ:SZ->快照->啟動代理程序 ->ZLP:SZ(強制)->啟動同步處理 去查看同步的 WQ_NEWSGROUP_S 是否插入了一條新的記錄 測試完畢,通過。 我教你4、如何解決多數(shù)據(jù)庫之間同步問題
如果是同一種數(shù)據(jù)庫的話,你同步的數(shù)據(jù)表結(jié)構(gòu)是否相同,如果也相同的話,完全可以利用數(shù)據(jù)庫的同步復(fù)制機制來解決;(做主從)如果表結(jié)構(gòu)不相同的話,如果不在應(yīng)用層處理的話,有兩種方式參考:
1,A推數(shù)據(jù)給B;A有數(shù)據(jù)的時候,實時或非實時(采用event或trigger)將數(shù)據(jù)推到B中,B再做處理;
2,B從A拉數(shù)據(jù),用一個event(mysql中的job)定時從A中拉數(shù)據(jù)然后進行處理;
另外可以選擇在應(yīng)用層來做,這個我就不多介紹了,根據(jù)業(yè)務(wù)邏輯coding就行了。
由于不清楚你的業(yè)務(wù)特點,所以無法進一步的幫你分析。
5、有2個數(shù)據(jù)庫,怎么實現(xiàn)數(shù)據(jù)同步
在pgsql的數(shù)據(jù)庫中將要同步的表建立一個一模一樣的同步表。然后建觸發(fā)器,將進入源表中的數(shù)據(jù)觸發(fā)到同步表中。然后做一個windows服務(wù)掃描這個同步表并且將同步表中的數(shù)據(jù)同步到mysql或access中。
如果是整個數(shù)據(jù)庫中有許多表要進行同步。則建立一個共用的同步表,結(jié)構(gòu)非常簡單。字段如下:
主鍵(f_id),源表名(f_tablename),主鍵字段名(f_keyname),主鍵值(f_keyvalue),操作標(biāo)識(f_operflag
i:插入
u:更新
d:刪除),時間字段(f_time).將要同步的表都建立觸發(fā)器,只要有增、改、刪都觸發(fā)到這個表里。這樣你只掃描這個共用的同步表,根據(jù)這些字段值完全可以實現(xiàn)數(shù)據(jù)的同步。隔離網(wǎng)閘就是這么個原理,只不過它的要比這復(fù)雜多了! 為方便完成指定數(shù)據(jù)表的同步操作,可以采用dblink與merge結(jié)合的方法完成。
操作環(huán)境:
此數(shù)據(jù)庫服務(wù)器ip為192.168.196.76,有center與branch兩個庫,一般需要將center的表數(shù)據(jù)同步到branch,center為源庫,branch為目標(biāo)庫,具體步驟如下:
1.在源庫創(chuàng)建到目標(biāo)庫的dblink
create
database
link
branch
--輸入所要創(chuàng)建dblink的名稱,自定義
connect
to
dbuser
identified
by
“password”
--設(shè)置連接遠(yuǎn)程數(shù)據(jù)庫的用戶名和密碼
using
'192.168.196.76/branch';
--指定目標(biāo)數(shù)據(jù)庫的連接方式,可用tns名稱
轉(zhuǎn)載請帶上網(wǎng)址:http://m.dk322.cn/posjifive/317922.html
- 上一篇:怎么取消隨行付pos機業(yè)務(wù)
- 下一篇:pos機掃碼槍怎么改usb接口
相關(guān)文章推薦
最新推薦
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實,本站將立刻刪除。