最近在做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');
这样可以解决。
评论