最近在做MediaWiki從1.27.0升級到1.35.1的過程中遇到一些頁面打開無内容,點擊“編輯”顯示
“某某頁面”的版本#0不存在。這通常是因為進入了一個已被删除的頁面的曆史鍊接。詳細信息可以在删除日志中找到。
而實際上在删除日志中也找不到記錄。
在網上搜索,對應的英文報錯是:
"The revision #0 of the page named '[page name]" does not exist. This is usually caused by following an outdated history link to a page that has been deleted. Details can be found in the deletion log.
應該是出現了數據庫不一緻,在MediaWiki官方網站上給出的解決辦法是運行findAnomalies.php,但這個程序在1.35.1的maintenance目錄下并沒有,隻能從頁面中複制php代碼放置到一個新建的findAnomalies.php中,然後運行,可是我這樣操作後依然沒有解決問題。
再從Manual:FindAnomalies.php這個頁面中看到還有一個辦法就是使用maintenance下的attachLatest.php,這個我前些時也嘗試了,還是沒有解決問題,真是麻煩啊。
後面準備把升級的網站數據庫全部重新備份、恢複、升級,如果還不行的話,就要深入研究數據庫結構和程序了,總會有辦法解決的,隻是用的時間更長。
在升級過程中有這樣的提示信息:
User name "Move page script" is usable, cannot create an anonymous actor for it. Run maintenance/cleanupUsersWithNoId.php to fix this situation.
這個Move page script不是真實的用戶,而是以前版本的程序moveBatch.php自動産生的。提示信息中說到的程序Manual:CleanupUsersWithNoId.php 是将沒有ID的用戶編輯的内容都清除,結果就導緻一些頁面内容丢失了。
升級過程中需要按順序運行下面的php程序:
maintenance/migrateComments.php
maintenance/migrateActors.php
maintenance/cleanupUsersWithNoId.php
maintenance/populateExternallinksIndex60.php
maintenance/deduplicateArchiveRevId.php
maintenance/populateContentTables.php
maintenance/populateChangeTagDef.php
準備臨時把cleanupUsersWithNoId.php設置為空,重新恢複MySQL數據,然後再次運行update.php升級試一試。
問題終于查出原因來了:
是運行maintenance中的XML導入程序、批量move程序的時候,用戶名為我們自己起的Robot或者Robots以及程序起的Move page script,而這些用戶在MediaWiki的用戶庫中并沒有,在升級的時候update.php發現這種問題,然後調用CleanupUsersWithNoId.php去删除了這些用戶編輯過的内容,導緻内容丢失。
上面說的把cleanupUsersWithNoId.php置空也不是個标準的做法,最好是能夠補上這幾個用戶。
我在老的Wiki站點中補充了這幾個用戶,然後再備份數據庫、導入恢複到新的庫中,再次運行update.php,這些用戶名就找到了已存在的用戶,從這些用戶的貢獻頁面也可以看到對應的頁面了。
至此這個問題算是完全解決了,前後拖了差不多一個月時間。
2021年7月7日補充:在郵編庫Wiki網站升級、改版完成後,我們繼續對查号吧Wiki網站進行升級、改版,這次是從MediaWiki 1.27.0升級到1.35.3,而且新購了RDS,MySQL版本從5.6.16-log升級到8.0.18。這次又遇到下面這些報錯:
User name "xxx" is usable, cannot create an anonymous actor for it. Run maintenance/cleanupUsersWithNoId.php to fix this situation. Failed to populate content table revision row batch starting at xxx due to exception: MediaWiki\Storage\BlobAccessException: Unable to fetch blob at tt:xxx in includes/Storage/SqlBlobStore.php:295 Unable to fetch blob at tt:
等等,前前後後嘗試了各種辦法(新建或者改名用戶、運行findBadBlobs.php、運行cleanupUserWithNoId.php、運行findAnomalies.php等),折騰了差不多一個星期都沒有搞定吧,今天終于是找到了一個解決 Skip bad blobs when inserting slot record 問題的補丁,把升級進行完了。✌️
2021年7月13日補充:升級完成、不報錯後,在網站使用用戶名、密碼登錄卻遇到這樣的報錯:
A database query error has occurred. Did you forget to run your application's database schema updater after upgrading? Query: SELECT ug_user,ug_group,ug_expiry FROM `user_groups` WHERE ug_user = 'x'
我再次運行update.php,隻要幾秒鐘就運行完了,并且運行記錄沒有報錯。
但早上來看登錄還是報錯,在網上找到别人遇到與我們一樣的報錯:https://www.mediawiki.org/wiki/Topic:Tye8bmq845eyhpnc
裡面指出了需要一個補丁:https://github.com/wikimedia/mediawiki/blob/master/maintenance/archives/patch-user_groups-ug_expiry.sql ,我去添加了這個字段:
ALTER TABLE /*$wgDBprefix*/user_groups ADD COLUMN ug_expiry varbinary(14) NULL default NULL, ADD INDEX ug_expiry (ug_expiry);
再次嘗試登錄就可以了。
2021-7-21補充:升級完成後偶有頁面出現這種報錯:
內部錯誤 [YPVm9AqQ90IAAGmabfgAAABD] /%E5%BB%89%E6%B1%9F MediaWiki\Revision\RevisionAccessException from line 1033 of /path/includes/Revision/RevisionStore.php: Failed to load data blob from tt:2081061: Unable to fetch blob at tt:2081061 Backtrace: #0 /path/includes/Revision/RevisionStore.php(1280): MediaWiki\Revision\RevisionStore->loadSlotContent(MediaWiki\Revision\SlotRecord, NULL, NULL, NULL, integer) #1 [internal function]: MediaWiki\Revision\RevisionStore->MediaWiki\Revision\{closure}(MediaWiki\Revision\SlotRecord) #2 /path/includes/Revision/SlotRecord.php(307): call_user_func(Closure, MediaWiki\Revision\SlotRecord) #3 /path/includes/Revision/RevisionRecord.php(175): MediaWiki\Revision\SlotRecord->getContent() #4 /path/includes/parser/Parser.php(3646): MediaWiki\Revision\RevisionRecord->getContent(string) #5 /path/includes/parser/Parser.php(3531): Parser->statelessFetchTemplate(Title, Parser) #6 /path/includes/parser/Parser.php(3399): Parser->fetchTemplateAndTitle(Title) #7 /path/includes/parser/Parser.php(3163): Parser->getTemplateDom(Title) #8 /path/includes/parser/PPFrame_Hash.php(253): Parser->braceSubstitution(array, PPTemplateFrame_Hash) #9 /path/includes/parser/Parser.php(3225): PPFrame_Hash->expand(PPNode_Hash_Tree) #10 /path/includes/parser/PPFrame_Hash.php(253): Parser->braceSubstitution(array, PPTemplateFrame_Hash) #11 /path/includes/parser/Parser.php(3225): PPFrame_Hash->expand(PPNode_Hash_Tree) #12 /path/includes/parser/PPFrame_Hash.php(253): Parser->braceSubstitution(array, PPFrame_Hash) #13 /path/includes/parser/Parser.php(2887): PPFrame_Hash->expand(PPNode_Hash_Tree, integer) #14 /path/includes/parser/Parser.php(1556): Parser->replaceVariables(string) #15 /path/includes/parser/Parser.php(651): Parser->internalParse(string) #16 /path/includes/content/WikitextContent.php(374): Parser->parse(string, Title, ParserOptions, boolean, boolean, integer) #17 /path/includes/content/AbstractContent.php(590): WikitextContent->fillParserOutput(Title, integer, ParserOptions, boolean, ParserOutput) #18 /path/includes/Revision/RenderedRevision.php(263): AbstractContent->getParserOutput(Title, integer, ParserOptions, boolean) #19 /path/includes/Revision/RenderedRevision.php(235): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(WikitextContent, boolean) #20 /path/includes/Revision/RevisionRenderer.php(215): MediaWiki\Revision\RenderedRevision->getSlotParserOutput(string) #21 /path/includes/Revision/RevisionRenderer.php(152): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(MediaWiki\Revision\RenderedRevision, array) #22 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(MediaWiki\Revision\RenderedRevision, array) #23 /path/includes/Revision/RenderedRevision.php(197): call_user_func(Closure, MediaWiki\Revision\RenderedRevision, array) #24 /path/includes/poolcounter/PoolWorkArticleView.php(216): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput() #25 /path/includes/poolcounter/PoolCounterWork.php(162): PoolWorkArticleView->doWork() #26 /path/includes/page/Article.php(810): PoolCounterWork->execute() #27 /path/includes/actions/ViewAction.php(74): Article->view() #28 /path/includes/MediaWiki.php(527): ViewAction->show() #29 /path/includes/MediaWiki.php(313): MediaWiki->performAction(Article, Title) #30 /path/includes/MediaWiki.php(940): MediaWiki->performRequest() #31 /path/includes/MediaWiki.php(543): MediaWiki->main() #32 /path/index.php(78): MediaWiki->run() #33 /path/index.php(71): wfIndexMain() #34 {main}
參考update.php failing 1.31 > 1.34 on Project:Support中的說明運行下面的SQL語句來添加一條Dummy數據:
INSERT INTO jingletext(old_id,old_text,old_flags) VALUES (2081061,'Dummy','utf-8');
這樣可以解決。
评论