Zálohování databází MySQL a PostgreSQL a obnova dat ze zálohy

Poslední aktualizace 18. 9. 2026

Návod popisuje, jakým způsobem zálohujeme databáze MySQL/MariaDB a PostgreSQL na Managed serverech v MasterDC, kde zálohy najdete a jak z nich obnovíte jednotlivou tabulku nebo celou databázi.

Jak zálohování probíhá

Zálohy vytváří skript spouštěný z cronu, standardně v 1:30 v noci. Čas se může v individuálních případech lišit a po domluvě také upravit. Jedná se o logickou zálohu, tedy export dat do SQL souborů, nikoli o binární kopii datových souborů databáze.

Základní principy jsou pro oba databázové typy stejné:

  • Zálohuje se po jednotlivých tabulkách – každá tabulka má vlastní .sql soubor. Díky tomu lze obnovit i jedinou tabulku, aniž byste zasahovali do zbytku databáze.
  • Výstup jednoho dne se zabalí do ZIP archivu pojmenovaného podle data ve formátu RRRR-MM-DD.zip.
  • Na serveru se standardně uchovávají zálohy za posledních 7 dní. Dobu uchování je možné po dohodě upravit. Starší archivy se automaticky mažou.
  • Archivy jsou uloženy na stejném serveru jako samotná databáze. Tyto archivy se zálohují jako ostatní systémová data v rámci zálohy managed serverů. Samotná data databáze (/var/lib/mysql, /var/lib/postgresql) se v rámci stejné zálohy managed serverů nezálohují.

Zálohování MySQL / MariaDB

Mysqldump

Zálohy najdete v adresáři /backup/mysql/.

Zálohují se všechny databáze na serveru s výjimkou systémové information_schema. Každá tabulka se exportuje nástrojem mysqldump včetně příkazu DROP TABLE IF EXISTS, definice tabulky (CREATE TABLE) a dat ve formě INSERT příkazů s vypsanými názvy sloupců.

Struktura archivu:

2026-09-07.zip
└── 2026-09-07/
    ├── nazev_databaze/
    │   ├── tabulka1.sql
    │   └── tabulka2.sql
    └── dalsi_databaze/
        └── tabulka1.sql

Mydumper

Na části serverů používáme místo mysqldump nástroj mydumper. Ten zálohuje paralelně ve více vláknech a je výrazně rychlejší u velkých databází. Na rozdíl od varianty s mysqldump zahrnuje i uložené procedury, funkce, triggery a naplánované události.

Zálohy najdete v adresáři /backup/mydumper/localhost/, v podadresáři pojmenovaném podle databázového serveru a data zálohy. Nejedná se o ZIP archiv. Každá záloha je samostatný adresář a jednotlivé soubory jsou komprimované formátem Zstandard (.zst).

/backup/mydumper/localhost/
└── 20260907_00/
    ├── metadata
    ├── nazev_databaze-schema-create.sql.zst      <- CREATE DATABASE
    ├── nazev_databaze.tabulka1-schema.sql.zst    <- struktura tabulky
    ├── nazev_databaze.tabulka1.00000.sql.zst     <- data (rozdělená po částech)
    ├── nazev_databaze.tabulka1.00001.sql.zst
    ├── nazev_databaze.tabulka1-schema-triggers.sql.zst
    └── nazev_databaze-schema-post.sql.zst        <- procedury, funkce, události

Soubor metadata obsahuje čas začátku a konce zálohy. U serverů zapojených do replikace i pozici v binárním logu.

Zálohování probíhá bez zamykání tabulek, aby neblokovalo běžící aplikaci. Neposkytuje proto garantovaně konzistentní snímek napříč všemi tabulkami v jeden okamžik. Některé databáze nebo tabulky mohou být ze zálohy záměrně vyloučené, typicky dočasné nebo cache tabulky. Seznam výjimek na vašem serveru vám na požádání sdělíme.

Poznámka: Pokud záloha skončí chybou, adresář se přejmenuje s příponou .failed (například 20260907_00.failed). Data jsou v takovém souboru nekompletní. Použijte proto předchozí zálohu a kontaktujte technickou podporu na adrese support@master.cz.

Zálohování PostgreSQL

Zálohy najdete v adresáři /backup/postgre/.

Zálohují se všechny databáze kromě šablonových (template0, template1). Podle konfigurace serveru se používá jedna ze dvou variant uvedených níže. Poznáte ji podle obsahu archivu.

Varianta A – struktura i data

Pro každou tabulku vznikají dva soubory:

  • nazev_tabulky.schema.sql – struktura tabulky (CREATE TABLE, indexy, klíče, sekvence);
  • nazev_tabulky.sql – pouze data ve formátu COPY.
2026-09-07.zip
    └── 2026-09-07/
        └── nazev_databaze/
            ├── tabulka1.schema.sql
            ├── tabulka1.sql
            ├── tabulka2.schema.sql
            └── tabulka2.sql

Varianta B – pouze data

Pro každou tabulku vzniká jediný soubor s daty:

2026-09-07.zip
    └── 2026-09-07/
        └── nazev_databaze/
            ├── tabulka1.sql
            └── tabulka2.sql
Upozornění: U varianty B záloha neobsahuje strukturu tabulek. Slouží k vrácení obsahu tabulek, které v databázi stále existují. Obnovit z ní databázi od nuly nelze. Definici tabulek si proto uchovávejte i mimo tuto zálohu (migrace aplikace, vlastní pg_dump -s, případně nás kontaktujte na support@master.cz a zálohování rozšíříme).

Co záloha neobsahuje

Protože se zálohuje po tabulkách, archiv neobsahuje objekty, které na tabulky nejsou přímo navázané:

  • pohledy (views), uložené procedury a funkce, vlastní datové typy a rozšíření (extensions);
  • uživatele, role a jejich oprávnění;
  • u PostgreSQL tabulky umístěné mimo výchozí schéma public;
  • konfiguraci databázového serveru.
Tip: Pokud vaše aplikace tyto objekty používá, doplňte si vlastní zálohu celé databáze (mysqldump --routines --events, resp. pg_dump -Fc) nebo nás kontaktujte na support@master.cz a nastavení zálohování upravíme.

Obnova dat v MySQL / MariaDB

Mysqldump

Upozornění: Soubory zálohy obsahují příkaz DROP TABLE IF EXISTS. Obnovou tedy stávající tabulku smažete a nahradíte zálohovanou verzí. Pokud si nejste jisti, obnovte data nejprve do testovací databáze.
  1. Rozbalte archiv s požadovaným datem do dočasného adresáře:
    mkdir -p /root/obnova
    unzip /backup/mysql/2026-09-07.zip -d /root/obnova
  2. Ověřte, které tabulky máte k dispozici:
    ls /root/obnova/2026-09-07/nazev_databaze/
  3. Obnova jedné tabulky:
    mysql nazev_databaze < /root/obnova/2026-09-07/nazev_databaze/nazev_tabulky.sql
  4. Obnova celé databáze (pokud databáze neexistuje, nejprve ji vytvořte; kódování zvolte podle původní databáze):
    mysql -e "CREATE DATABASE IF NOT EXISTS nazev_databaze CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
  5. Následně nahrajte všechny tabulky v jednom sezení:
    cd /root/obnova/2026-09-07/nazev_databaze
    ( echo "SET FOREIGN_KEY_CHECKS=0;"; cat *.sql ) | mysql nazev_databaze
    Vypnutí kontroly cizích klíčů zajistí, že nezáleží na pořadí, ve kterém se tabulky nahrávají. Po dokončení importu se kontrola automaticky vrátí do původního stavu.
  6. Zkontrolujte výsledek:
    mysql -e "SELECT COUNT(*) FROM nazev_databaze.nazev_tabulky;"
  7. Po úspěšné obnově smažte rozbalená data, ať zbytečně nezabírají místo:
    rm -rf /root/obnova/2026-09-07

Mydumper (Myloader)

Zálohy z mydumperu se obnovují nástrojem myloader, který je součástí stejného balíčku. Adresář se zálohou se nerozbaluje. Myloader si komprimované soubory přečte sám.

Upozornění: Přepínač --overwrite-tables obnovované tabulky nejprve smaže a vytvoří znovu. Pokud si nejste jisti, obnovte data nejprve do testovací databáze (viz bod 3 níže).
  1. Vyberte zálohu, ze které chcete obnovovat, a ověřte, že není označená jako neúspěšná:
    ls -l /backup/mydumper/localhost/
    cat /backup/mydumper/localhost/20260907_00/metadata
  2. Obnova celé zálohy (všechny databáze, které záloha obsahuje):
    myloader \
      --user=root \
      --directory=/backup/mydumper/localhost/20260907_00 \
      --threads=4 \
      --overwrite-tables
  3. Obnova jedné databáze pod jiným názvem (vhodné pro ověření zálohy bez zásahu do produkčních dat):
    mysql -e "CREATE DATABASE nazev_databaze_test;"
    myloader \
      --user=root \
      --directory=/backup/mydumper/localhost/20260907_00 \
      --source-db=nazev_databaze \
      --database=nazev_databaze_test \
      --threads=4
  4. Obnova jedné tabulky:
    myloader \
      --user=root \
      --directory=/backup/mydumper/localhost/20260907_00 \
      --source-db=nazev_databaze \
      --tables-list=nazev_tabulky \
      --overwrite-tables
  5. Ruční obnova bez myloaderu. Pokud potřebujete jen nahlédnout do dat nebo nemáte myloader k dispozici, soubory rozbalíte nástrojem zstd (balíček zstd):
    cd /backup/mydumper/localhost/20260907_00
    zstdcat nazev_databaze.nazev_tabulky-schema.sql.zst | mysql nazev_databaze
    zstdcat nazev_databaze.nazev_tabulky.*.sql.zst | mysql nazev_databaze
    Data jedné tabulky jsou rozdělená do více očíslovaných souborů. Maska *.sql.zst je nahraje všechny ve správném pořadí.
  6. Zkontrolujte výsledek:
    mysql -e "SELECT COUNT(*) FROM nazev_databaze.nazev_tabulky;"
Poznámka: Adresář se zálohou nemažte. Je součástí retence a smaže se automaticky.

Obnova dat v PostgreSQL

Příkazy týkající se postgresql spouštějte pod uživatelem postgres (su - postgres), případně použijte přepínač -U postgres. Příkazy jako mkdir a chown pouštíte pod rootem.

Na některých serverech běží PostgreSQL na nestandardním portu (například 5433). Který port používá váš server, ověříte příkazem:

ss -lntp | grep postgres

Pokud se liší od výchozího 5432, doplňte do následujících příkazů přepínače --host localhost --port 5433.

Upozornění: Datové soubory obsahují pouze COPY příkazy, nikoli mazání původního obsahu. Pokud data nahrajete do tabulky, která již záznamy obsahuje, dojde k duplicitám nebo ke konfliktu primárních klíčů. Cílovou tabulku proto před obnovou vyprázdněte příkazem TRUNCATE, nebo obnovujte do prázdné databáze.
  1. Rozbalte archiv s požadovaným datem:
    mkdir -p /root/obnova
    unzip /backup/postgre/2026-09-07.zip -d /root/obnova
    chown -R postgres:postgres /root/obnova/2026-09-07
  2. Obnova jedné tabulky. Nejprve nahrajte strukturu, poté data:
    psql -U postgres -d nazev_databaze -f /root/obnova/2026-09-07/nazev_databaze/nazev_tabulky.schema.sql
    psql -U postgres -d nazev_databaze -f /root/obnova/2026-09-07/nazev_databaze/nazev_tabulky.sql
    Pokud tabulka v databázi již existuje a chcete jen vrátit její obsah, krok se souborem .schema.sql vynechte a tabulku před nahráním dat vyprázdněte:
    psql -U postgres -d nazev_databaze -c "TRUNCATE TABLE nazev_tabulky;"
  3. Obnova celé databáze. Pokud databáze neexistuje, vytvořte ji:
    createdb -U postgres nazev_databaze
    Nahrajte struktury všech tabulek:
    cd /root/obnova/2026-09-07/nazev_databaze
    for f in *.schema.sql; do psql -U postgres -q -d nazev_databaze -f "$f"; done
    Následně nahrajte data. Vzhledem k cizím klíčům je potřeba nahrát vše v jednom sezení s dočasně vypnutými triggery:
    ( echo "SET session_replication_role = replica;"
      for f in $(ls *.sql | grep -v '\.schema\.sql$'); do echo "\\i $f"; done
    ) | psql -U postgres -d nazev_databaze
    Podmínka grep -v je důležitá. Maska *.sql by jinak zahrnula i soubory se strukturou, které jsou v tomto kroku již nahrané.
  4. Ověřte stav sekvencí. Sekvence navázané na sloupce typu serial se obnovují spolu s daty, u ručně vytvořených sekvencí ale může být potřeba nastavit hodnotu ručně:
    psql -U postgres -d nazev_databaze -c "SELECT setval('nazev_sekvence', (SELECT MAX(id) FROM nazev_tabulky));"
  5. Aktualizujte statistiky plánovače dotazů:
    psql -U postgres -d nazev_databaze -c "ANALYZE;"
  6. Po úspěšné obnově rozbalená data smažte:
    rm -rf /root/obnova/2026-09-07

Doporučení

  • Obnovu si vyzkoušejte předem. Záloha, kterou jste nikdy neobnovovali, není ověřená záloha. Nejjednodušší test je obnovit archiv do testovací databáze a porovnat počty záznamů.
  • Před zásahem do produkce si udělejte aktuální zálohu. Nejnovější automatický archiv může být až 24 hodin starý.
  • Zálohy nedržte jen na jednom místě. Archivy jsou uložené na stejném serveru jako databáze. Při ztrátě serveru přijdete i o ně. Doporučujeme si je pravidelně stahovat, nebo využít naši službu zálohovacího prostoru.
  • Potřebujete-li starší zálohu než 7 dní, obraťte se s dotazem na naši technickou podporu.
Tip: S obnovou dat vám pomůžeme. Kontaktujte naši nonstop technickou podporu na support@master.cz nebo vytvořte tiket v Zákaznické administraci.
Navigace v článku

Pořád si nevíte rady?

Napište nám, rádi vám pomůžeme.
Pracovníci naší nonstop technické podpory vám odpoví, jakmile to bude možné.



    Nevidíte vaši vysněnou pozici?

    Pošlete nám životopis, a my se vám ozveme!

      * Povinný údaj
      Zasláním životopisu souhlasím se zpracováním osobních údajů za účelem náboru a výběrového řízení.