Jak porovnat dvě stejné databáze?

3. září 2019

Lang: cs

Dostal se mě pod ruce projekt, kde zdrojový kód i databáze se lišili v tom co bylo na produkci, testingu a v repositáři. Potřeboval jsem to sjednotit. Jak efektivně porovnat dvě stejné databáze a najít rozdíly? Našel a vyzkoušel jsem několik nástrojů na porovnání databází.

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

Programovací jazyk Go
Analýza zadání a nacenění vývoje softwarového projektu
Python program na ovládání Dockeru pomocí API
Jak použít aplikaci MailCatcher pro testování emailů
Návod: Python OpenAI API
Vytvoření WebSocket webové aplikace a nastavení proxy
Řízení projektů: Agilní vývoj softwaru
Jak provozovat staré PHP aplikace
Co by měl umět dobrý programátor
Programovací jazyk Rust
NodeJS: vývoj, konfigurace serveru
Nette security bug CVE-2020-15227
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
Připojení k Microsoft SQL Serveru z Linuxu
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
Quickplay
Java program pro přehledné monitorování záložních zdrojů
Čipové kontaktní a bezkontaktní karty Java Card OpenPlatform
Otevřený chytrý telefon s Linuxem - Openmoko Neo FreeRunner
Vývoj pro bezdrátové moduly s procesorem PIC pod GNU/Linux - IQRF
Grafický program pro embeded/mobilní zařízení na vyhledávání dopravního spoje.
O programování a ruzné programy v jazyce Java, Python a dalších
Java program a applet Kalkulačka
Java program na výpočet kvadratické rovnice

Odběr novinek

Pokud máte zájem dostávat příležitostně na email novinky.
Můžete se vyplněním emailu registrovat k odběru novinek.


+