手册:共享数据库
本页简要概述了如何在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 包含 user
和 user_properties
表。
For wikis first created after MediaWiki 1.35, it also includes the actor
table.
数据库权限
共享 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 从主表读取用户,并更新表。
共享会话
要在您的 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 轻松管理它们的扩展。