手册:共享数据库

This page is a translated version of the page Manual:Shared database and the translation is 82% 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

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

<span id="The_simplest_setup:_A_shared_user_table">

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

共享用户表可用于拥有多个共享用户注册的 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 包含 useruser_properties 表。 For wikis first created after MediaWiki 1.35, it also includes the actor table.

如果您有两个 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') 或在新数组定义中包含用户表。

<span id="The_ipblocks_table">

ipblocks

$wgSharedTables[] = 'ipblocks';

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

注意事项

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

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

<span id="The_user_groups_table">

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 轻松管理它们的扩展。