步驟清單:
相信大家都看過了這個屏幕錄像,大概能明白MobiLink是做什麼的了,簡單說,MobiLink是做數據同步的。
MobiLink 同步允許在符合 ODBC 標准的統一數據庫和 Adaptive Server Anywhere 或 UltraLite 遠程數據庫之間進行復制。在本教程中使用的是 Adaptive Server Anywhere 遠程數據庫。統一數據庫可以是使用 Sybase Adaptive Server Anywhere、Sybase Adaptive Server Enterprise、Oracle、Microsoft SQL Server 或 IBM DB2 生成的數據庫。
MobiLink 適用於將一個統一數據服務器與大量遠程數據庫進行同步(通常包含多個移動數據庫)。遠程站點的管理和資源要求已降到了最低限度。此系統是基於連接的,並且遠程站點可隨時進行連接。在每次進行連接之後,數據庫是完全同步的。
MobiLink 的工作方式是:將遠程數據庫上的多個事務的結果合並成一個更改集,然後應用到統一數據庫中。因為同步始終在事務邊界進行的,所以保持了參照完整性。不保留在組件事務過程中所做的各個更改的順序:因為從不復制未提交的數據,所以保留了數據完整性。
從體系結構上說,MobiLink分為服務器端和客戶端兩部分。MobiLink服務器與統一數據庫連接(ASA、ASE、SQL Server、Oracle...),MobiLink客戶端則與遠程數據庫連接(ASA或UltraLite)。
進行同步時,當 MobiLink 遠程站點打開與 MobiLink 同步服務器的連接時,通常便開始了同步過程。同步期間,遠程站點的 MobiLink 客戶端將上載自上一次同步以來對遠程數據庫所作的更改。MobiLink 同步服務器在收到這些數據時開始更新統一數據庫,然後將統一數據庫中的更改下載到遠程數據庫。
所以,我們需要在遠程數據庫上建立發布,CREATE PUBLICATION,告訴MobiLink ClIEnt,這些表的這些列是需要同步的。例如:
CREATE PUBLICATION Lab_all ( TABLE dept, TABLE emp )
以上語句表明,Lab_all這個發布將會讓MobiLink客戶端在同步時組織dept表和emp表的上載流數據。目前是組織兩個表中的自上一次修改以來變化的所有數據作為上載流,當然,也可以通過在發布上加列,加條件完成。例如:
CREATE PUBLICATION pub_customer ( TABLE customer ( id, company_name, city, state ) WHERE status = 'active' )。
當然,我們也需要在遠程數據庫上建立同步用戶:
CREATE SYNCHRONIZATION USER "SIMPLE"
接下來,就建立一個SYNCHRONIZATION SUBSCRIPTION。這是為MobiLink用戶定義預定發布。預定發布將告訴MobiLink客戶端,在同步時,這個用戶和其對應的發布將使用什麼樣的方式連接到MobiLink服務器,並使用MobiLink服務器端指定版本的同步腳本來進行同步。例如:
CREATE SYNCHRONIZATION SUBSCRIPTION TO Lab_all FOR "SIMPLE" TYPE 'TCPIP' ADDRESS 'host=localhost;port=2439' OPTION ScriptVersion='Lab01'
這就是說,SIMPLE這個用戶,在MobiLink客戶端將使用Lab_all這個發布把數據進行上/下載。他使用TCPIP協議,通過與 localhost 2439端口通信連接上MobiLink服務器,並且在同步過程中使用MobiLink服務器端版本號為Lab01的同步腳本。
然後,作為最簡單的例子,我們啟動同步服務器:
dbmlsrv9 -c "dsn=center" -x tcpip -o mlserver.mls -v+ -dl -za -zu+
他將不進行用戶驗證(-zu+),也會自動生成同步腳本(-za)(因為在前面的步驟中我們沒有建立同步腳本)。當然,MobiLink Server也將連接到中心數據庫center。其他幾個選項都是用於日志什麼的。
啟動同步服務器後,可以在同步客戶端上觸發同步:
dbmlsync -c "dsn=remote" -o dbmlsync.out -v -e "SendColumnNames=ON"
當MobiLink服務器端未建立同步腳本時,需要指定SendColumnNames=ON,以便讓MobiLink客戶端發送列名,以便MobiLink服務器端自動生成同步腳本。其他選項用於日志、連接遠程數據庫等。
在本部分的屏幕錄像中,我們即展示了這種最簡單的同步方式,沒有用戶驗證,沒有錯誤處理,沒有沖突處理,服務器端自動生成同步腳本。如需要這些進一步的功能,請繼續關注我們後續的內容。
以下是屏幕錄像中的全部腳本:
腳本:
命令行:
dbinit center.db dbinit remote.db
建立ODBC center & remote
dbisql下,對center創建數據庫模式:
CREATE TABLE dept( deptno CHAR(4) NOT NULL PRIMARY KEY, deptname VARCHAR(20)) CREATE TABLE emp( empno INTEGER IDENTITY NOT NULL PRIMARY KEY, empname VARCHAR(20), gender BIT, deptno CHAR(4) NOT NULL, FOREIGN KEY (deptno) REFERENCES dept (deptno))
對center添加數據:
INSERT INTO dept VALUES('0000', 'HQ') INSERT INTO dept VALUES('0001', 'Sales') INSERT INTO dept VALUES('0002', 'Marketing') INSERT INTO dept VALUES('0003', 'Admin') INSERT INTO dept VALUES('0004', 'Education') INSERT INTO dept VALUES('0005', 'Presales') INSERT INTO dept VALUES('0006', 'Support') COMMIT BEGIN DECLARE @count INTEGER SET @count = 1 WHILE (@count <= 2000) BEGIN INSERT INTO emp(empname, gender, deptno) VALUES('PERSON' + STR(@count,4), MOD(@count, 2), '000' + str(MOD(@count, 7),1)) SET @count = @count + 1 END END
對remote數據庫:
CREATE TABLE dept( deptno CHAR(4) NOT NULL PRIMARY KEY, deptname VARCHAR(20)) CREATE TABLE emp( empno INTEGER IDENTITY NOT NULL PRIMARY KEY, empname VARCHAR(20), gender BIT, deptno CHAR(4) NOT NULL, FOREIGN KEY (deptno) references re_dept (deptno))
建立publication:
CREATE PUBLICATION Lab_all ( TABLE dept, TABLE emp )
建立同步用戶:
CREATE SYNCHRONIZATION USER "SIMPLE"
建立SYNCHRONIZATION SUBSCRIPTION:
CREATE SYNCHRONIZATION SUBSCRIPTION TO Lab_all FOR "SIMPLE" TYPE 'TCPIP' ADDRESS 'host=localhost;port=2439' OPTION ScriptVersion='Lab01'
命令行下:
啟動同步服務器:
dbmlsrv9 -c "dsn=center" -x tcpip -o mlserver.mls -v+ -dl -za -zu+
觸發同步:
dbmlsync -c "dsn=remote" -o dbmlsync.out -v -e "SendColumnNames=ON"