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í
.sqlsoubor. 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.sqlMydumper
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álostiSoubor 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.
.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átuCOPY.
2026-09-07.zip
└── 2026-09-07/
└── nazev_databaze/
├── tabulka1.schema.sql
├── tabulka1.sql
├── tabulka2.schema.sql
└── tabulka2.sqlVarianta B – pouze data
Pro každou tabulku vzniká jediný soubor s daty:
2026-09-07.zip
└── 2026-09-07/
└── nazev_databaze/
├── tabulka1.sql
└── tabulka2.sqlpg_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.
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
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.- 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 - Ověřte, které tabulky máte k dispozici:
ls /root/obnova/2026-09-07/nazev_databaze/ - Obnova jedné tabulky:
mysql nazev_databaze < /root/obnova/2026-09-07/nazev_databaze/nazev_tabulky.sql - 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;" - Následně nahrajte všechny tabulky v jednom sezení:
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.cd /root/obnova/2026-09-07/nazev_databaze
( echo "SET FOREIGN_KEY_CHECKS=0;"; cat *.sql ) | mysql nazev_databaze - Zkontrolujte výsledek:
mysql -e "SELECT COUNT(*) FROM nazev_databaze.nazev_tabulky;" - 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.
--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).- 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 - 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 - 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 - Obnova jedné tabulky:
myloader \
--user=root \
--directory=/backup/mydumper/localhost/20260907_00 \
--source-db=nazev_databaze \
--tables-list=nazev_tabulky \
--overwrite-tables - 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íčekzstd):
Data jedné tabulky jsou rozdělená do více očíslovaných souborů. Maskacd /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*.sql.zstje nahraje všechny ve správném pořadí. - Zkontrolujte výsledek:
mysql -e "SELECT COUNT(*) FROM nazev_databaze.nazev_tabulky;"
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 postgresPokud se liší od výchozího 5432, doplňte do následujících příkazů přepínače --host localhost --port 5433.
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.- 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 - Obnova jedné tabulky. Nejprve nahrajte strukturu, poté data:
Pokud tabulka v databázi již existuje a chcete jen vrátit její obsah, krok se souborempsql -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.schema.sqlvynechte a tabulku před nahráním dat vyprázdněte:psql -U postgres -d nazev_databaze -c "TRUNCATE TABLE nazev_tabulky;" - Obnova celé databáze. Pokud databáze neexistuje, vytvořte ji:
Nahrajte struktury všech tabulek:createdb -U postgres nazev_databaze
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:cd /root/obnova/2026-09-07/nazev_databaze
for f in *.schema.sql; do psql -U postgres -q -d nazev_databaze -f "$f"; done
Podmínka( 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_databazegrep -vje důležitá. Maska*.sqlby jinak zahrnula i soubory se strukturou, které jsou v tomto kroku již nahrané. - Ověřte stav sekvencí. Sekvence navázané na sloupce typu
serialse 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));" - Aktualizujte statistiky plánovače dotazů:
psql -U postgres -d nazev_databaze -c "ANALYZE;" - 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.