同步兩個SQLServer數(shù)據(jù)庫如何同步兩個sqlserver數(shù)據(jù)庫的內(nèi)容?程序代碼可以有版本管理cvs進行同步管理,可是數(shù)據(jù)庫同步就非常麻煩,只能自己改了一個后再去改另一個,如果忘記了更改另一個經(jīng)常造成兩個數(shù)據(jù)庫的結(jié)構(gòu)或內(nèi)容上不一致.各位有什么好的方法嗎?一、分發(fā)與復(fù)制用強制訂閱實現(xiàn)數(shù)據(jù)庫同步操作.大量和批量的數(shù)據(jù)可以用數(shù)據(jù)庫的同步機制處理://說明:為方便操作,所有操作均在發(fā)布服務(wù)器(分發(fā)服務(wù)器)上操作,并使用推模式在客戶機器使用強制訂閱方式。二、測試通過1:環(huán)境服務(wù)器環(huán)境:機器名稱:zehuadb操作系統(tǒng):windows2000server數(shù)據(jù)庫版本:sql2000server個人版客戶端機器名稱:zlp操作系統(tǒng):windows2000server數(shù)據(jù)庫版本:sql2000server個人版2:建用戶帳號在服務(wù)器端建立域用戶帳號我的電腦管理-本地用戶和組-用戶-建立username:zlpuserpwd:zlp3:重新啟動服務(wù)器mssqlserver我的電腦-控制面版-管理工具-服務(wù)-mssqlserver服務(wù)(更改為:域用戶帳號,我們新建的zlp用戶.\zlp,密碼:zlp)4:安裝分發(fā)服務(wù)器a:配置分發(fā)服務(wù)器工具-復(fù)制-配置發(fā)布、訂閱服務(wù)器和分發(fā)-下一步-下一步(所有的均采用默認配置)b:配置發(fā)布服務(wù)器工具-復(fù)制-創(chuàng)建和管理發(fā)布-選擇要發(fā)布的數(shù)據(jù)庫(sz)-下一步-快照發(fā)布-下一步-選擇要發(fā)布的內(nèi)容-下一步-下一步-下一步-完成c:強制配置訂閱服務(wù)器(推模式,拉模式與此雷同)工具-復(fù)制-配置發(fā)布、訂閱服務(wù)器和分發(fā)-訂閱服務(wù)器-新建-sqlserver數(shù)據(jù)庫-輸入客戶端服務(wù)器名稱(zlp)-使用sqlserver身份驗證(sa,空密碼)-確定-應(yīng)用-確定d:初始化訂閱復(fù)制監(jiān)視器-發(fā)布服務(wù)器(zehuadb)-雙擊訂閱-強制新建-下一步-選擇啟用的訂閱服務(wù)器-zlp-下一步-下一步-下一步-下一步-完成5:測試配置是否成功復(fù)制監(jiān)視器-發(fā)布衿?zehuadb)-雙擊sz:sz-點狀態(tài)-點立即運行代理程序查看:復(fù)制監(jiān)視器-發(fā)布服務(wù)器(zehuadb)-sz:sz-選擇zlp:sz(類型強制)-鼠標右鍵-啟動同步處理如果沒有錯誤標志(紅色叉),恭喜您配置成功6:測試數(shù)據(jù)在服務(wù)器執(zhí)行:選擇一個表,執(zhí)行如下sql:insertintowq_newsgroup_sselect'測試成功',5復(fù)制監(jiān)視器-發(fā)布服務(wù)器(zehuadb)-sz:sz-快照-啟動代理程序-zlp:sz(強制)-啟動同步處理去查看同步的wq_newsgroup_s是否插入了一條新的記錄測試完畢,通過。7:修改數(shù)據(jù)庫的同步時間,一般選擇夜晚執(zhí)行數(shù)據(jù)庫同步處理(具體操作略):d/*注意說明:服務(wù)器一端不能以(local)進行數(shù)據(jù)的發(fā)布與分發(fā),需要先刪除注冊,然后新建注冊本地計算機名稱卸載方式:工具-復(fù)制-禁止發(fā)布-是在"zehuadb"上靜止發(fā)布,卸載所有的數(shù)據(jù)庫同步配置服務(wù)器注意:發(fā)布服務(wù)器、分發(fā)服務(wù)器中的sqlserveragent服務(wù)必須啟動采用推模式:"d:\microsoftsqlserver\mssql\repldata\unc"目錄文件可以不設(shè)置共享拉模式:則需要共享~!*/少量數(shù)據(jù)庫同步可以采用觸發(fā)器實現(xiàn),同步單表即可。三、配置過程中可能出現(xiàn)的問題在sqlserver2000里設(shè)置和使用數(shù)據(jù)庫復(fù)制之前,應(yīng)先檢查相關(guān)的幾臺sqlserver服務(wù)器下面幾點是否滿足:1、mssqlserver和sqlserveragent服務(wù)是否是以域用戶身份啟動并運行的(.\administrator用戶也是可以的)如果登錄用的是本地系統(tǒng)帳戶local,將不具備網(wǎng)絡(luò)功能,會產(chǎn)生以下錯誤:進程未能連接到distributor'@servername'(如果您的服務(wù)器已經(jīng)用了sqlserver全文檢索服務(wù),請不要修改mssqlserver和sqlserveragent服務(wù)的local啟動。會照成全文檢索服務(wù)不能用。請換另外一臺機器來做sqlserver2000里復(fù)制中的分發(fā)服務(wù)器。)修改服務(wù)啟動的登錄用戶,需要重新啟動mssqlserver和sqlserveragent服務(wù)才能生效。2、檢查相關(guān)的幾臺sqlserver服務(wù)器是否改過名稱(需要srvid=0的本地機器上srvname和datasource一樣)在查詢分析器里執(zhí)行:usemasterselectsrvid,srvname,datasourcefromsysservers如果沒有srvid=0或者srvid=0(也就是本機器)但srvname和datasource不一樣,需要按如下方法修改:usemastergo--設(shè)置兩個變量declare@serverproperty_servernamevarchar(100),@servernamevarchar(100)--取得windowsnt服務(wù)器和與指定的sqlserver實例關(guān)聯(lián)的實例信息select@serverproperty_servername=convert(varchar(100),serverproperty('servername'))--返回運行microsoftsqlserver的本地服務(wù)器名稱select@servername=convert(varchar(100),@@servername)--顯示獲取的這兩個參數(shù)select@serverproperty_servername,@servername--如果@serverproperty_servername和@servername不同(因為你改過計算機名字),再運行下面的--刪除錯誤的服務(wù)器名execsp_dropserver@server=@servername--添加正確的服務(wù)器名execsp_addserver@server=@serverproperty_servername,@local='local'修改這項參數(shù),需要重新啟動mssqlserver和sqlserveragent服務(wù)才能生效。這樣一來就不會在創(chuàng)建復(fù)制的過程中出現(xiàn)18482、18483錯誤了。3、檢查sqlserver企業(yè)管理器里面相關(guān)的幾臺sqlserver注冊名是否和上面第二點里介紹的srvname一樣不能用ip地址的注冊名。(我們可以刪掉ip地址的注冊,新建以sqlserver管理員級別的用戶注冊的服務(wù)器名)這樣一來就不會在創(chuàng)建復(fù)制的過程中出現(xiàn)14010、20084、18456、18482、18483錯誤了。4、檢查相關(guān)的幾臺sqlserver服務(wù)器網(wǎng)絡(luò)是否能夠正常訪問如果ping主機ip地址可以,但ping主機名不通的時候,需要在winnt\system32\drivers\etc\hosts(win2000)windows\system32\drivers\etc\hosts(win2003)文件里寫入數(shù)據(jù)庫服務(wù)器ip地址和主機名的對應(yīng)關(guān)系。例如:127.0.0.1localhost192.168.0.35oracledboracledb192.168.0.65fengyu02fengyu02202.84.10.193bj_dbbj_db或者在sqlserver客戶端網(wǎng)絡(luò)實用工具里建立別名,例如:5、系統(tǒng)需要的擴展存儲過程是否存在(如果不存在,需要恢復(fù)):sp_addextendedproc'xp_regenumvalues',@dllname='xpstar.dll'gosp_addextendedproc'xp_regdeletevalue',@dllname='xpstar.dll'gosp_addextendedproc'xp_regdeletekey',@dllname='xpstar.dll'gosp_addextendedprocxp_cmdshell,@dllname='xplog70.dll'接下來就可以用sqlserver企業(yè)管理器里[復(fù)制]-右鍵選擇-[配置發(fā)布、訂閱服務(wù)器和分發(fā)]的圖形界面來配置數(shù)據(jù)庫復(fù)制了。下面是按順序列出配置復(fù)制的步驟:1、建立發(fā)布和分發(fā)服務(wù)器[歡迎使用配置發(fā)布和分發(fā)向?qū)-[選擇分發(fā)服務(wù)器]-[使"@servername"成為它自己的分發(fā)服務(wù)器,sqlserver將創(chuàng)建分發(fā)數(shù)據(jù)庫和日志]-[制定快照文件夾]-[自定義配置]-[否,使用下列的默認配置]-[完成]上述步驟完成后,會在當前"@servername"sqlserver數(shù)據(jù)庫里建立了一個distribion庫和一個distributor_admin管理員級別的用戶(我們可以任意修改密碼)。服務(wù)器上新增加了四個作業(yè):[代理程序歷史記錄清除:distribution][分發(fā)清除:distribution][復(fù)制代理程序檢查][重新初始化存在數(shù)據(jù)驗證失敗的訂閱]sqlserver企業(yè)管理器里多了一個復(fù)制監(jiān)視器,當前的這臺機器就可以發(fā)布、分發(fā)、訂閱了。我們再次在sqlserver企業(yè)管理器里[復(fù)制]-右鍵選擇-[配置發(fā)布、訂閱服務(wù)器和分發(fā)]我們可以在[發(fā)布服務(wù)器和分發(fā)服務(wù)器的屬性]窗口-[發(fā)布服務(wù)器]-[新增]-[確定]-[發(fā)布數(shù)據(jù)庫]-[事務(wù)]/[合并]-[確定]-[訂閱服務(wù)器]-[新增]-[確定]把網(wǎng)絡(luò)上的其它sqlserver服務(wù)器添加成為發(fā)布或者訂閱服務(wù)器.新增一臺發(fā)布服務(wù)器的選項:我這里新建立的jin001發(fā)布服務(wù)器是用管理員級別的數(shù)據(jù)庫用戶test連接的,到發(fā)布服務(wù)器的管理鏈接要輸入密碼的可選框,默認的是選中的,在新建的jin001發(fā)布服務(wù)器上建立和分發(fā)服務(wù)器fengyu/fengyu的鏈接的時需要輸入distributor_admin用戶的密碼。到發(fā)布服務(wù)器的管理鏈接要輸入密碼的可選框,也可以不選,也就是不需要密碼來建立發(fā)布到分發(fā)服務(wù)器的鏈接(這當然欠缺安全,在測試環(huán)境下可以使用)。2、新建立的網(wǎng)絡(luò)上另一臺發(fā)布服務(wù)器(例如jin001)選擇分發(fā)服務(wù)器[歡迎使用配置發(fā)布和分發(fā)向?qū)-[選擇分發(fā)服務(wù)器]-使用下列服務(wù)器(選定的服務(wù)器必須已配置為分發(fā)服務(wù)器)-[選定服務(wù)器](例如fengyu/fengyu)-[下一步]-[輸入分發(fā)服務(wù)器(例如fengyu/fengyu)的distributor_admin用戶的密碼兩次]-[下一步]-[自定義配置]-[否,使用下列的默認配置]-[下一步]-[完成]-[確定]建立一個數(shù)據(jù)庫復(fù)制發(fā)布的過程:[復(fù)制]-[發(fā)布內(nèi)容]-右鍵選擇-[新建發(fā)布]-[下一步]-[選擇發(fā)布數(shù)據(jù)庫]-[選中一個待發(fā)布的數(shù)據(jù)庫]-[下一步]-[選擇發(fā)布類型]-[事務(wù)發(fā)布]/[合并發(fā)布]-[下一步]-[指定訂閱服務(wù)器的類型]-[運行sqlserver2000的服務(wù)器]-[下一步]-[指定項目]-[在事務(wù)發(fā)布中只可以發(fā)布帶主鍵的表]-[選中一個有主鍵的待發(fā)布的表]-[在合并發(fā)布中會給表增加唯一性索引和rowguidcol屬性的唯一標識符字段[rowguid],默認值是newid()](添加新列將:導(dǎo)致不帶列列表的insert語句失敗,增加表的大小,增加生成第一個快照所要求的時間)-[選中一個待發(fā)布的表]-[下一步]-[選擇發(fā)布名稱和描述]--[下一步]-[自定義發(fā)布的屬性]-[否,根據(jù)指定方式創(chuàng)建發(fā)布]-[下一步]-[完成]-[關(guān)閉]發(fā)布屬性里有很多有用的選項:設(shè)定訂閱到期(例如24小時)設(shè)定發(fā)布表的項目屬性:常規(guī)窗口可以指定發(fā)布目的表的名稱,可以跟原來的表名稱不一樣。下圖是命令和快照窗口的欄目(sqlserver數(shù)據(jù)庫復(fù)制技術(shù)實際上是用insert,update,delete操作在訂閱服務(wù)器上重做發(fā)布服務(wù)器上的事務(wù)操作看文檔資料需要把發(fā)布數(shù)據(jù)庫設(shè)成完全恢復(fù)模式,事務(wù)才不會丟失但我自己在測試中發(fā)現(xiàn)發(fā)布數(shù)據(jù)庫是簡單恢復(fù)模式下,每10秒生成一些大事務(wù),10分鐘后再收縮數(shù)據(jù)庫日志,這期間發(fā)布和訂閱服務(wù)器上的作業(yè)都暫停,暫?;謴?fù)后并沒有丟失任何事務(wù)更改)發(fā)布表可以做數(shù)據(jù)篩選,例如只選擇表里面的部分列:例如只選擇表里某些符合條件的記錄,我們可以手工編寫篩選的sql語句:發(fā)布表的訂閱選項,并可以建立強制訂閱:成功建立了發(fā)布以后,發(fā)布服務(wù)器上新增加了一個作業(yè):[失效訂閱清除]分發(fā)服務(wù)器上新增加了兩個作業(yè):[jin001-dack-dack-5]類型[repl快照][jin001-dack-3]類型[repl日志讀取器]上面藍色字的名稱會根據(jù)發(fā)布服務(wù)器名,發(fā)布名及第幾次發(fā)布而使用不同的編號repl快照作業(yè)是sqlserver復(fù)制的前提條件,它會先把發(fā)布的表結(jié)構(gòu),數(shù)據(jù),索引,約束等生成到發(fā)布服務(wù)器的os目錄下文件(當有訂閱的時候才會生成,當訂閱請求初始化或者按照某個時間表調(diào)度生成)repl日志讀取器在事務(wù)復(fù)制的時候是一直處于運行狀態(tài)。(在合并復(fù)制的時候可以根據(jù)調(diào)度的時間表來運行)建立一個數(shù)據(jù)庫復(fù)制訂閱的過程:[復(fù)制]-[訂閱]-右鍵選擇-[新建請求訂閱]-[下一步]-[查找發(fā)布]-[查看已注冊服務(wù)器所做的發(fā)布]-[下一步]-[選擇發(fā)布]-[選中已經(jīng)建立發(fā)布服務(wù)器上的數(shù)據(jù)庫發(fā)布名]-[下一步]-[指定同步代理程序登錄]-[當代理程序連接到代理服務(wù)器時:使用sqlserver身份驗證](輸入發(fā)布服務(wù)器上distributor_admin用戶名和密碼)-[下一步]-[選擇目的數(shù)據(jù)庫]-[選擇在其中創(chuàng)建訂閱的數(shù)據(jù)庫名]/[也可以新建一個庫名]-[下一步]-[允許匿名訂閱]-[是,生成匿名訂閱]-[下一步]-[初始化訂閱]-[是,初始化架構(gòu)和數(shù)據(jù)]-[下一步]-[快照傳送]-[使用該發(fā)布的默認快照文件夾中的快照文件](訂閱服務(wù)器要能訪問發(fā)布服務(wù)器的repldata文件夾,如果有問題,可以手工設(shè)置網(wǎng)絡(luò)共享及共享權(quán)限)-[下一步]-[快照傳送]-[使用該發(fā)布的默認快照文件夾中的快照文件]-[下一步]-[設(shè)置分發(fā)代理程序調(diào)度]-[使用下列調(diào)度]-[更改]-[例如每五分鐘調(diào)度一次]-[下一步]-[啟動要求的服務(wù)]-[該訂閱要求在發(fā)布服務(wù)器上運行sqlserveragent服務(wù)]-[下一步]-[完成]-[確定]成功建立了訂閱后,訂閱服務(wù)器上新增加了一個類別是[repl-分發(fā)]作業(yè)(合并復(fù)制的時候類別是[repl-合并])它會按照我們給的時間調(diào)度表運行數(shù)據(jù)庫同步復(fù)制的作業(yè)。3、sqlserver復(fù)制配置好后,可能出現(xiàn)異常情況的實驗日志:1.發(fā)布服務(wù)器斷網(wǎng),sqlserver服務(wù)關(guān)閉,重啟動,關(guān)機的時候,對已經(jīng)設(shè)置好的復(fù)制沒有多大影響中斷期間,分發(fā)和訂閱都接收到?jīng)]有復(fù)制的事務(wù)信息2.分發(fā)服務(wù)器斷網(wǎng),sqlserver服務(wù)關(guān)閉,重啟動,關(guān)機的時候,對已經(jīng)設(shè)置好的復(fù)制有一些影響中斷期間,發(fā)布服務(wù)器的事務(wù)排隊堆積起來(如果設(shè)置了較長時間才刪除過期訂閱的選項,繁忙發(fā)布數(shù)據(jù)庫的事務(wù)日志可能會較快速膨脹),訂閱服務(wù)器會因為訪問不到發(fā)布服務(wù)器,反復(fù)重試我們可以設(shè)置重試次數(shù)和重試的時間間隔(最大的重試次數(shù)是9999,如果每分鐘重試一次,可以支持約6.9天不出錯)分發(fā)服務(wù)器sqlserver服務(wù)啟動,網(wǎng)絡(luò)接通以后,發(fā)布服務(wù)器上的堆積作業(yè)將按時間順序作用到訂閱機器上:會需要一個比較長的時間(實際上是生成所有事務(wù)的insert,update,delete語句,在訂閱服務(wù)器上去執(zhí)行)我們在普通的pc機上實驗的58個事務(wù)100228個命令執(zhí)行花了7分28秒.3.訂閱服務(wù)器斷網(wǎng),sqlserver服務(wù)關(guān)閉,重啟動,關(guān)機的時候,對已經(jīng)設(shè)置好的復(fù)制影響比較大,可能需要重新初試化我們實驗環(huán)境(訂閱服務(wù)器)從18:46分意外停機以,第二天8:40分重啟動后,已經(jīng)設(shè)好的復(fù)制在8:40分以后又開始正常運行了,發(fā)布服務(wù)器上的堆積作業(yè)將按時間順序作用到訂閱機器上,但復(fù)制管理器里出現(xiàn)快照的錯誤提示,快照可能需要重新初試化,復(fù)制可能需要重新啟動.(我們實驗環(huán)境的機器并沒有進行快照初試化,復(fù)制仍然是成功運行的)4、刪除已經(jīng)建好的發(fā)布和定閱可以直接用delete刪除按鈕我們最好總是按先刪定閱,再刪發(fā)布,最后禁用發(fā)布的順序來操作。如果要徹底刪去sqlserver上面的復(fù)制設(shè)置,可以這樣操作:[復(fù)制]-右鍵選擇[禁用發(fā)布]-[歡迎使用禁用發(fā)布和分發(fā)向?qū)-[下一步]-[禁用發(fā)布]-[要在"@servername"上禁用發(fā)布]-[下一步]-[完成禁用發(fā)布和分發(fā)向?qū)-[完成]我們也可以用t-sql命令來完成復(fù)制中發(fā)布及訂閱的創(chuàng)建和刪除,選中已經(jīng)設(shè)好的發(fā)布和訂閱,按屬標右鍵可以[生成sql腳本]。(這里就不詳細講了,后面推薦的網(wǎng)站內(nèi)有比較詳細的內(nèi)容)當你試圖刪除或者變更一個table時,出現(xiàn)以下錯誤server:msg3724,level16,state2,line1cannotdropthetable'object_name'becauseitisbeingusedforreplication.比較典型的情況是該table曾經(jīng)用于復(fù)制,但是后來又刪除了復(fù)制。處理法:select*fromsysobjectswherereplinfo'0'sp_configure'allowupdates',1goreconfigurewithoverridegobegintransactionupdatesysobjectssetreplinfo='0'wherereplinfo'0'committransactiongorollbacktransactiongosp_configure'allowupdates',0goreconfigurewithoverridego
創(chuàng)新互聯(lián)建站服務(wù)項目包括紅山網(wǎng)站建設(shè)、紅山網(wǎng)站制作、紅山網(wǎng)頁制作以及紅山網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,紅山網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到紅山省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
查詢出對應(yīng)的商品記錄然后json_encode($goods)(這是個字符串,也可以用serialize進行編碼)
把這是個字符串存入到訂單數(shù)據(jù)中 goods_json=json_encode($goods)
取出快照數(shù)據(jù)就不需要去goods表查,直接json_dncode($goods_json);
用curl,自己百度搜
或者file_get_content
$my_curl = curl_init(); //初始化一個curl對象
curl_setopt($my_curl, CURLOPT_URL, ""); //設(shè)置你需要抓取的URL
curl_setopt($my_curl,CURLOPT_RETURNTRANSFER,1); //設(shè)置是將結(jié)果保存到字符串中還是輸出到屏幕上,1表示將結(jié)果保存到字符串
$str = curl_exec($curl); //執(zhí)行請求
echo $str; //輸出抓取的結(jié)果
curl_close($curl); //關(guān)閉url請求