■ 唐山市教育局 孟令旸
編者按:筆者在查看單位在線教學(xué)平臺的數(shù)據(jù)庫時發(fā)現(xiàn)其數(shù)據(jù)庫系統(tǒng)采用的是SQL Server 2012。鑒于SQL Server 2012 自帶發(fā)布/訂閱功能,通過該功能就可以實(shí)現(xiàn)數(shù)據(jù)庫同步,因此,筆者決定采用發(fā)布/訂閱模式實(shí)現(xiàn)數(shù)據(jù)庫同步。本文將詳細(xì)介紹操作過程。
為了安全起見,筆者沒有直接為在線教學(xué)平臺的數(shù)據(jù)庫做同步,而是搭建了一個簡單的實(shí)驗(yàn)環(huán)境:創(chuàng)建兩臺虛擬機(jī),將兩臺虛擬機(jī)組成一個獨(dú)立的局域網(wǎng)。兩臺虛擬機(jī)上均部署SQL Server 2012 數(shù)據(jù)庫系統(tǒng)。筆者將一臺虛擬機(jī)用作發(fā)布服務(wù)器,另一臺虛擬機(jī)用作訂閱服務(wù)器。在發(fā)布服務(wù)器上創(chuàng)建了數(shù)據(jù)庫“student”,該數(shù)據(jù)庫只有一張表“cjb”。這是筆者虛擬出來的學(xué)生成績表,用來完成數(shù)據(jù)實(shí)驗(yàn)。兩臺虛擬機(jī)主要實(shí)驗(yàn)數(shù)據(jù)如表1 所示。
可能是非域環(huán)境,筆者進(jìn)行的數(shù)據(jù)庫同步實(shí)驗(yàn)并不順利,遇到了很多問題。由于SQL Server 給出的錯誤提示并不具體,很難根據(jù)錯誤提示找到故障原因。例如,創(chuàng)建同步和訂閱后,在復(fù)制監(jiān)視器中總提示“未初始化的訂閱”,無論做多少次重新初始化操作,仍出現(xiàn)這個提示。又如,出現(xiàn)“對路徑C:Program FilesMicrosoft SQL ServerMSSQL 11.MSSQLSERVERMSSQLRepl Dataunc……的訪問被拒絕”錯誤,出現(xiàn)錯誤的這個文件路徑是快照文件的存放路徑,于是筆者為快照文件重新指定路徑,仍報這個錯誤。類似這樣的問題還有很多:“無法讀取文件xxxx.pre”“工作目錄錯誤”……。
當(dāng)然,在創(chuàng)建發(fā)布或創(chuàng)建訂閱過程中,也不是所有問題都這樣,有一些問題是可以根據(jù)錯誤提示判斷出故障原因的。例如,當(dāng)遇到“SQL Server 無法將SQL Server 代理配置為自動啟動”錯誤時,這個錯誤提示說明沒有啟動SQL Server代理服務(wù)。此時可以通過運(yùn)行“services.msc”,出現(xiàn)“服務(wù)”窗口后,手動將SQL Server 代理服務(wù)配置為自動并啟動該服務(wù)即可。
表1 測試用虛擬機(jī)主要實(shí)驗(yàn)數(shù)據(jù)一覽表
互聯(lián)網(wǎng)上有很多關(guān)于SQL Server 發(fā)布訂閱方面的教程,筆者參照這些教程進(jìn)行了嘗試,也以失敗告終。于是筆者在參考這些教程的基礎(chǔ)上,對SQL Server 發(fā)布訂閱機(jī)制進(jìn)行分析,通過不斷實(shí)驗(yàn),終于完成了數(shù)據(jù)庫同步實(shí)驗(yàn)。
在域控制器下,出現(xiàn)SID重復(fù)、計(jì)算機(jī)名重復(fù)、端口等問題,在加入域的過程中就會提示這些問題的。在非域控制器下,要保證數(shù)據(jù)庫成功同步,建議先做好以下準(zhǔn)備工作。
在確保發(fā)布服務(wù)器和訂閱服務(wù)器之間能正常通信的基礎(chǔ)上,要注意以下事項(xiàng):第一,避免SID 重復(fù);第二,避免計(jì)算機(jī)名重復(fù);第三,開放必要端口。
(1)在發(fā)布服務(wù)器上,創(chuàng)建一個新文件夾。以后在創(chuàng)建發(fā)布時,指定該文件夾為快照文件夾。在本例中,創(chuàng)建的快照文件夾是“d:student epldata”。
(2)在發(fā)布服務(wù)器和訂閱服務(wù)器上,創(chuàng)建一個完全相同的Windows 系統(tǒng)用戶,并設(shè)置好密碼。將該用戶加入到“administrators”用戶組,即將該用戶設(shè)置為管理員權(quán)限。在本例中,添加的用戶是“synch”。
(3)將發(fā)布服務(wù)器上的快照文件夾“d:student epldata”設(shè)置為共享。設(shè)置共享時,將用戶“synch”添加到共享用戶列表中,通過“權(quán)限級別”下拉菜單將該用戶的訪問權(quán)限設(shè)置為“讀寫”權(quán)限。
(4)驗(yàn)證共享文件設(shè)置是否成功??梢栽谟嗛喎?wù)器上,用“synch”用戶登錄系統(tǒng),打開資源管理器后,用共享路徑訪問位于發(fā)布服務(wù)器上的快照文件夾,在該文件夾下創(chuàng)建文件夾和文件,測試該用戶是否有讀寫權(quán)限。在本例中,共享文件夾的路徑是“\143PSPFER23 epldata”。
(1)運(yùn)行命令“services.msc”,打開服務(wù)窗口。
(2)打開服務(wù)窗口后,找到“SQL Server 代理”服務(wù)。
(3)雙擊“SQL Server代理”服務(wù),打開服務(wù)屬性對話框窗口后,單擊“登錄”選項(xiàng)卡,勾選“此賬戶”,然后單擊右側(cè)的“瀏覽”按鈕,將SQL Server 代理的登錄身份更改為前面所創(chuàng)建的用戶賬戶“synch”,并輸入與該用戶賬戶對應(yīng)的密碼。
(4)點(diǎn)擊“常規(guī)”選項(xiàng)卡,啟動“SQL Server 代理”服務(wù),將服務(wù)啟動方式配置為“自動”。
(1)首先要保證在安裝SQL Server 之后沒有修改服務(wù)器的計(jì)算機(jī)名。如果安裝SQL Server 之后修改過服務(wù)器的計(jì)算機(jī)名,在注冊SQL Server 服務(wù)器時容易出現(xiàn)“SQL Server replication requires the actual server name to make a connection to the server”之類的錯誤。如果遇到此類錯誤,最簡單有效的方法就是卸載并重新安裝SQL Server。
(2)新建并配置SQL Server 登錄名
①用SQL Server Manage ment Studio 連接到數(shù)據(jù)庫服務(wù)器后,展開“(計(jì)算機(jī)名)”→“安全性”→“登錄名”,右擊“登錄名”,在右鍵菜單中選擇“新建登錄名”。
②出現(xiàn)“登錄名-新建”對話框窗口后,單擊“搜索”按鈕,將前面所創(chuàng)建的本地用戶“synch”配置為SQL Server 登錄名。
③單擊左側(cè)“服務(wù)器角色”,在右側(cè)“服務(wù)器角色”列表框中勾選“public”和“sysadmin”。給新建的登錄名synch 分配sysadmin 權(quán)限(SQL Server 超級管理員權(quán)限)。
(3)在發(fā)布服務(wù)器上備份需要發(fā)布的數(shù)據(jù)庫(備份過程略)。
在本例中,需要發(fā)布的數(shù)據(jù)庫是“student”是用來做同步實(shí)驗(yàn)的數(shù)據(jù)庫,數(shù)據(jù)庫里面的學(xué)號、姓名、成績、班級等所有數(shù)據(jù)均有計(jì)算機(jī)隨機(jī)產(chǎn)生,如有雷同,純屬偶然。
(4)將備份文件復(fù)制到訂閱服務(wù)器上,并在訂閱服務(wù)器上還原備份的數(shù)據(jù)庫(數(shù)據(jù)庫還原過程略)。
(5)將新建的本地用戶賬戶配置為發(fā)布(訂閱)數(shù)據(jù)庫的擁有者。
①用SQL Server Manage ment Studio 連接到數(shù)據(jù)庫服務(wù)器后,展開“(計(jì)算機(jī)名)”→“數(shù)據(jù)庫”→“student”→“安全性”→“用戶”,右擊“用戶”,在右鍵菜單中選擇“新建用戶”。
②出現(xiàn)“數(shù)據(jù)庫用戶-新建”對話框后,在“用戶類型”下拉列表中選擇“帶登錄名的SQL 用戶”。在“用戶名”文本框中為新建用戶取名,單擊“登錄名”文本框右側(cè)的按鈕進(jìn)一步指定登錄名。
③出現(xiàn)“選擇登錄名”對話框窗口后,單擊“瀏覽”按鈕,選擇前面新創(chuàng)建的登錄名“synch”。
④為發(fā)布數(shù)據(jù)庫選擇登錄名“synch”后,右擊該用戶,在右鍵菜單中選擇“屬性”。
⑤出現(xiàn)用戶屬性窗口后,單擊窗口左側(cè)的“成員身份”,在“角色成員”列表中勾選“db_owner”,即可將本地用戶賬戶“synch”配置為發(fā)布數(shù)據(jù)庫的擁有者。
同樣,在訂閱服務(wù)器上將本地用戶賬戶“synch”也配置為數(shù)據(jù)庫“student”的擁有者。
(6)將SQL Server 服務(wù)器配置為允許遠(yuǎn)程連接。
用SQL Server Manageme nt Studio 連接到數(shù)據(jù)庫服務(wù)器后,右擊服務(wù)器名稱,在右鍵菜單中選擇“屬性”。出現(xiàn)服務(wù)器屬性對話框后,單擊左側(cè)的“連接”,在右側(cè)“遠(yuǎn)程服務(wù)器連接”欄目中勾選“允許遠(yuǎn)程連接到此服務(wù)器”。
(7)開啟SQL Server 的網(wǎng)絡(luò)協(xié)議TCP/IP 和管道命名協(xié)議
通過Windows 的開始菜單,打開SQL Server 配置管理器。然后依次單擊“SQL Server 配置管理器”→“SQL Server 網(wǎng)絡(luò)配置”→“MSSQL SERVER 的協(xié)議”,將右側(cè)的“Named Pipes”和“TCP/IP”兩個協(xié)議的協(xié)議狀態(tài)配置為“已啟用”。
(8)發(fā)布和訂閱服務(wù)器之間相互注冊
①重新啟動服務(wù)器操作系統(tǒng),用“synch”用戶賬戶登錄操作系統(tǒng)。
②用SQL Server Manage ment Studio 連接到數(shù)據(jù)庫服務(wù)器后,依次單擊“視圖”菜單→“已注冊的服務(wù)器”。
③出現(xiàn)“已注冊的服務(wù)器”選項(xiàng)卡后,右擊“本地服務(wù)器組”,在右鍵菜單中選擇“新建服務(wù)器注冊”。
④出現(xiàn)“新建服務(wù)器注冊”對話框后,在“服務(wù)器名稱”文本框中輸入訂閱服務(wù)器的服務(wù)器名稱,身份驗(yàn)證選擇“Windows 身份驗(yàn)證”。當(dāng)前登錄系統(tǒng)的用戶是“synch”,此時Windows 身份驗(yàn)證的用戶賬戶是“synch”。此時單擊“測試”按鈕可以測試連接是否成功。單擊“保存”按鈕完成訂閱服務(wù)器的注冊。
按照同樣方法,在訂閱服務(wù)器上注冊發(fā)布服務(wù)器。
采用發(fā)布/訂閱方式同步SQL 數(shù)據(jù)庫,數(shù)據(jù)庫需要通過分發(fā)服務(wù)器對外發(fā)布,因此,在發(fā)布數(shù)據(jù)庫之前,需要配置分發(fā)服務(wù)器,然后再創(chuàng)建發(fā)布。第一次創(chuàng)建發(fā)布時,可以按發(fā)布向?qū)е敢渲梅职l(fā)服務(wù)器。分發(fā)服務(wù)器是包含分發(fā)數(shù)據(jù)庫并為所有類型的復(fù)制存儲元數(shù)據(jù)和歷史記錄數(shù)據(jù)的服務(wù)器,除此之外,它還為事務(wù)復(fù)制存儲事務(wù)。分發(fā)服務(wù)器與發(fā)布服務(wù)器可以是同一臺服務(wù)器,也可以是不同的服務(wù)器。在本例中,是在創(chuàng)建第一個發(fā)布的時候,按照向?qū)е敢渲玫姆职l(fā)服務(wù)器,也就是當(dāng)前服務(wù)器既是發(fā)布服務(wù)器,也是分發(fā)服務(wù)器。
1.打開“SQL Server Ma nagement Studio”后,依次展開“對象資源管理器”樹型目錄“SQL Server 實(shí)例名”→“復(fù)制”→“本地發(fā)布”。右擊“本地發(fā)布”,在右鍵菜單選擇“新建發(fā)布”。
2.出現(xiàn)“新建發(fā)布向?qū)А睂υ捒虼翱诤?,單擊“下一步”,按照向?qū)е敢陆òl(fā)布;出現(xiàn)“分發(fā)服務(wù)器”頁面后,選擇“(服務(wù)器名稱)將充當(dāng)自己的分發(fā)服務(wù)器,SQL Server 將創(chuàng)建分發(fā)數(shù)據(jù)庫和日志”;出現(xiàn)“快照文件夾”頁面后,指定將要存儲快照的根位置。在本例中,指定的快照位置是前面所創(chuàng)建的共享文件夾“\服務(wù)器名 epldata”;出現(xiàn)“發(fā)布數(shù)據(jù)庫”頁面后,選擇要同步的數(shù)據(jù)庫;出現(xiàn)“發(fā)布類型”頁面后,根據(jù)實(shí)際需求選擇發(fā)布類型。
SQL Server 支持的發(fā)布類型包括“快照發(fā)布”“事務(wù)發(fā)布”“對等發(fā)布”和“合并發(fā)布”四種發(fā)布類型。如果選擇快照發(fā)布,在同步數(shù)據(jù)庫時,它是按照數(shù)據(jù)和數(shù)據(jù)庫對象出現(xiàn)時的狀態(tài)來復(fù)制和分發(fā)的。
需要注意的是,因?yàn)橐寻l(fā)布數(shù)據(jù)的變化不被增量地傳播到訂閱服務(wù)器,而是周期性的被一次復(fù)制。采用此數(shù)據(jù)同步方式,即便在發(fā)布服務(wù)器上更新了數(shù)據(jù),訂閱服務(wù)器上的數(shù)據(jù)不會被立即更新,而是要根據(jù)同步周期,等下次數(shù)據(jù)更新。
如果想要實(shí)現(xiàn)實(shí)時同步,即發(fā)布服務(wù)器上的數(shù)據(jù)更新后,訂閱服務(wù)器上的數(shù)據(jù)立即更新,此時可以選擇事務(wù)發(fā)布。不過,如果選擇事務(wù)發(fā)布,所發(fā)布數(shù)據(jù)庫的每張表都必須有主鍵。采用快照發(fā)布方式同步數(shù)據(jù)時,對表結(jié)構(gòu)沒有任何要求。
采用快照發(fā)布或事務(wù)發(fā)布同步數(shù)據(jù)時,所同步的數(shù)據(jù)都是單向的,都是從發(fā)布服務(wù)器到訂閱服務(wù)器。如果需要雙向同步數(shù)據(jù),可以選擇合并發(fā)布。但創(chuàng)建合并發(fā)布時,所發(fā)布數(shù)據(jù)庫的表要求有rowguid 列,也就是每張表必須有全局唯一標(biāo)識符。
3.出現(xiàn)“項(xiàng)目”頁面后,根據(jù)實(shí)際需要選擇項(xiàng)目發(fā)布的表和其它對象;出現(xiàn)“篩選表行”頁面后,根據(jù)需要將不需要同步的對象篩選出去;出現(xiàn)“快照代理”頁面,勾選“立即創(chuàng)建快照并使快照保持可用狀態(tài),以初始化訂閱”。
4.出現(xiàn)“代理安全性”頁面后,單擊“安全設(shè)置”按鈕。出現(xiàn)“快照代理安全性”頁面后,勾選“在以下Windows賬戶下運(yùn)行”,然后在“進(jìn)程賬戶”文本框中輸入前面所創(chuàng)建SQL Server 登錄名,在“密碼”和“確認(rèn)密碼”框輸入與該登錄名對應(yīng)的密碼。在“連接到發(fā)布服務(wù)器”欄選擇“通過模擬進(jìn)程賬戶”。
5.出現(xiàn)“向?qū)Р僮鳌表撁婧?,勾選“在向?qū)ЫY(jié)束時”→“創(chuàng)建發(fā)布”。
6.出現(xiàn)“完成該向?qū)А表撁婧?,在“發(fā)布名稱”頁面為新建的發(fā)布取一個名字。檢查在向?qū)е兴龀龅倪x擇,如果沒有問題,單擊“完成”按鈕,創(chuàng)建發(fā)布。
7.出現(xiàn)“正在創(chuàng)建發(fā)布”頁面后,可以看到創(chuàng)建操作狀態(tài)及其結(jié)果。
在發(fā)布服務(wù)器(源數(shù)據(jù)庫服務(wù)器)發(fā)布數(shù)據(jù)庫后,目標(biāo)數(shù)據(jù)庫可以通過訂閱已發(fā)布的數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)庫同步,下面是在訂閱服務(wù)器上訂閱數(shù)據(jù)庫的具體過程:
1.打開“SQL Server Ma nagement Studio”后,依次展開“對象資源管理器”樹型目錄“SQL Server 實(shí)例名”→“復(fù)制”→“本地訂閱”。右擊“本地訂閱”,在右鍵菜單選擇“新建訂閱”。
2.出現(xiàn)“新建訂閱向?qū)А睂υ捒虼翱诤?,單擊“下一步”,按照向?qū)е敢陆ㄓ嗛啞?/p>
3.出現(xiàn)“發(fā)布”頁面后,通過“發(fā)布服務(wù)器”下拉菜單中的“查找SQL Server 發(fā)布服務(wù)器…”,查找并連接到發(fā)布服務(wù)器。
4.連接到發(fā)布服務(wù)器后,可以查看到已發(fā)布的數(shù)據(jù)庫及其它對象(如存儲過程),選擇需要訂閱的發(fā)布對象。
5.出現(xiàn)“分發(fā)代理位置”頁面后,選擇“在其訂閱服務(wù)器上運(yùn)行每個代理(請求訂閱)”。選擇請求訂閱可以降低分發(fā)服務(wù)器數(shù)據(jù)處理工作的開銷。請求訂閱還允許訂閱服務(wù)器上的用戶確定同步數(shù)據(jù)更改的時間。
6.出現(xiàn)“訂閱服務(wù)器”頁面后,選擇需要訂閱的數(shù)據(jù)庫。
7.出現(xiàn)“分發(fā)代理安全性”頁面后,單擊訂閱服務(wù)器右側(cè)的“……”按鈕。
8.出現(xiàn)“分發(fā)代理安全性”頁面后,勾選“在以下Windows 賬戶下運(yùn)行”,然后在“進(jìn)程賬戶”文本框中輸入前面所創(chuàng)建SQL Server登錄名,在“密碼”和“確認(rèn)密碼”框輸入與該登錄名對應(yīng)的密碼。
在“連接到發(fā)布服務(wù)器”欄選擇“通過模擬進(jìn)程賬戶”。在“連接到訂閱服務(wù)器”欄選擇“通過模擬進(jìn)程賬戶”。
9.出現(xiàn)“同步計(jì)劃”頁面后,在“代理計(jì)劃”下拉列表中選擇“連續(xù)運(yùn)行”。
10.出現(xiàn)“初始化訂閱”頁面,在“初始化時間”下拉列表中選擇“立即”。用發(fā)布訂閱方式同步數(shù)據(jù),必須使用發(fā)布數(shù)據(jù)和架構(gòu)的快照對訂閱數(shù)據(jù)庫進(jìn)行初始化。如果此步操作沒有勾選“立即”,將無法實(shí)現(xiàn)數(shù)據(jù)庫同步。如果創(chuàng)建訂閱時沒有選擇立即初始化,可以等訂閱創(chuàng)建完成后,右擊此訂閱,手動初始化。
11.出現(xiàn)“向?qū)Р僮鳌表撁婧?,勾選“在向?qū)ЫY(jié)束時”→“創(chuàng)建訂閱”。
12.出現(xiàn)“完成該向?qū)А表撁婧?,在檢查在向?qū)е兴龀龅倪x擇,如果沒有問題,單擊“完成”按鈕,創(chuàng)建訂閱。
13.出現(xiàn)“正在創(chuàng)建訂閱”頁面后,可以看到創(chuàng)建操作狀態(tài)及其結(jié)果。
1.在訂閱服務(wù)器查看數(shù)據(jù)庫同步狀態(tài)
①打開“SQL Server Ma nagement Studio”后,依次展開“對象資源管理器”樹型目錄“SQL Server 實(shí)例名”→“復(fù)制”→“本地訂閱”→訂閱對象。右擊訂閱對象,在右鍵菜單選擇“查看同步狀態(tài)”。
②出現(xiàn)“查看同步狀態(tài)”對話框窗口后,可以查看到訂閱和發(fā)布的數(shù)據(jù)庫,開始時間以及同步的狀態(tài),此時可以單擊“停止”/“啟動”按鈕停止/啟動同步,可以單擊“監(jiān)視”按鈕進(jìn)一步監(jiān)視數(shù)據(jù)庫同步。
③打開“復(fù)制監(jiān)視器”窗口后,依次展開“復(fù)制監(jiān)視器”→“我的發(fā)布服務(wù)器”→發(fā)布服務(wù)器名→發(fā)布對象,在右側(cè)“所有訂閱”選項(xiàng)卡下可以看到當(dāng)前訂閱對象的狀態(tài)。如果成功同步數(shù)據(jù)庫,此處訂閱的狀態(tài)應(yīng)該是“正在運(yùn)行”。
2.在發(fā)布服務(wù)器上查看數(shù)據(jù)庫同步狀態(tài)
①打開“SQL Server Ma nagement Studio”后,依次展開“對象資源管理器”樹型目錄“SQL Server 實(shí)例名”→“復(fù)制”→“本地發(fā)布”→發(fā)布對象→訂閱對象。右擊訂閱對象,在右鍵菜單選擇“啟動復(fù)制監(jiān)視器”。
②打開“復(fù)制監(jiān)視器”窗口后,依次展開“復(fù)制監(jiān)視器”→“我的發(fā)布服務(wù)器”→發(fā)布服務(wù)器名→發(fā)布對象,在右側(cè)“所有訂閱”選項(xiàng)卡下可以看到當(dāng)前訂閱對象的狀態(tài)。如果成功同步數(shù)據(jù)庫,此處訂閱的狀態(tài)應(yīng)該是“正在運(yùn)行”。
③如果要重新初始化訂閱,可以右擊需要初始化的訂閱對象,在右鍵菜單中選擇“重新初始化訂閱”。
3.修改數(shù)據(jù)驗(yàn)證數(shù)據(jù)庫同步效果
無論是在發(fā)布服務(wù)器上,還是在訂閱服務(wù)器上,所查看的同步狀態(tài)實(shí)際上是同步訂閱的工作狀態(tài)。如果在創(chuàng)建發(fā)布時,選擇的是事務(wù)發(fā)布,就可以通過修改發(fā)布數(shù)據(jù)庫的數(shù)據(jù)來驗(yàn)證數(shù)據(jù)庫同步效果。
在發(fā)布服務(wù)器上打開所發(fā)布的數(shù)據(jù)庫,編輯其中一個表的數(shù)據(jù)。
手動更新源數(shù)據(jù)庫數(shù)據(jù)后,打開訂閱服務(wù)器上訂閱的數(shù)據(jù)庫,打開同一張表,查看該數(shù)據(jù)是否已更新。
例如,在本例中,該學(xué)生的姓名已更新為源數(shù)據(jù)庫的姓名,說明數(shù)據(jù)庫實(shí)時同步實(shí)驗(yàn)取得成功。