先說為什么升級吧,可能了解Discuz!的朋友看到版本號就知道為什么升級了。沒錯,版本太低,論壇發(fā)展受到很大制約成了升級的一個重要原因;另外一個重要原因就是升級前的一段時間社區(qū)訪問量又有大幅上升,負載能力的不足,給用戶帶來不良體驗,影響用戶發(fā)貼積極性,制約社區(qū)發(fā)展。于是痛下決心升級...(ps:我是剛來到公司,系統(tǒng)早該升級了但由于人員不足一直沒能落實),整個升級過程由我主刀,前期準備也就是仔細對比現(xiàn)有社區(qū)數(shù)據(jù)庫與dz5.0數(shù)據(jù)庫。自從開始使用dz2.0,就開始對其改造,經(jīng)過近兩年的改造,從程序到數(shù)據(jù)庫被改動的地方非常多真可謂“面目全非”,程序的效率及負載能力也因此受到影響。
下面廢話就不多說了,先講一下大概的過程吧。
既然升級就需要有所取“舍”,輕裝上陣才是硬道理(并不是要丟棄一些數(shù)據(jù),只是放到最后去做)。
一:分析用戶數(shù)據(jù);
①. 由于dz2時期用戶資料及個性設(shè)置均存儲在members表,而dz5是將用戶信息和詳細資料個性設(shè)置分別存儲在members,和memberfileds兩個表中。
②. 兩個版本對于用戶組的統(tǒng)計存儲有較大改動,dz2時期全部依靠credit的值對照usergroup中的設(shè)置來確定用戶組,而dz5則是根據(jù)credits確定用戶組之后將組id保存在groupid字段,因此在轉(zhuǎn)移用戶數(shù)據(jù)時就需要對用戶組設(shè)置有較全面的了解,主要是了解各個用戶組的劃分界限及組id,在寫升級程序時要用到這些數(shù)據(jù)。
③. dz2時期用status來區(qū)分用戶權(quán)限,而dz5中用adminid,groupid來檢查權(quán)限,因此升級程序要對status為Admin,SuperMod,Moderator,Banned,PostBanned,Inactive的用戶重新分配groupid而不能單一通過②中的方法確定。其他字段的數(shù)據(jù)很容易處理,也沒什么特殊之處而且有一部分是兩個版本相同的字段。
④. 因為以前安裝的銀行跟現(xiàn)在的銀行也有較大改變,dz2時期在用戶表中有bank和money字段分別存儲存款和現(xiàn)金,dz5中沒有存款字段了,只好把用戶的存款全部加到現(xiàn)金中,然后保存到dz5的銀行擴展字段extcreditsX (X=1,2,…8)。還有一個需要注意的就是存款的利息,(雖然你可能會覺得這個應(yīng)該是毛毛雨啦,但用戶會很在意的。。。)轉(zhuǎn)移銀行存款時一起結(jié)算吧~~
二:分析帖子數(shù)據(jù);大家都知道,帖子數(shù)據(jù)是要分threads和posts兩個表的,因此在這一步還要分開考慮threads和posts,要注意的就是帖子類型的不同,轉(zhuǎn)數(shù)據(jù)時會涉及到其他表。從dz2時期就有了"投票帖","附件",升級程序在遇到這些特殊帖子時就需要同時轉(zhuǎn)移投票選項及附件的數(shù)據(jù)(當(dāng)然你也可以一個表一個表的轉(zhuǎn)),怎么判斷遇到了這些特殊帖?有兩個字段可以參考dz2.threads.pollopts和dz2.posts.aid。對于threads表,
①. 需要注意的是authorid,在dz2的threads表不記錄發(fā)帖者uid,因此需要查出dz2.threads表中每條數(shù)據(jù)對應(yīng)的uid。
' http://m.survivalescaperooms.com/article.asp?typeid=114
②. 轉(zhuǎn)移投票帖時需要注意的是:dz2對投票選項采用了serialize()編碼,因此就需要unserialize,下面把我的這部分代碼貼出來供參考:
if ($rows['pollopts']){ // 處理投票帖
$pollopts = unserialize($rows['pollopts']);
$i = 0;
foreach ($pollopts as $key => $v1){
if ($key=='options')
foreach ($v1 as $v){
$sql = "INSERT INTO dz5.polloptions (`tid`,`votes`,`displayorder`,`polloption`,`voterids`)VALUES('$rows[tid]','$v[1]','0','$v[0]','')";
jkquery($sql,1,0);
}
if ($key=='mult $polls['maxchoices'] = '1'; } $sql = "INSERT INTO dz5.polls (`tid`,`multiple`,`visible`,`maxchoices`) VALUES('$rows[tid]','$polls[multiple]','1','$polls[maxchoices]')"; jkquery($sql,1,0); } 說明:jkquery是封裝的函數(shù),參數(shù)一$sql是需執(zhí)行的SQL;參數(shù)二為1時執(zhí)行SQL,為0時不執(zhí)行SQL;參數(shù)三為1時輸出SQL,為0時不輸出SQL;這樣封裝是為了調(diào)試的方便,具體函數(shù)見附件。 ③. 對于特殊帖需要在dz5版的threads表special字段做出標記,方法:$rows['pollopts']?1:0; 其中$rows查尋dz2.threads的結(jié)果集。 對于posts表,①. 用樣有authorid的問題。②.對于包含附件的帖子同時轉(zhuǎn)移附件數(shù)據(jù),好在dz2時期一個帖子只能發(fā)一個附件,不然數(shù)據(jù)量又變大了J其他就沒什么特殊的問題了。 對于一個社區(qū)而言,這兩方面的數(shù)據(jù)是最重要的,其他數(shù)據(jù)的轉(zhuǎn)移我就不說了。。。。 有一點就是我沒有把程序整合到一起,而是利用<meta http-equiv="refresh" content="1 url=xxx.php">保持各個程序連貫運行。各個程序分開有利于編寫時調(diào)試。再一點就是程序在轉(zhuǎn)移數(shù)據(jù)時可以一次插入N條數(shù)據(jù),這樣做有好處也有風(fēng)險,好處是減少與MySQL的通訊次數(shù)縮短運行時間,但是如果在其中一條數(shù)據(jù)出現(xiàn)插入錯誤時就會造成后面的數(shù)據(jù)丟失。比如:半個字的問題,轉(zhuǎn)義不管用的。。。 升級程序的效率還是需要注意的喔!在一切準備充分之后選擇在凌晨3:00-8:00升級,事實上數(shù)據(jù)轉(zhuǎn)移所花費的時間不到3個小時,共轉(zhuǎn)移用戶1100000++ ,帖子12000000++ ,其他數(shù)據(jù)累計也有千萬之多,程序效率還是很重要的 數(shù)據(jù)升級完成只是新任務(wù)的開始:升級之前一定要注意的就是要規(guī)劃好每一步該做什么,切忌亂了陣腳,因為用戶可能會不習(xí)慣新版本,留戀老版本中的一些功能,而鑒于此就需要在新版中重新開發(fā)或者把老版中的相關(guān)功能遷移到新版。如果以前安裝的插件比較多,可能就有更多的后續(xù)任務(wù)要做了,比如:插件所用到的數(shù)據(jù),這些數(shù)據(jù)可能很集中這樣還比較簡單,也可能很分散這樣就比較麻煩一些,這些就要看具體情況了。 升級改版不是只是新任務(wù)的開始,解決因升級而產(chǎn)生的問題才是最重要的。很多東西并不像我們升級前想象的那么理想,因為用戶的需求是千變?nèi)f化的。 附件是短消息,和收藏夾的升級程序,由于以前的數(shù)據(jù)庫改動較大,升級程序也具通用性也就不發(fā)出來了,或許看后能有一些啟發(fā)~ (ps: 這里沒法添加附件...) http://blog.csdn.net/zhys9/archive/2007/02/23/1513163.aspx
新聞熱點
疑難解答