Automatická změna struktury databáze

Z Freenetis Wiki
Přejít na: navigace, hledání


FreenetIS obsahuje mechanismus pro automatickou změnu struktury databáze. Tyto změny jsou provedeny po spuštění FreenetISu (po otevření v prohlížeči) po jeho aktualizaci (zde nezáleží, zda-li se jedná o aktualizace skrze balíčkovací systém, nebo z vývojářského repozitáře). Provedené změny nelze zrušit, což znamená, že snížení verze (downgrade) FreenetISu není možné (tento jev lze samozřejmě odstranit manuální změnou databáze ze zálohy, při které ovšem nejsme schopni zaručit správnost výsledného stavu sytému).

Mechanismus pro aktualizaci je úzce spjat s verzováním FreenetISu. Ve složce /db_upgrades se nachází soubory se změnami pro jednotlivé verze FreenetISu. Jména souborů jsou ve formátu upgrade_sql_VERZE.php, kde VERZE je nahrazena verzí FreenetISu. Soubory samotné musí obsahovat položku pole $upgrade_sql s indexem daným verzí FreenetISu. Tato položka obsahuje pole SQL příkazů, které jsou postupně spuštěny. Dále může obsahovat PHP funkce spouštěné před a po provedení SQL příkazů, které jsou používané pokud např. nelze data databáze převést mezi jednotlivými verzemi přímo pomocí SQL příkazů. Obě funkce mohou obsahovat libovolné PHP příkazy a musí vracet pravdivostní hodnotu (boolean).

Příklad souboru se změnami:

<?php defined('SYSPATH') or die('No direct script access.');
/*
 * This file is part of open source system FreenetIS
 * and it is released under GPLv3 licence.
 * 
 * More info about licence can be found:
 * http://www.gnu.org/licenses/gpl-3.0.html
 * 
 * More info about project can be found:
 * http://www.freenetis.org/
 * 
 */

/** This upgrade is equal to one in 1.0.0~beta2 developer revision */
$upgrade_equal_to['1.0.0~rc1'] = '1.0.0~beta2'; 

function upgrade_1_0_0_rc1_before()
{
	echo "Some PHP code triggered before processing of all SQL commands"
	return TRUE;
}

$upgrade_sql['1.0.0~rc1'] = array
(
	"ALTER TABLE `ifaces` CHANGE `device_id` `device_id` INT( 11 ) NOT NULL",

	"UPDATE ifaces i, wireless_ifaces wi
	SET wireless_mode = wmode, wireless_antenna = antenna
	WHERE wi.iface_id = i.id",

);

function upgrade_1_0_0_rc1_after()
{
	echo "Some PHP code triggered after processing of all SQL commands"
	return TRUE;
}

Pokud některý z SQL příkazů vyvolá chybu, popřípadě některá funkce vrátí FALSE, je provádění ukončeno a chyba zobrazena uživateli. Při tomto stavu je FreeneIS nefunkční, pokud takový stav nastane, doporučujeme kontaktovat vývojáře a ze zálohy si obnovit poslední fungující verzi databáze (společně se snížením verze FreenetISu).

Aktuální stav databáze

Stav databáze je uchováván v databázové tabulce config v poli db_schema_version, které obsahuje aktuální verzi databáze. Pokud je databáze v chybovém stavu, nepovedený krok je zaznamenán v poli upgrade_midpoint_error. Tato hodnota umožňuje opětovné provedení aktualizace od chybné položky, proto při chybě stačí opravit chybnou položku a znovu spustit FreenetIS v prohlížeči.

Relace mezi změnami

V příkladu se ještě nachází položka $upgrade_equal_to['1.0.0~rc1'], která je používaná pro vývojářské účely. (Při mergi změn z větve do trunku/testingu lze hodnotu tohoto pole vyplnit vývojovou verzí, která obsahovala stejnou sadu příkazů (a funkcí). Pokud se databáze nachází ve stavu vývojové verze a je jí nabídnuta verze, která pomocí tohoto pole odkazuje na vývojovou verzi. Je tato verze přeskočena. Soubor se změnami odkazované verze je v commitu odstraněn!!)

Přechod ze starší verze mechanismu

Starší verze FreeneISu (vývojová verze před vydáním verze 1.0.0) obsahovala starší verzi mechanismu (založenou na SVN revizi). Pokud provádíte čistou instalaci nad novou databází, tento problém se Vás netýká.

Přechod mezi tímto mechanismem lze provest pomocí několika příkazů svn.

1) Otevřte terminál (příkazovou řádku) a přesuňte se do adresáře s instalací FreenetISu, typicky:

$ cd /var/www/freenetis

2) Přejděte na poslední revizi s upgradem databáze před vydání verze 1.0.0

$ svn -r 1559 up

3) Spusťte v prohlížeči FreenetIS a pokud jsou úpravy úspěšně provedeny přejděte na další krok.

4) Přejděte na nejnovější verzi FreenetISu. Nový mechanismus již automaticky rozpozná verzi databáze (starý mechanismus) a provede přechod.

$ svn up

POSLEDNÍ KROK JE OVŠEM NEDOPORUČOVANÝ, JELIKOŽ OD VYDÁNÍ VERZE 1.0.0 SE UPUSTILO OD DISTRIBUCE FREENETISU PROMOCÍ SUBVERSION, PROTO POSLEDNÍ KROK DOPORUČUJEME NAHRADIT PŘEINSTALACÍ FREENETISU Z BALÍČKOVACÍCH SYSTÉMU (data samozřejmě zůstanou zachována, jelikož i při přeinstalaci můžete zvolit Vaši původní databázi).

Bezpečna změna databáze do verze 1.0.0

Do vezre 1.0.0 neobsahoval FreenetIS bezpečnostní pojistky pro výcečetné spuštění upgradu. Tento problém nastavá v případě, že více lidí/služeb přistupují na FreenetIS při upgradu databáze. Následujícím postupem se vyhnete problému při upgradu databáze: (Tento návod se týká FreenetISu do verze 1.0.0, od této verze (včetně) je správný chod zaručen automaticky.)

1) Vypneme všechny služby přistupující k FreenetISu (CRON, přesměrování. QoS, monitoring, ...). Např. CRON na Debianu se vypíná následovně:

/etc/init.d/cron stop

2) Vypneme apache server

/etc/init.d/apache2 stop

3) Provedeme upgrade

wget http://<cesta k vašemu FreenetISu>

4) Spustíme znovu apache a služby

/etc/init.d/apache2 start
/etc/init.d/cron start
...