This page is a translated version of the page Manual:Upgrading and the translation is 100% complete.

概要

文件传输

選擇一種文件传输的方法:

初步措施

閱讀包含在MediaWiki中的UPGRADE文件

  1. 檢查需求
  2. 阅读RELEASE-NOTES文件
  3. 阅读UPGRADE文件
  4. 備份現有文件和数据库
  5. 解壓新文件
  6. 升级扩展
  7. 運行更新程式以檢查資料庫
  8. 測試更新
  9. 从旧安装中删除剩余文件

檢查需求

  警告: 从1.32至1.35.4、1.36.2及1.37.0的MediaWiki版本包含安全漏洞,能允许绕过权限限制编辑任意页面和执行任意代码。 如果您正在使用这些版本但无法更新至新版本,请参见2021-12安全发布/常见问题解答 以获取解决方案。

MediaWiki 1.42需求:

  • PHP 8.1.0+
  • 满足以下条件之一:
    • MariaDB 10.3.0+
    • MySQL 5.7.0+
    • PostgreSQL 10.0+
    • SQLite 3.8.0+
MediaWiki 1.36 起,MediaWiki 仅支持从两个长期支持(LTS)版本前或更新的版本升级到当前版本。(另请参阅 phab:T259771) 从更老版本的 MediaWiki 升级至新版本需要分步进行。 例如从 1.34 或更早的版本升级到 1.42 时,首先要升级到1.35 (或 1.39),然后从 1.35 (或 1.39) 升级到 1.42。

如果您在使用PostgreSQL,請同時閱讀Manual:Upgrading Postgres

更多資訊請閱讀Manual:安装要求 兼容性

閱讀發行版本說明

在分發的壓縮檔内,或是在Git的檔案檢出/匯出的文件中,有一些檔案的檔名為大寫字母,其中之個包含了RELEASE-NOTESwiki)。 現在打開它,並看看這個版本改變了些什麼。 您还应该阅读UPGRADE文件中的说明。

清空待处理的作业

出于性能原因,数据库中的某些操作被延迟,并由作业队列管理。 这些作业存储在数据库中,并包含有关应执行的操作的信息参数。 强烈建议在升级wiki前运行这些待处理的作业,以避免这些参数在新版本中发生变化而失败。 在执行升级前,可使用runJobs.php 运行所有挂起的作业并清除队列。

備份現有文件和数据库

完整說明: 手册:备份一个维基

虽然升级脚本维护良好且功能强大,但仍可能出错。在更新数据库之前,请对wiki进行一个完整备份,包括数据库和文件:

  • wiki的内容,来自数据库,(确保正确指定了字符集,首先检查LocalSettings.php)。除了SQL数据库转储之外,创建XML转储可能是个好主意。
  • MySQL,SQL转储和XML转储都与mysql命令一起使用:
mysqldump --user=wikidb_user --password=wikidb_userpassword wikidb > file.sql
mysqldump --user=wikidb_user --password=wikidb_userpassword wikidb --xml > file.xml
  • PostgreSQL,用于pg_restore命令的数据库转储:
pg_dump --create -Fc wikidb > file.db.dump
  • SQLite,您使用MediaWiki脚本进行备份:
php wikifolder/maintenance/SqliteMaintenance.php --backup-to file
  • 图片和其他媒体文件(images目录下的内容,自定义logo /skins/common/images/wiki.png)
  • 配置文件,例如:LocalSettings.php.htaccess(若存在)
  • MediaWiki的程序文件,包括所有的皮肤和扩展,特别是如果您修改了它们。

解压新文件

使用tarball打包

您可以通过FTP或者是命令行来放置新文件。若您可以使用命令行,请使用命令行。使用命令行要比使用FTP将数千个文件逐个上传要快得多。

您应该将解压后的文件放到服务器上的一个新的空文件夹内。如果您直接在旧版本的目录中解压了新版本的文件,而不是在新文件夹中解压,您应遵循在备份现有文件和数据库章节的说明。否则,如果您做的自定义改动将被抹掉,而无法重新应用它们。 在MediaWiki的实时副本顶部提取tarball也可能遗留旧版MediaWiki中可能会干扰升级代码的文件。建议您将新文件解压缩到新目录中,然后将自定义应用于新目录(还原LocalSettings.php,图像文件夹,扩展和其他自定义项,如自定义外观)

FTP或图形界面

如果您不能够在服务器上访问命令行,下载MediaWiki tarball 到您的本地计算机并使用7zip解压该文件到本地计算机上。

在本地解压该文件后,使用您喜爱的FTP客户端软件上传目录和文件到服务器上。

cPanel 文件管理器

cPanel 是许多Web主机提供的流行管理界面。 这种方法很有效,因为这些文件在服务器上本身是未经压缩的。

  • 请进入到包含您的wiki文件夹的目录。
  • 上传mediawiki-1.xx.x.tar.gz文件。 您可能需要点击“重新加载”才能看到它。
  • 解压mediawiki-1.xx.x.tar.gz 再次重新加载
  • 确认mediawiki-1.xx.x文件夹是否存在。
  • 删除tar.gz文件。
  • 将所有必要的皮肤、扩展、图像文件夹、自定义内容以及LocalSettings.php复制到新文件夹中。 (参见下方)
  • 当您准备好运行update.php时,请重命名您的旧wiki文件夹和新wiki文件夹。 (例如,“w”变成“w1.34”,然后“mediawiki1.35.0”变成“w”。) 如果遇到问题,此步骤将更容易帮助您恢复。

命令行

若您当前用户下对Wiki安装目录没有完全的写入权限,则可能需要以sudo身份运行该命令。 在解压缩tar包时,通常会为新的Wiki版本创建一个新的目录,您需要从旧安装目录中复制之前配置文件和媒体文件目录:

cd /path/to/your/new/installation/ wget https://releases.wikimedia.org/mediawiki/1.42/mediawiki-1.42.4.tar.gz tar xvzf mediawiki-1.42.4.tar.gz rm mediawiki-1.42.4.tar.gz

(Open)Solaris用户应使用gtar,或:

$ gzip -dc mediawiki-1.42.4.tar.gz | tar xf -

其他文件

在解压压缩包后,您应该从旧安装目录中复制或者移动一些文件和文件到新安装目录下:

  • LocalSettings.php - 文件包含了您旧的配置设置。
  • images(或在旧版本中uploads)目录,包含所有上传至wiki的文件,除非您已选择不同的上传目录,并更改所有权和权限。find ./images -type d -exec chmod 755 {} \;chgrp -R apache images(例如如果您的web用户是“apache”)。
  • extensions目录下的扩展。您应该一直更新扩展,旧扩展不能够保证在新版本的MediaWiki下工作。
  • 如果您使用了自定义logo,则还需要从备份中恢复该文件。在1.24版本之前logo通常在skins/common/images/ 目录下。在1.24版本之后logo通常在resources/assets/images/ 目录下,取决于您选择使用的目录。 之后在LocalSettings.php文件中添加,例如 $wgLogo = "$wgScriptPath/images/logo.png";
  • 对于1.35版本,您可能需要将logo从wgLogos 恢复。 然后添加到LocalSettings.php,例如$wgLogos = [ '1x' => "path/to/1x_version.png", '2x' => "path/to/2x_version.png", 'svg' => "path/to/svg_version.svg" ];
  • skins 目录下的自定义皮肤。
  • 对旧安装文件或扩展所做的任何修改。
  • 任何 .htaccess 文件(若您使用Apache并定义了规则)。

一旦完成,将这个新文件夹设为Web服务器上的发布文件夹。或者将旧安装目录重命名,然后将新文件夹重命名为先前的旧安装目录的名字。 更改所有文件的所有者和组,以便Web服务器可以访问这些文件。

使用Git

如果使用Git ,请将文件导出到干净的位置,然后将旧的自定义文件复制到新位置,如上一节中所述。

您還需要使用Composer或为维基媒体wiki场维护的提供的集合安装一些外部PHP库。 有關安裝和更新外部庫的更多詳細信息,請參見Git下載文檔

使用补丁

通常可以使用小补丁文件进行次要版本升级。 您需要下载补丁才能使用它。 从转存文件手动下载并解压缩补丁文件,或按照下面wget的说明进行操作。 补丁是增量的,你不能跳过版本。

  1. cd定位到您MediaWiki的主目录下(存有LocalSettings.php文件的目录)
  2. 下载补丁文件,并用gunzip命令解压它。
  3. 使用patch -p1 --dry-run检查什么被修改了(例如patch -p1 --dry-run -i mediawiki-x.xx.x.patch
  4. 如果一切顺利,再次运行patch而不用--dry-run
  5. 检查您的Special:Version,您应该看到新的版本号。

可能导致错误的剩余文件

如果在旧安装目录上解压缩,则某些旧文件可能会导致新版本出现问题。

升級擴充功能

某些扩展已更新,以便使用新版本的MediaWiki。请务必升级到此类扩展的最新版本。您可能需要对自定义扩展程序执行手动更新。

不同的tarballs包含一些扩展子集,并具有版本控制功能,可帮助您升级为MediaWiki核心版本选择正确的版本。

Extension Distributor适用于大多数想要使用支持的MediaWiki版本的扩展快照的人。

如果你想要很多扩展,那么从Git下载可能是最好的。 如果您没有Git但想要升级大量扩展,可以考虑使用mwExtUpgrader

<span id="Adapt_your_LocalSettings.php">

修改 LocalSettings.php 文件

如果你使用来自旧版本的LocalSettings.php文件,你可能需要修改这个文件使其能够在新版本上使用。

皮肤注册

MediaWiki版本:
1.24

从MediaWiki 1.24版本开始Vector,Monobook,Modern和CologneBlue等捆绑的皮肤不再是MediaWiki核心的一部分,使用这些皮肤需要在LocalSettings.php中注册,否则MediaWiki会向你提示没有安装这些皮肤。

若您希望这些皮肤可用,这是您升级到1.24版本后需要添加到LocalSettings.php的内容:

wfLoadSkin( 'Vector' );
wfLoadSkin( 'MonoBook' );
wfLoadSkin( 'Modern' );
wfLoadSkin( 'CologneBlue' );

其他皮肤可能并不适应新的皮肤注册系统,所以请参阅有关每个皮肤的文档页面,了解如何在遇到问题时正确地注册它。

扩展注册

MediaWiki版本:
1.25

从MediaWiki 1.25版开始,扩展使用新的扩展注册系统。

您之前的LocalSettings.php会包含这些内容:

require_once "$IP/extensions/Cite/Cite.php";
require_once "$IP/extensions/Gadgets/Gadgets.php";
require_once "$IP/extensions/ImageMap/ImageMap.php";
require_once "$IP/extensions/InputBox/InputBox.php";
require_once "$IP/extensions/Nuke/Nuke.php";
require_once "$IP/extensions/ParserFunctions/ParserFunctions.php";
require_once "$IP/extensions/Poem/Poem.php";
require_once "$IP/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php";
require_once "$IP/extensions/WikiEditor/WikiEditor.php";

这些可以转换为:

wfLoadExtension( 'Cite' );
wfLoadExtension( 'Gadgets' );
wfLoadExtension( 'ImageMap' );
wfLoadExtension( 'InputBox' );
wfLoadExtension( 'Nuke' );
wfLoadExtension( 'ParserFunctions' );
wfLoadExtension( 'Poem' );
wfLoadExtension( 'SyntaxHighlight_GeSHi' );
wfLoadExtension( 'WikiEditor' );

扩展正在适应使用新的扩展注册系统。 未经调整的扩展应使用旧的安装方式。 有关详细信息,请参阅扩展页面上的安装说明。

删除DefaultSettings.php行(如有必要)

较旧版本的MediaWiki会自动生成一行代码,其中LocalSettings.php调用了DefaultSettings.php 。 从1.38版本开始,这行代码被弃用了,并且无法与许多扩展程序一起工作。 需要将其移除。

删除以下行:

require_once( "$IP/includes/DefaultSettings.php" );

Remove RenameUser from LocalSettings.php

If you are upgrading to 1.40 or above, Extension:RenameUser has been merged into core. If present, this line must be deleted from LocalSettings.php or the update will fail.

wfLoadExtension( 'Renameuser' );

其他变量

一些变量可能已过时,或甚至被移除。 将它们放在LocalSettings.php中通常不会有任何影响。 可以在较新版本中添加新变量,或者某些现有变量更改其类型。 我们通常会尝试为它们使用合理的默认值,并且在类型更改的情况下,向后兼容。 无论如何,请查看发行说明以查看这些更改。

运行更新脚本

您可以通过两种方式升级MediaWiki数据库:从命令行或从Web浏览器升级。如果您具有对服务器的shell访问权限,则建议从命令行进行升级,因为这样可以降低升级过程因超时或连接重置而中断的风险。

该脚本还会在MediaWiki核心的PHP依赖过时的时候通知您。

命令行

访问您的服务器命令行,或使用SSH Shell或类似工具。您可以通过SSH连接到服务器以访问命令行。所有主流操作系统的当前版本(包括Windows 10和11)默认包含命令行OpenSSH客户端,或者会将其作为可安装功能提供。如果您使用的本地计算机运行的是Microsoft Windows,您可能需要(如果是Windows 8.1或更早版本,则必须)安装PuTTY,它具有类似向导的界面(或类似工具)。在命令行或Shell中,执行更新脚本

MediaWiki版本:
1.40
$ php maintenance/run.php update.php
MediaWiki版本:
1.39
$ php maintenance/update.php

在Linux服务器上,如果出现错误,请尝试执行相同的命令(使用"sudo"命令)。 注意當您於Windows進行簡易安裝(例如:XAMPP ): 首先確定網路伺服器(例如:Apache)和資料庫(例如:MySQL)正在運行。 然后执行update.php:右键它,选中Open With,接着浏览到PHP.exe。 当模升级完成时,命令提示符窗口可能会自动关闭。

MediaWiki将检查现有架构并更新它以使用新代码,根据需要添加表和列。

如果使用共享数据库,则应该传递--doshared参数(如果要更新共享表)。否则更新脚本不会触及它们。

What to do if it says "MediaWiki requires PHP x.y.z or higher; you are using PHP x.w.v"

See Manual:Common errors and symptoms#MediaWiki requires PHP 7.4.3 or higher; you are using PHP 7.3.17

如果 php update.php 失败,没有任何反应,只是很快就返回了命令提示符,应该怎么办?

这可能是由于扩展或皮肤故障引起的。

  • 检查LocalSettings.php中所需的所有扩展和皮肤是否存在。
  • 检查扩展是否使用了正确的注册方法(wfLoadExtension 与 require_once)
  • 注释掉 LocalSettings.php 中前一半的扩展。 如果这使得 update.php 起作用,取消注释其中一半的一半(即 1/4 的扩展)。 如果这无法使得 update.php 生效,取消第一部分的注释但是注释掉第二部分,然后注释掉第二部分的一半,以此类推。 重复操作直到找到导致update.php无法工作的问题所在。

当发生“ALTER命令对用户拒绝”错误(或类似错误)时应做什么

如果脚本中止了类似于以下的消息:

Error: 1142 ALTER command denied to user 'wiki'@'localhost' for table 'mytable' (localhost)
ERROR: must be the owner of the mytable relation 

这意味着您应该检查是否在$l文件中(在主目录中)定义了$wgDBadminpassword LocalSettings.php 。这些是此脚本访问数据库所需的用户和密码。

在某些情况下,即使使用了MySQL,似乎也会读取旧的$wgDBmwschema变量(对于Postgres)以更新表名而不是$wgDBname。 如果是这种情况,只需删除LocalSettings.php中的$wgDBmwschema定义。

当发生“register_argc_argv被设定为假”错误时应做什么

您可能遭遇这样的错误:

Cannot get command line arguments, register_argc_argv is set to false
  1. 转到〜/维护。编辑现有的'php.ini'文件,或创建一个。
  2. 添加下面一行:
register_argc_argv=true
  1. 重新运行php update.php

Web浏览器

MediaWiki版本:
1.17
参见update.php

如果您的数据库已经很大并且生产率很高,那么您不应该使用Web更新程序,例如因为当达到maximum_execution_time时,更新过程将超时。在这种情况下,您应该使用命令行界面中的update.php(而不是来自Web)。究竟什么“太大”取决于您的服务器(例如,它的性能,负载以及PHP的最大执行时间允许脚本运行多长时间)。如果您的wiki对于Web更新程序来说太大而您的托管服务提供商不允许命令行访问,那么您需要将您的wiki迁移到另一个托管帐户,最好是具有shell访问权限的托管帐户。

  1. 在执行数据库维护之前始终备份

将您的浏览器导航到/mw-config/index.php。 例如,如果您的维基在http://example.org/w/index.php,那么请导航到http://example.org/w/mw-config/index.php

  1. 选择您的语言并点击继续。
  2. 应检测现有安装。按照屏幕上的说明进行升级。
    如果要求提供升级密钥,请打开LocalSettings.php 文件并查找分配给$wgUpgradeKey 的密钥。

可能会发生Web更新程序似乎不起作用:您可能会看到一个空的Wiki页面,而不是看到初始语言选择屏幕,可能会显示一些错误消息。在这种情况下,您的网络服务器很可能使用重写规则(最有可能是短网址),它们不会在mw-config/显示更新程序,而是一个维基页面 Mw-config/,大写“M”。在这种情况下,请在更新时重命名“.htaccess”文件。然后,您应该能够访问Web更新程序。

  警告: 如果您使用此方法,请确保在运行升级脚本后更改.htaccess文件的名称! 否则短URL和可能的其他东西将被破坏!

测试更新

升级完成后,浏览到Wiki并检查以下操作是否按预期工作:

  • 查看页面
  • 编辑页面
  • 上传文件
  • 访问Special:Version并检查显示的版本是否正确以及扩展名是否存在。

从旧安装中删除剩余文件

如果您将先前安装的内容复制到服务器另一个文件夹,请确保其已删除或者不能通过web端访问。 重要的是不要让旧的安装程序可被web端访问,因为它完全破坏了升级的目的也让您的服务器易受到攻击。

常见问题

更新有多难?

如果您修改的唯一文件是LocalSettings.php ,并且您要从1.5或更高版本升级,则该过程非常简单。涉及的人力工作量只有几分钟。数据库架构更改将花费与数据库大小成比例的时间,对于具有数百万页的wiki而言可能需要数小时,但对于几千页的更典型大小,通常在几秒钟内完成。

在相同的主版本中進行的次要升級(例如,從1.41.0升級到1.41.5)不需要任何架構更改。 您可以只更新文件。数据库不需要更新,因此不需要运行更新脚本。

从1.4或更早版本升级可能很复杂,因为删除了对UTF-8以外的字符集的支持,并且用于存储批量文本的架构已更改。请阅读UPGRADE文件中的相关部分。

如果您修改了源代码,并且不希望覆盖您的更改,则升级变得困难。diffpatchMeldWinMerge等工具可能很有用。如果您使用的是非维护扩展,也可能会出现问题。在升级MediaWiki的同时升级扩展程序。

如果您修改了皮肤或使用自定义皮肤,则很可能需要使用新版本的MediaWiki将其调整为再次使用。

每次只需将代码添加到MediaWiki:Common.js和MediaWiki:Common.css页面,而不是修补“全局”css和js(JavaScript)文件。由于这些是升级时将重用的数据库的一部分,因此您不必再修补MediaWiki核心文件。

我如何从一个非常老的版本升级?只需一步还是需要很多步?

MediaWiki版本:
1.4

这取决于:如果您要从MediaWiki 1.4或更早版本升级,则应首先升级到MediaWiki 1.5。 如果您要从Latin-1 wiki升级,请使用upgrade1_5.php(在MediaWiki 1.5中找到)将数据库的相关部分转换为UTF-8($wgUseLatin1 需要在LocalSettings.php 中设置为true才能使其工作)。 接下来,运行update.php,然后将LocalSettings.php中的$wgLegacyEncoding 选项设置为wiki先前使用的编码(例如windows-1252)。这基本上是维基百科和其他维基媒体基金会网站从MediaWiki 1.4升级到1.5的方式,请参阅Wikitech的相关注释。 在运行upgrade1.5脚本之前,您可能需要升级到MediaWiki 1.4。 如果要创建Latin-1 wiki的数据库转储(例如MySQL),请确保text 表中old_text字段的类型为mediumblob,而不是mediumtext,以避免字符编码问题。

MediaWiki版本:
1.5 – 1.35

如果您要从MediaWiki 1.5或更新版本升级到1.35,则可以一步升级,从旧版本升级到最新稳定版本。 绝大多数报告以及自动化测试表明,一步完成这项工作就可以了。 如果您无法相信,请阅读此邮件列表帖子。 但请注意,从旧版本更新时,您遇到PHP错误的可能性比从新版本之前的版本升级时更大。 如果您没有跳过版本,无论如何您都会收到这些错误,但这些错误会与每个单独的更新相关联。 相反,如果您同时更新几个版本,您会一次性收到同样的一组错误。 这将使升级更加困难,但不要忘记您没有更新到您跳过的中间版本的麻烦!

MediaWiki版本:
1.35

如果您是升级到MediaWiki 1.36或更高版本,则仅支持从最近的两个LTS版本升级(phab:T259771)。这意味着对于非常旧的版本,您首先升级到MediaWiki 1.35,然后升级到1.36。

我是否应该首先备份?

一个字:是。

答案很长:这取决于①您对数据的重视程度②创建备份的难度以及③您对MySQL维护和管理的信心。

升级失败可能会使您的数据库处于两个版本之间的不一致状态。 升级期间可能会发生PHP或MySQL错误,导致数据库部分升级。 在这种情况下,有可能通过大量的手工工作以某种方式解决这个问题。 但是,在运行update.php之前放置数据库备份并继续使用它会“更容易”。 否则你可能需要数小时不必要的工作。

恢复通常很复杂。 如果您忽略了备份,然后需要帮助来从与升级相关的损坏中恢复,那么支持论坛上的志愿者不太可能留下深刻的印象。 更好的结果是,如果您可以恢复备份,然后在升级过程中报告相应的MediaWiki项目的错误导致损坏。

<span id="Can_I_keep_my_LocalSettings.php?">

我可以保留我的LocalSettings.php么?

是的,但您可能需要做一些小改动。LocalSettings.php 的格式在很大程度上是向后兼容的。 破坏LocalSettings.php兼容性的更改将记录在发行说明的“配置更改”部分中。

我的wiki可以在更新时保持在线么?

一般来说是的,但如果您是通过Git升级的,Git可能暂时会(几秒钟)打断它。

如果要在MediaWiki的次要版本之间进行升级,您只需更新源文件即可。

注意:以下假定您具有命令行访问权限。如果要在MediaWiki的主要版本之间进行升级,则首选过程如下:

  1. 将新版MediaWiki解压缩到新目录中
  2. 准备新目录:从旧目录复制当前的LocalSettings.php,复制任何已安装的扩展和自定义外观(如果有)。 检查LocalSettings.php中的$wgLogo $wgLogos 设定,如有必要,将Logo文件从旧目录复制到新目录。
  3. 在新版本的发行说明中,查看是否需要对LocalSettings.php进行任何更改。
  4. 在旧目录下,编辑LocalSettings.php并插入以下代码。 这将使数据库在常规维基活动中处于只读模式,而不会限制您自己的更新操作。 如果用户在升级过程中尝试编辑,就会看到所提供的信息:
    $adminTask = ( PHP_SAPI === 'cli' || defined( 'MEDIAWIKI_INSTALL' ) );
    $wgReadOnly = $adminTask ? false : 'Upgrading to MediaWiki 1.42.4';
  5. 在新目录中运行升级脚本或Web更新程序。
  6. 将images子目录中的映像从旧目录复制到新目录。
  7. 交换旧目录和新目录。 (这将使数据库重新可写,因为 $wgReadOnly 只设置在旧目录的 LocalSettings.php 中)。

为什么升级?

订阅mediawiki-announce以获取新发行版本的通知。

最新版本接收安全修复程序,以保护您的wiki和您的主机免受破坏者的攻击,而旧版本则不会(请参阅版本生命周期 )。

新的主要版本附带了您可能想要使用的新功能:有关详细信息,请参阅发行说明

参见