MySQL a PostgreSQL: Jak na migraci bez ztráty dat

Aus Rettungsdienst-Wiki
Zur Navigation springen Zur Suche springen

Po importu přichází fáze validace. Porovnejte počty záznamů v každé tabulce, ale také agregace, jako jsou součty nebo průměry. Typickou chybou je přehlédnutí rozdílu v chování při porovnávání řetězců. MySQL porovnává bez ohledu na velikost písmen (pokud není nastaveno jinak), zatímco PostgreSQL je case-sensitive. Proto se může stát, že duplicitní záznamy, které v MySQL existovaly, najednou v PostgreSQL selžou na unikátním indexu. Předem si proto projděte sloupce s textovými hodnotami a případně použijte CITEXT nebo lowercase indexy.

Při psaní chybového hlášení se vyvarujte obecných formulací typu „to nefunguje". Konkrétně popište kroky, které jste provedli, a to včetně vstupních dat. Uveďte, na jakém zařízení a v jakém prohlížeči jste pracovali. Přidejte očekávaný výsledek a skutečný výsledek. Tímto způsobem prokážete, že rozumíte struktuře hlášení, což je častý požadavek i na juniorské pozice.

Myslete také na server. Pokud máte sdílený hosting a web navštěvuje víc lidí najednou, může být odezva pomalá. Zkuste si změřit dobu odezvy serveru pomocí jednoduchého testu. Pokud je vyšší než 200 milisekund, zvažte upgrade na VPS nebo optimalizaci databáze. U redakčních systémů často pomůže zapnutí cache. Ta uloží hotové stránky a při další návštěvě je server rovnou odešle, aniž by je znovu počítal. Nezapomeňte ale cache pravidelně mazat po každé úpravě webu.

Jak na to: konkrétní kroky, které zvládnete sami Začněte u obrázků. Nejčastější chybou je nahrávat fotografie přímo z foťáku nebo z mobilu, aniž byste je upravili. Jeden takový soubor může mít i několik megabajtů, přičemž na webu se zobrazí v rozměru pětkrát menším. Použijte nástroj pro kompresi, nastavte maximální šířku na šířku kontejneru a uložte ve formátu WebP. Pozor na to, abyste kompresí nepřekročili hranici, kdy je obrázek neostrý. Zkontrolujte si výsledek na mobilu i na velkém monitoru.

Jak na přenos dat a co sledovat při validaci Pro samotný přenos dat použijte nástroje, které umí exportovat data do formátu CSV nebo SQL souborů. MySQL nabízí příkaz mysqldump, PostgreSQL zase pg_dump. Důležité je exportovat data bez vytváření tabulek (pouze data) a poté importovat do předem připraveného schématu v PostgreSQL. Při importu dávejte pozor na kódování – nejbezpečnější je UTF-8. Pokud máte v datech binární obsah, zkontrolujte, jak je uložen, protože PostgreSQL pracuje s bytea odlišně než MySQL s BLOB.

Nejprve si udělejte pořádek v databázovém schématu. MySQL často používá typy jako TINYINT, ENUM nebo automatické číslování pomocí AUTO_INCREMENT. PostgreSQL nabízí ekvivalenty, ale ne vždy se chovají stejně. Například ENUM v PostgreSQL je samostatný typ, který se hůře mění. Místo toho zvažte použití referenčních tabulek nebo prostého VARCHAR s CHECK omezením. Drobnosti, jako je rozdíl v ukládání booleovských hodnot (MySQL používá 0/1, PostgreSQL TRUE/FALSE), se projeví až při porovnávání dat.

Dalším krokem je minimalizace kódu. Ze souborů CSS a JavaScript odstraňte bílé znaky, komentáře a nevyužité pravidla. Dnes to zvládnou automatické nástroje, které spustíte jedním příkazem. Dávejte si ale pozor na kombinaci souborů. Pokud sloučíte vše do jednoho velkého souboru, prohlížeč ho musí stáhnout celý, i když potřebuje jen malou část. Místo toho rozdělte kód na kritický a nekritický. Kritický vložte přímo do HTML, zbytek načtěte až po načtení stránky.

Správným řešením je použití parametrizovaných dotazů, tedy prepared statements. V praxi to znamená, že SQL dotaz napíšete s placeholdery a hodnoty předáte zvlášť. Databázová vrstva je pak vždy interpretuje jako data, nikdy jako kód. Tento přístup funguje napříč jazyky a frameworky, a to jak u relačních databází, tak u objektově-relačních mapování. Druhou vrstvou ochrany je vždy validace vstupu na úrovni aplikace. Pro číselné hodnoty ověřte, že jsou opravdu čísla, pro textové hodnoty omezte délku a povolené znaky. Validace ale nikdy nenahradí parametrizaci – slouží jen jako doplněk.

Klíčový princip, který byste měli dodržovat, je oddělení dat od instrukcí. Nikdy nepracujte s dotazem postaveným jako jeden řetězec, kam přímo vkládáte hodnoty z formuláře. Typická chyba vypadá takto: aplikace sestaví SQL příkaz pomocí zřetězení textu a do něj vloží uživatelský vstup. Pokud uživatel do pole pro jméno napíše běžný text, vše funguje. Jakmile ale napíše něco jako „nebo 1=1 –„, dotaz se změní a může vrátit všechna data z tabulky. Stejně nebezpečné jsou číselné parametry, které se předávají bez kontroly – stačí místo čísla poslat výraz, který databáze vyhodnotí jako podmínku.