当前位置

MediaWiki升级报错页面版本找不到

James Qi 在 2021年4月20日 - 09:54 提交

最近在做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');

这样可以解决。

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。