MENU

Jak porovnat dvě stejné databáze?

3. Září 2019

Svět webových aplikací je světem masy a tím pádem je průměrná kvality nižší. Člověk se tak setká s ledasčím. Třeba i s vývojem kde nejsou verzované změny aplikace a ani databáze.

Verzování databáze

Již léta existují nástroje pro PHP, jakou jsou například phpmig, nextras/migrations nebo Phinx , které slouží pro popis změn struktury databáze a hladký přechod mezi verzemi. Přechod mezi verzemi struktur databáze může být jak dopředný na novou verzi, tak zpětný. Zpětné změny se například využívá v případě, že upgrade aplikace přinesl nové problémy, které zamezují jejímu použití. Pak se využije připravené zpětné migrace a dostaní aplikace do použitelného stavu je tak rychlé

Pro zdokumentování změn by však stačil aspoň prostý zápis ALTER SQL příkazů, které je potřeba provést, aby se struktura a případně i data databáze daly upgradovat pro novu verzi aplikace.

Jak však řešit problém pokud máme dvě verze aplikace, například produkční a testovací, kde se databáze liší nejen daty, ale i strukturou? A přitom původní programátor nezanechal žádné informace o změnách? Pak nezbývá než porovnání databází. Ručně to asi ani u malých projektu nechce nikdo dělat, takže jak automaticky databáze porovnat?

Nástroje k porovnání databází

Grafický nástroj MySQL Workbench by měl umět porovnávat databáze, já ho však nepoužívám, protože mě tento SW padá a víc jsem ho neřešil.
Narazil jsem ještě na několik dalších často konzolových nástrojů, které jsou pro profesionální práci vývojáře obvykle efektivnější.

Nakonec jsem vybral vyzkoušel a úspěšně použil software DBDiff

Pokud s databázemi teprve začínáte koukněte na článek Programovní v SQL: PostgreSQL, MySQL/MariaDB.

DBDiff

Program vyžaduje verzi PHP7, ale ta už dneska je běžně dostupná na strojích (v prostředích) PHP vývojářů.

Program DBDiff je ke stažení na GitHubu, takže stačí příkazem git udělat klon repositáře:

git clone https://github.com/DBDiff/DBDiff.git

Použití

Nejprve je potřeba program nastavit. Vytvořit konfigurační soubor například config.cgf a zapsat do něj přístupové údaje. Tedy do konfiguráku zapsat přístupové udaje k databázím, které chceme porovnávat.
Program pak spouštíme následovně:

./dbdiff  --config=config.cgf   server1.example.com:server2.example.com
Program vytvoří soubor s informacemi o porovnání ve formátu SQL příkazů ./migration.sql.

Přepínač --type=all porovnává v databázi vše, ale při nemalých databází zabere veškerou dostupnou operační paměť.
PHP má definované omezení paměti, proto aby nemohla být spotřebována veškerá operační paměť, která je v počítači zapojena. Proto je potřeba v souboru ./src/DBDiff.php upravit hodnotu memory_limit například takto:

ini_set('memory_limit', '1512M');

Jinou možností a asi lepší, pokud chcete porovnat veškerý obsah a nezabývat se omezením operační paměti, tak je možno programem porovnávat databázi jed podle jednotlivých tabulek. Příklad použití:

./dbdiff  --config=config.cgf   
server1.example.com.category:server2.example.com.category 
--type=all --output=migration_category.sql

Zhodnocení programu

Co program DBDiff rozpoznal?
Po nahlédnutí do vygenerovaného migrační skriptu je vidět, že program rozpoznal:


Co program DBDiff nevyřeší?

U tabulky s přidanými sloupci nevygeneroval update pro nastavení hodnot do nových sloupců. Vyřešil jsem to tak, že jsem udělal export celé tabulky s daty a pro následný import pomoci update. Smazaní tabulky a import nefungoval, protože tabulka obsahuje klíče do cizích tabulek.

Co program DBDiff rozpozná ale nevyřeší?

Program DBDiff poznal, ale nevygeneroval dostatečný SQL skript u změněného komentáře u tabulky. Konkrétně vygeneroval skript, který udělal alter table, ale bez vložení toho nového komentáře.

Další články o programování:

Porovnání rozdílů dvou databází
REST API: API platform
ISP Config: web a mail hosting
Programovní v SQL:PostgreSQL, MySQL/MariaDB
HTTPS: zabezpečený web a přesměrování
No SQL databáze Mongo DB
Linux a MS SQL server
Jak provést zátěžový test webové aplikace
Digispark - Programujete mikrokontrolér Atmel ATtiny pomocí Arduino IDE
Jak programovat ARM procesory pomocí Arduino IDE
Wireless low power Arduino
How to make wireless low power Arduino
Zobrazení map na webové stránce
Vývoj bezdrátových zařízení s IQRF
Prestashop - programování eshopů
Programovaní pro mobilní telefon
Comparison IQRF vs Wireless Arduino
ESP8266 IoT přichází
WiFi čidlo teploty
Roulette
Jak vybrat web hosting
Lokalizace aplikací v jazyce Python

Kontakt

Pozdrav, dotaz nebo žádost o konzultaci pošlete na můj email:mail@josefjebavy.cz




Flattr this



Ověřit CSS!