手册:共享数据库

This page is a translated version of the page Manual:Shared database and the translation is 97% complete.
Outdated translations are marked like this.

本页简要概述了如何在MediaWiki中使用共享数据库。 此处的大部分信息应该适用于 MediaWiki 的简单安装(不包含扩展)。 任何扩展要求都会被注明。 注意这是围绕 MySQL 数据库设计的。 MediaWiki 1.17 中添加了对 SQLite 的支持。 MediaWiki 1.19 中添加了对 PostgreSQL 的支持。 其他数据库可能不支持这种共享数据库方式。

小心! 小心: 本文档假定您从头开始创建 wiki,或者从一个 wiki 过渡到多个 wiki。 这个不包括“合并”用户表或使用 CentralAuth 的维基媒体基金会项目方式的设置(具有全局用户表和本地用户表)。
小心! 小心: Renameuser is currently incompatible with $wgSharedDB. See phab:T104830.

基础用法

共享数据库在您的 LocalSettings.php 中配置了 3 个主要的全局 Configuration variables

根据您的需求和环境,您可能不需要使用所有这些变量。

最简单的设置:共享用户表

共享用户表可用于拥有多个共享用户注册的 wiki,因此用户只需注册一个 wiki。

$wgSharedDB = 'mainwiki'; # The $wgDBname for the wiki database holding the main user table
$wgSharedTables[] = 'actor';
$wgSharedPrefix = 'm_'; # The $wgDBprefix for the database. Defaults to the prefix of the current wiki if not specified

默认情况下,$wgSharedTables 包含 user 和 user_properties 表。 向其中添加'actor'是 计划内容

如果您有两个 wiki,并且您在两个 wiki 上创建不同的用户,在此之后才开始共享actor table,那么事件过程就会中断,因为在本地actor table中引用的用户 ID 与在共享actor 中引用的用户 ID 不同。 这最终会以或多或少微妙的方式在许多地方造成混乱和数据损坏。 Unfortunately, there is also a bug that breaks login for new users on wikis with shared user tables but separate actor tables. 建议:出于上述原因,建议在创建新 wiki 后立即共享表(尤其是用户表)。 在创建任何用户或进行编辑之前。

数据库权限

共享 wiki 的 MySQL 用户必须至少具有主 wiki 用户表的 SELECT 和 UPDATE 权限。 如果您为每个 wiki 使用不同的 MySQL 用户,您将需要按照该 wiki 的 $wgDBuser 设置中的指定向共享 wiki 用户授予额外的权限。 For those who use shared hosting, note that this is possible at some but not all providers. 这可以使用类似于以下的 MySQL 命令执行:

grant select, update on mainwiki.user to 'sharedwikiuser'@'localhost';
grant select, update on mainwiki.user_properties to 'sharedwikiuser'@'localhost';

当用户登录时,允许您的 wiki 从主表读取用户,并更新表。

共享会话

有关 MediaWiki 1.27 及更高版本中会话的最新信息,请参阅 SessionManager and AuthManager

要在您的 wiki 之间共享登录会话,请设置 $wgCookieDomain 以包括您的根域下的所有子域。 例如,如果您有网站 en.example.com、​fr.example.com和pool.example.com,请设置:

$wgCookieDomain = '.example.com';

升级

从 MediaWiki 1.21 开始,当从 web 安装程序 升级 MediaWiki 时,必须在升级期间从 LocalSettings.php 中临时移除 $wgSharedTables。 否则,共享表根本不会被触发($wgSharedPrefix 的表和 $wgDBprefix 的表都没有),这可能导致升级失败。

从命令行升级时,运行 update.php 脚本,您需要使用脚本的 --doshared 参数来升级共享表。

在 MediaWiki 1.24 中,MediaWiki 的默认密码类型已从 MD5 更改为 PBKDF2,并且密码哈希将在用户登录时自动更新。 为防止在所有 wiki 升级之前发生这种情况,请将所有 wiki 上的 $wgPasswordDefault 设置为 'B',并在所有 wiki 升级后将其删除,以确保使用更复杂的加密。

共享更多表格

您可以共享用户表以外的表,但请小心操作。 如果表格包含特定于某个 wiki 的任何数据,则共享可能会出现问题。 请注意,此处的每个小节都假定您还共享用户表。 每当添加其他表时,请务必附加到数组 ($var[] = 'value') 或在新数组定义中包含用户表。

ipblocks表

$wgSharedTables[] = 'ipblocks';

通过共享 ipblocks 表,您可以用“全域封禁”使一个 wiki 中的封禁同时作用于其它使用共享数据库的 wiki。

注意事项

共享 ipblocks 表时可能会出现一些小问题:

  • 封禁用户时,ipb_reason 字段被设置为 Special:Block 上的“原因”。 当被封禁的用户看到“您已被封禁”消息时,这个原因将解析为 wikitext,并且链接在 Special:BlockList 上也会解析,您需要确保在封禁用户时该原因在所有 wiki 上都有意义。
  • 封禁日志不会被共享(不推荐共享 logging 表)。

user_groups表

$wgSharedTables[] = 'user_groups';

共享 user_groups 表将允许您拥有全局用户组。

注意事项

  • 与阻止日志一样,用户权限日志不共享。
  • All 用户组将是全局的。 您可以通过自定义用户组来解决这个问题。 例如,要将一个 wiki 上的管理员与另一个 wiki 上的管理员分开,您可以执行以下操作:
在 wiki 1 的配置中
$wgGroupPermissions['wiki1_admin'] = $wgGroupPermissions['sysop']; // Copy the default sysop permissions to the new group
unset($wgGroupPermissions['sysop']); // Then remove the default sysop group
$wgGroupPermissions['wiki2_admin'] = array(); // Don't give admins from other wikis any extra rights
在 wiki 2 的配置中
$wgGroupPermissions['wiki2_admin'] = $wgGroupPermissions['sysop'];
unset($wgGroupPermissions['sysop']);
$wgGroupPermissions['wiki1_admin'] = array();
  • 为了防止一个 wiki 上的行政员在其他 wiki 上分配他们不应该拥有的权限,您可以进行与上述类似的配置,但删除允许他们设置任何组的“用户权限”权限,并使用 $wgAddGroups /$wgRemoveGroups 代替。

其它表

本节涵盖了其他共享原因不太常见的表,以及哪些表“不能”共享。

  • interwiki 表包含的多为静态数据;如果您有许多自定义跨维基,共享可能会很有用。
  • 可以共享 site_stats 表以汇总所有 wiki 上的数据。
  • 默认情况下,user_properties 表包含在共享表列表中。 如果您的 wiki 是使用 MediaWiki 1.15 或更早版本开始的,您可能应该保留它以实现向后兼容性,因为用户偏好会自动从 user 表自动迁移到 user_properties 表。 否则,您可以从数组中删除它,以允许用户在每个 wiki 上拥有不同的个性设置(如果需要)

大多数其他表格不应共享,因为它们包含特定于 wiki 的数据,通常通过 pageid 或命名空间/标题组合连接到页面。 这包括(但不限于):

  • 任何链接表(pagelinks、​templatelinks 等)
  • page表
  • revision表
  • image 表(要拥有共享媒体存储库,请参阅 $wgForeignFileRepos

有关详细信息,请参阅Manual:Suitability of tables for sharing

另见

  • Extension:中央认证 - 共享用户表的另一种方法。 由 Wikimedia 使用,可能是合并已建立的 wiki 的最简单选择。
  • Extension:GlobalBlocking - 允许在全域范围内封禁 IP 地址而不共享其他数据库的扩展。 全域封禁用户的权限与普通的“封禁”权限是分开的。
  • Extension:GlobalUserrights - 一个启用全域用户组并允许通过 Special:GlobalUserrights 轻松管理它们的扩展。