MediaWiki database policy/cs

Tato stránka popisuje oficiální zásady databáze pro kód MediaWiki. Byly schváleny v prosinci 2019 prostřednictvím TechCom RFC procesu na RFC T220056.



Požadavky na databázi

 * Žádný nový kód, který odesílá SQL dotazy z MediaWiki, nesmí generovat žádné varování v přísném režimu MariaDB/MySQL (na RFC T112637).
 * WMF povolí přísný režim MariaDB/MySQL (T108255), který bude stejně výchozí v MySQL 5.7. Před tím musí být kód bez varování.
 * Kód, který se dotýká databáze, musí být kompatibilní s následujícími režimy MySQL SQL:
 * (ekvivalentní )
 * Kód databáze musí být kompatibilní se staršími verzemi databází, jak je uvedeno v Instalačních požadavcích MediaWiki pro databázový server. Vylepšení výkonu, která by se týkala pouze nejnovějších podporovaných verzí (nebo jejich výchozích nebo široce doporučovaných výchozích hodnot), by však měla být upřednostňována před těmi, která se vztahují pouze na nepodporovaná vydání.
 * Je třeba se vyhnout nedeterministickým dotazům a nebezpečným příkazům pro binlog, protože by vracely/zapisovaly jiné výsledky v prostředí replikace. Posledně jmenované lze detekovat jako varování s textem "[Warning] Nebezpečný příkaz zapsaný do binárního protokolu pomocí formátu příkazu od BINLOG_FORMAT = STATEMENT". (Unsafe statement written to the binary log using statement format since) Patří mezi ně  při použití klíče auto_increment,   bez   a použití nedeterministických funkcí jako  . [|Více informací].
 * Je třeba se vyhnout nedeterministickým dotazům a nebezpečným příkazům pro binlog, protože by vracely/zapisovaly jiné výsledky v prostředí replikace. Posledně jmenované lze detekovat jako varování s textem "[Warning] Nebezpečný příkaz zapsaný do binárního protokolu pomocí formátu příkazu od BINLOG_FORMAT = STATEMENT". (Unsafe statement written to the binary log using statement format since) Patří mezi ně  při použití klíče auto_increment,   bez   a použití nedeterministických funkcí jako  . [|Více informací].



Změny schématu

 * Všechny nové tabulky musí mít primární klíč. Pokud nelze vytvořit kandidáta na primární klíč (například pokud se všechny sloupce mohou opakovat), je třeba přidat samostatný sloupec auto_increment nebo jiné libovolné pole (v závislosti na velikosti písmen).
 * Primární klíče a pole, která na ně odkazují, by měly být unsigned, aby se zvýšily [maximální hodnoty https://dev.mysql.com/doc/refman/5.6/en/integer-types.html].
 * Všechny tabulky v jádru MediaWiki a rozšíření nasazená na Wikimedii a MediaWiki-bundled musí být implementovány pomocí systému abstraktních schémat a nové změny schémat v nich musí být generovány automaticky.



Kompatibilita změn schématu
Změny schématu musí poskytovat cestu pro aktualizaci ze všech verzí ze dvou verzí LTS dříve (viz T259771).



Záplaty databáze
Pokud změníte schéma databáze, postupujte podle těchto pravidel:


 * Aktualizování instalačního programu – Aktualizujte  a přidejte příslušný opravný soubor SQL do  . Konvence pojmenování, pokud přidáváte pole, je  . Pokud odebíráte pole, je to  . Pokud přidáváte tabulku, je to  . Podívejte se na historii odevzdání , abyste našli příklady, jak se to dělá. Pokud do stejné tabulky přidáváte spoustu polí, proveďte všechny tyto změny v jednom dotazu v jednom záplatovém souboru.
 * Vytvoření změny schématu volitelnou – Všechny změny schématu musí projít obdobím, kdy jsou nepovinné. Příklady použití:
 * Namísto změny formátu sloupce vytvořte nový sloupec, proveďte všechny zápisy do starého a nového sloupce (pokud existuje) a ukončete používání starého sloupce. Než budete slepě předpokládat, že ano, zkontrolujte, zda nový sloupec existuje. Podporu pro starý sloupec zrušte až poté, co bude jasné, že migrace schématu byla dokončena, a není šance, že se budeme muset vrátit ke staré verzi softwaru. Pokud se vám to nezdá proveditelné, pošlete e-mail na Wikitech-l s žádostí o radu.
 * You could set your new feature to only work if a config option is set to true, and set the option to false by default. Then the commit can be safely deployed before the schema change is made. To deploy your feature to the Wikimedia cluster, file a ticket in Phabricator in the relevant project with the  tag. Once you've confirmed the change has been made, you can remove the config option to enable your feature.
 * Note that this means your schema change should be optional in code - for wikimedia deployments, it is expected that every wiki with the relevant database table(s) will have the schema change applied to them. If you need different schema for different wikis, then apply the change using an extension and creating new tables dependent on that extension.

There might be cases where the "make your schema change optional" rule will be prohibitive from a performance or logistics perspective. However, schema changes like that should be rare to begin with, and should have prominent discussion on the wikitech-l mailing list. In the case where it is impossible to make your schema change optional, it is still critical to write scripts to roll back to the pre-change state.


 * Search for input from a WMF Database Administrator – MediaWiki is deployed to Wikimedia websites every week, and it takes considerable planning to apply schema changes to MySQL-based sites the size of Wikipedia. Jaime Crespo (jcrespo on LDAP, jynus on irc) and Manuel (Arostegui, marostegui) are the best people to add to database reviews. In most cases, input is just needed on the logistics of the change.
 * Test your changes on Beta - in particular, it is a common mistake to change indexes and column definitions that would result in different query plans. Try to test the generated queries' plan with tools such as EXPLAIN; not doing so could mean that, when scaled to production, queries that only take 1 second locally, they pileup on production when they receive much more traffic and have larger tables.