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:

  • nové tabulky
  • přidané řádky,
  • přidané sloupce v tabulce


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.

Články na podobné téma

Jak porovnat dvě stejné databáze?
REST API: API platform
Vlastní web a mail hosting se softwarem ISP Config
Programovní v SQL: PostgreSQL, MySQL/MariaDB
HTTPS: zabezpečený web
NoSQL databáze Mongo DB
Linux a MS SQL server
Co je pracovní náplň programátora
Lokalizace aplikací v jazyce Python
Jaký mail a web hosting vybrat
How to make wireless low power Arduino
Digispark - Programujte mikrokontrolér Atmel ATtiny pomocí Arduino IDE
Program Roulette
Vývoj pro procesory ARM s Arduino IDE
Wireless low power Arduino
Pyradio - Python program for receive Internet radio with text user inteface
UPS monitor pro Android
Bezdrátový bateriově napájený WiFi teploměr
Jak programovat WiFi procesor ESP8266
Comparison IQRF vs Wireless Arduino
Jakou platformu zvolit pro eshop? Například Prestashop
Development kits and gateways for wireless platform IQRF

OpenStreetMap a GPS trasy v mapě na webu
Java program pro přehledné monitorování záložních zdrojů
Quickplay
Otevřený chytrý telefon s Linuxem - Openmoko Neo FreeRunner
Čipové kontaktní a bezkontaktní karty Java Card OpenPlatform
Grafický program pro embeded/mobilní zařízení na vyhledávání dopravního spoje.
Vývoj pro bezdrátové moduly s procesorem PIC pod GNU/Linux - IQRF
Java program a applet Kalkulačka
Java program na výpočet kvadratické rovnice
O programování a ruzné programy v jazyce Java, Python a dalších