Crmgo Blog

mysqldump: vytváříme zálohy

mysqldump: vytváříme zálohy

Získání datových a strukturních výpisů tabulky Tato utilita umožňuje získat výpis (okamžitý „snímek“) obsahu databáze nebo sady databází pro vytvoření zálohy nebo přenos dat na jiný SQL server databáze (není nutně MySQL server). Výpis bude obsahovat sadu SQL příkazů…

mysqldump: vytváříme zálohy

Získání datových výpisů a struktury tabulek

Tento nástroj umožňuje získat výpis (``momentální snímek'') obsahu databáze nebo sady databází pro vytvoření zálohy nebo přenos dat na jiný SQL server databází (není nutně MySQL server). Výpis bude obsahovat sadu SQL příkazů pro vytvoření a/nebo vyplnění tabulek.

Pokud je záloha vytvářena na serveru, místo popsaného nástroje by měl být použit mysqlhotcopy. Viz sekci See Sekce 4.8.6, «mysqlhotcopy, Kopírování databází a tabulek MySQL».

shell> mysqldump [OPTIONS] database [tables]
или  mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
или  mysqldump [OPTIONS] --all-databases [OPTIONS]

Pokud nejsou uvedeny názvy tabulek nebo jsou použity parametry --databases nebo --all-databases, bude získán výpis celé databáze (příslušně - všech databází).

Seznam podporovaných možností vaší konkrétní verze nástroje mysqldump lze získat provedením příkazu mysqldump --help.

Mějte na paměti, že nástroj mysqldump, používaný bez možností --quick nebo --opt, před vytvořením výpisu výsledku dotazu načte celý výsledek do paměti. To může způsobit problémy při získávání výpisu velké databáze.

Vezměte v úvahu, že byste neměli používat parametry --opt nebo -e, pokud plánujete použít novou kopii programu mysqldump pro získání výpisu a poté jej přehrát na velmi starém MySQL serveru.

Nástroj mysqldump podporuje následující možnosti:

  • --add-locksPřidat příkazy LOCK TABLES před provedením a UNLOCK TABLE po provedení každého dumpu tabulky (pro zrychlení přístupu k MySQL).
  • --add-drop-tablePřidat příkaz DROP TABLE před každý příkaz CREATE TABLE.
  • -A, --all-databasesProvést dump všech databází. Analogické k možnosti --databases s uvedením všech názvů databází.
  • -a, --allZapnout všechny specifické možnosti vytváření objektů pro MySQL.
  • --allow-keywordsPovolit vytváření názvů sloupců, které se shodují s klíčovými slovy. Nedochází ke konfliktům díky přidání názvu tabulky jako prefixu k názvu každého sloupce.
  • -c, --complete-insertPoužít úplné příkazy INSERT (s názvy sloupců).
  • -C, --compressPoužít kompresi všech dat mezi klientem a serverem, pokud oba podporují kompresi.
  • -B, --databasesProvést dump více databází. Vezměte na vědomí rozdíl v použití: v tomto případě se tabulky neuvádějí. Všechny názvy argumentů jsou považovány za názvy databází. Příkaz USE db_name; je zahrnut do výstupu před každou novou databází.
  • --delayedPoužít příkaz INSERT DELAYED při vkládání řádků.
  • -e, --extended-insertPoužít příkaz INSERT s novým víceřádkovým syntaxem (zvyšuje kompaktnost a výkon příkazů INSERT).
  • -#, --debug[=option_string]Sledovat průběh programu (pro ladění).
  • --helpVypsat nápovědu a ukončit program.
  • --fields-terminated-by=... , --fields-enclosed-by=... , --fields-optionally-enclosed-by=... , --fields-escaped-by=... , --lines-terminated-by=...Tyto možnosti se používají společně s parametrem -T a mají stejný význam jako odpovídající příkazy pro LOAD DATA INFILE. Viz část Část 6.4.9, „Syntaxe příkazu LOAD DATA INFILE“.
  • -F, --flush-logsZapsat na disk data systémového protokolu z vyrovnávací paměti serveru MySQL před začátkem provádění dumpu.
  • -f, --force,Pokračovat i při získání chyby SQL při provádění dumpu tabulky.
  • -h, --host=..Provést dump dat serveru MySQL na zadaném hostiteli. Výchozí hodnota hostitele je localhost.
  • -l, --lock-tables.Uzamknout všechny tabulky před začátkem provádění dumpu. Tabulky jsou uzamčeny příkazem READ LOCAL, aby bylo umožněno paralelní zápis pro tabulky MyISAM. Je třeba poznamenat, že při provádění dumpu sady databází možnost --lock-tables uzamyká tabulky každé databáze zvlášť. Tímto způsobem použití tohoto parametru nezaručuje, že tabulky budou logicky konzistentní v rámci těchto databází. V různých databázích mohou být tabulky při provádění dumpu v zcela odlišných stavech.
  • -K, --disable-keysPřidává výraz /*!40000 ALTER TABLE tb_name DISABLE KEYS */; a /*!40000 ALTER TABLE tb_name ENABLE KEYS */; do výstupu výsledku. To zrychlí načítání dat na server MySQL 4.0, protože indexy jsou vytvářeny po přidání všech dat.
  • -n, --no-create-dbVe výstupu výsledku bude chybět výraz CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name;. Tento řádek bude přidán v každém případě při použití možností --databases nebo --all-databases.
  • -t, --no-create-infoNezapisovat informace o vytvoření tabulky (příkaz CREATE TABLE).
  • -d, --no-dataNezapisovat informace z řádků tabulky. To je velmi užitečné pro získání dumpu struktury tabulky!
  • --optStejné jako --quick --add-drop-table --add-locks --extended-insert --lock-tables. Mělo by poskytnout nejrychlejší dump pro čtení na serveru MySQL.
  • -pyour_pass, --password[=your_pass]Heslo používané při připojení k serveru. Pokud není zadán argument =your_pass, mysqldump vyzve k zadání hesla.
  • -P port_num, --port=port_numČíslo portu TCP/IP používaného pro připojení k hostiteli.
  • --protocol=(TCP | SOCKET | PIPE | MEMORY)Pro určení protokolu připojení, který má být použit. Novinka v MySQL 4.1.0.
  • -q, --quickVypsat dump přímo na standardní výstup stdout bez bufferování dotazu. K tomu se používá funkce mysql_use_result().
  • -Q, --quote-namesUvést názvy tabulek a sloupců do uvozovek bez znaků '`'.
  • -r, --result-file=...Přímý výstup do zadaného souboru. Tuto možnost by měly používat systémy MS DOS, protože zabraňuje převodu znaku nového řádku '\n' na sekvenci '\n\r' (nový řádek + návrat vozíku).
  • --single-transactionTato možnost vydává SQL příkaz BEGIN před provedením dumpu dat ze serveru. Nejčastěji se používá s tabulkami InnoDB a úrovní izolace transakcí READ_COMMITTED, protože právě v tomto režimu lze získat dump s konzistentním stavem databáze po provedení příkazu BEGIN bez blokování jakýchkoli aplikací. Při použití této možnosti je třeba si pamatovat, že při provádění dumpu budou pouze transakční tabulky ve konzistentním stavu, tj. některé tabulky MyISAM nebo HEAP mohou při použití této možnosti stále změnit svůj stav. Možnost --single-transaction byla přidána ve verzi 4.0.2. Je vzájemně se vylučující s možností --lock-tables, protože příkaz LOCK TABLES již přijímá otevřenou transakci.
  • -S /path/to/socket, --socket=/path/to/socketSoubor soketu pro připojení k localhost (výchozí hodnota hostitele).
  • --tablesPřepisuje parametr --databases (-B).
  • -T, --tab=path-to-some-directoryPro každou zadanou tabulku vytvoří soubor a table_name.sql, který obsahuje SQL příkaz CREATE pro vytvoření tabulky, a soubor table_name.txt s daty tabulky. Soubor .txt má formát podle parametrů --fields-xxx a --lines--xxx. Poznámka: Tento parametr funguje pouze za předpokladu, že utilita mysqldump je spuštěna na stejném počítači jako démon mysqld, a uživatel/skupina, která spustila tento proces mysqld (obvykle uživatel mysql a skupina mysql), musí mít právo vytvářet/zapisovat soubor na zadanou adresu.
  • -u user_name, --user=user_nameNázev uživatele serveru MySQL používaný při připojení k serveru. Výchozí hodnotou je název uživatele Unix.
  • -O var=option, --set-variable var=optionNastavit hodnoty proměnných. Dostupné proměnné jsou uvedeny níže. V MySQL 4.0 jednoduše použijte --var=option.
  • -v, --verboseRozšířený režim výstupu. Výstup podrobnějších informací o provozu programu.
  • -V, --versionVypsat informace o verzi a ukončit program.
  • -w, --where='where-condition'Provést dump pouze vybraných záznamů. Vezměte na vědomí, že uvozovky jsou povinné.
    "--where=user='jimf'" "-wuserid>1" "-wuserid<1"

 

  • -X, --xmlVytváří dump databáze ve formátu XML.
  • -x, --first-slaveUzamkne všechny tabulky ve všech databázích.
  • -O net_buffer_length=#, where # < 16MPři vytváření víceřádkových příkazů pro vkládání (stejně jako v případech použití parametrů --extended-insert nebo --opt) bude utilita mysqldump generovat řádky o délce až do hodnoty uvedené v net_buffer_length. Při zvýšení hodnoty této proměnné je třeba se také ujistit, že na MySQL serveru je pro proměnnou max_allowed_packet nastavena hodnota větší než hodnota net_buffer_length.
  • Utilita mysqldump se nejčastěji používá pro vytvoření zálohy všech databází. Viz Kapitola 4.4.1, „Zálohování databází“.

    mysqldump --opt database > backup-file.sql

    Naopak lze tento soubor načíst na MySQL serveru pomocí příkazu:

    mysql database < backup-file.sql

    nebo

    mysql -e "source /patch-to-backup/backup-file.sql" database

     

    Tato utilita se poměrně často používá také pro přenos dat z jedné databáze na jiný MySQL server:

    mysqldump --opt database | mysql --host=remote-host -C database

    Lze získat dump několika databází pomocí jednoho příkazu:

    mysqldump --databases database1 [database2 ...] > my_databases.sql

    Pokud je potřeba dump všech databází, lze použít:

    mysqldump --all-databases > all_databases.sql

    Proberme příklad nejjednoduššího použití: provedeme dump databáze „database“ přesměrováním výstupu do souboru „database.sql“:

    mysqldump -uroot -h82.82.82.82 -p database > database.sql

    kde:

    • -u nebo --user=... — uživatelské jméno
    • -h nebo --host=... — vzdálený hostitel (pro lokální hostitele lze tento parametr vynechat)
    • -p nebo --password — vyzvat k zadání hesla
    • database — název databáze
    • database.sql — soubor pro dump

    Pro provedení dumpu několika databází je třeba použít parametr --databases (nebo zkráceně -B), příklad:

    mysqldump -uroot -h82.82.82.82 -p -B database1 database2 database3 > databases.sql

    A pro provedení dumpu všech databází je třeba použít parametr --all-databases (nebo zkráceně -A), příklad:

    mysqldump -uroot -h82.82.82.82 -p -A > all-databases.sql

    Rozbalení dumpu

    Přesměrujeme tok dat opačným směrem a obnovíme databázi:

    mysql -uroot -h82.82.82.82 -p database < database.sql

    Nebo přes konzoli mysql:

    mysql> use database; mysql> source database.sql

    A pokud máme například gz archiv, pak:

    zcat database.sql.gz | mysql -uroot -h82.82.82.82 -p database

    Příklad použití některých parametrů

    Předpokládejme, že potřebujeme data z „produkční verze databáze“ pro „vývojářskou verzi“, tedy potřebujeme „písečný testovací prostor“. Vybereme maximálně 100 záznamů:

    mysqldump -uroot -h82.82.82.82 -p --where="true limit 100" database > database.sql

    Nebo potřebujeme pouze strukturu bez dat:

    mysqldump -uroot -h82.82.82.82 -p --no-data database > database.sql

    Příklady jsou inspirovány příspěvkem Alexandra Makarova – http://rmcreative.ru/blog/post/ljogkiy-damp-mysql

    Dumpujeme pouze spouštěče, procedury a události:

    mysqldump --no-create-info --no-data --triggers --routines --events -uroot -p database | gzip > ~/database.sql.gz

    Rychlý přehled parametrů

    Uvedu některé parametry, které se mohou hodit při práci s nástrojem mysqldump.

    --add-drop-database
    Před každý příkaz CREATE DATABASE přidá příkaz DROP DATABASE.
    --add-drop-table
    Před každý příkaz CREATE TABLE přidá příkaz DROP TABLE.
    --add-locks
    Před provedením a po provedení každého dumpu tabulky přidá příkazy LOCK TABLES a UNLOCK TABLE (pro zrychlení přístupu k MySQL).
    --all-databases, -A
    Uloží všechny tabulky ze všech databází spravovaných aktuálním serverem.
    --allow-keywords
    Povolí vytvářet názvy sloupců, které se shodují s klíčovými slovy. Zamezení konfliktům je zajištěno přidáním názvu tabulky jako prefixu k názvu každého sloupce.
    --comments, -i
    Tato možnost umožňuje přidat do dumpu další informace, jako je verze mysqldump, verze MySQL, název hostitele, na kterém běží server MySQL.
    --compact
    Tato možnost vyžaduje od mysqldump, aby vytvořil dump pomocí co nejkompatnějšího formátu. Tato možnost je opakem --comments.
    --compatible=name
    Tato možnost generuje výstup, který je kompatibilní s jinými systémy RDBMS nebo staršími verzemi MySQL. Místo klíčového slova name lze použít: „ansi", „mysql323", „mysql40", „postgresql", „oracle", „mssql", „db2", „maxdb", „no_key_options", „no_table_options", „no_field_options". Lze použít více hodnot oddělených čárkou.
    --complete-insert, -c
    Použije se úplná forma příkazu INSERT (s názvy sloupců).
    --create-options
    Přidá další informace do příkazů CREATE TABLE. Může jít o typ tabulky, počáteční hodnotu AUTO_INCREMENT a další parametry.
    --databases, -B
    Tato možnost umožňuje zadat názvy více databází, pro které má být vytvořen dump.
    --delayed
    Při vkládání řádků použije příkaz INSERT DELAYED.
    --delete-master-logs
    Na hlavním replikačním serveru se automaticky odstraní binární logy (logbin) poté, co byl úspěšně vytvořen dump pomocí mysqldump. Tato možnost automaticky aktivuje možnost „--master-data".
    --disable-keys, -K
    Pro každou tabulku obalí příkaz INSERT výrazy /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; a /*!40000 ALTER TABLE tbl_name ENABLE KEYS */; ve výstupu dumpu. To zrychlí načítání dat na server pro tabulky typu MyISAM, protože indexy jsou vytvářeny až po vložení všech dat.
    --extended-insert, -e
    Použije příkaz INSERT s novým víceřádkovým syntaxí (zvyšuje kompaktnost a výkon příkazů vložení).
    --flush-logs, -F
    Před začátkem vytváření dumpu zapíše data systémového deníku z vyrovnávací paměti serveru MySQL na disk.
    --force, -f
    Pokračovat i v případě, že během vytváření dumpu dojde k chybě.
    --hex-blob
    Tato možnost umožňuje reprezentovat binární data v polích typu BINARY, VARBINARY, BLOB a BIT v šestnáctkovém formátu. Takže posloupnost „abc" bude nahrazena za 0×616263.
    --ignore-table=db_name.tbl_name
    Povolí ignorovat tabulku tbl_name databáze db_name při vytváření dumpu. Pokud je třeba vyloučit z dumpu více tabulek, je třeba použít více možností „--ignore-table", přičemž v každé možnosti se uvede jedna tabulka.
    --insert-ignore
    Přidá klíčové slovo IGNORE do příkazu INSERT.
    --lock-all-tables, -x
    Uvedení této možnosti způsobí zablokování všech tabulek ve všech databázích po dobu vytváření kompletního dumpu všech databází.
    --lock-tables, -l
    Uvedení této možnosti způsobí zablokování tabulek databáze, pro kterou je vytvářen dump.
    --no-autocommit
    Zahrne všechny příkazy INSERT týkající se jedné tabulky do jedné transakce, což vede ke zvýšení rychlosti načítání dat.
    --no-create-db, -n
    Potlačí vytvoření příkazů CREATE DATABASE v dumpu, které se automaticky přidávají při použití možností --databases a --all-databases.
    --no-data, -d
    Potlačí vytvoření příkazů INSERT v dumpu, což může být užitečné při vytváření dumpu struktury databáze bez samotných dat.
    --opt
    Tato možnost je určena pro optimalizaci rychlosti zálohování dat a je zkratkou zahrnující následující volby: --quick --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --set-charset. Od verze MySQL 4.1 je možnost --opt výchozí, tj. všechny výše uvedené parametry jsou implicitně povoleny, i když nejsou explicitně uvedeny. Chcete-li tomuto chování zabránit, použijte možnost --skip-opt.
    --order-by-primary
    Uvedení této možnosti způsobí, že každá tabulka bude seřazena podle primárního klíče nebo prvního unikátního indexu.
    --port, -P
    Číslo TCP portu používaného pro připojení k hostiteli.
    --protocol={TCP|SOCKET|PIPE|MEMORY}
    Tato možnost umožňuje zadat protokol připojení k serveru.
    --quick, -q
    Umožní začít vytvářet dump bez čekání na úplné načtení dat ze serveru, čímž se ušetří paměť.
    --quote-names, -Q
    Obalí názvy databází, tabulek a sloupců zpětnými apostrofy `. Od verze MySQL 4.1 je tato možnost výchozí.
    --replace
    Přidá klíčové slovo REPLACE do příkazu INSERT. Tato možnost se poprvé objevila v MySQL 5.1.3.
    --result-file=/path/to/file, -r /path/to/file
    Tato možnost přesměruje dump do souboru file. Tato možnost je zejména užitečná v systému Windows, bez použití příkazového řádku, kdy lze výsledek přesměrovat do souboru pomocí sekvencí > a >>.
    --routines, -R
    Tato možnost vytvoří dump uložených procedur a funkcí. Dostupné od MySQL 5.1.2.
    --single-transaction
    Tato možnost vytvoří dump jako jednu transakci.
    --skip-comments
    Tato možnost umožňuje potlačit výstup dalších informací do dumpu.
    --socket=/path/to/socket, -S /path/to/socket
    Soubor soketu pro připojení k localhost.
    --tab=/path/, -T /path/
    Při použití této možnosti se v adresáři path pro každou tabulku vytvoří dva samostatné soubory: tbl_name.sql, který obsahuje příkaz CREATE TABLE, a tbl_name.txt, který obsahuje data tabulek oddělená znakem tabulátoru. Formát dat lze explicitně přepsat pomocí možností --fields-xxx a --lines-xxx.
    --tables
    Přepíše akci možnosti --databases (-B). Všechny argumenty následující za touto možností jsou považovány za názvy tabulek.
    --triggers
    Vytvoří se dump spouštěčů. Tato možnost je výchozí. Pro její vypnutí použijte možnost --skip-triggers.
    --events, -E
    Vytvoří se dump událostí. Viz MySQL Event Scheduler nebo vestavěný správce událostí v MySQL.
    --tz-utc
    Při použití této možnosti bude do dumpu přidán příkaz ve formátu SET TIME_ZONE='+00:00', což umožní výměnu dumpu v různých časových pásmech.
    --verbose, -v
    Rozšířený režim výstupu. Výstup podrobnějších informací o činnosti programu.
    --version, -V
    Vypsat informace o verzi programu.
    --where='where-condition', -w 'where-condition'
    Vykonat dump pouze vybraných záznamů. Všimněte si, že uvozovky jsou povinné.
    --xml, -X
    Představí dump databáze ve formátu XML.
    --first-slave, -x
    Zablokuje všechny tabulky ve všech databázích.
    --debug=..., -#
    Sledovat průběh programu (pro ladění).
    --help
    Vypsat nápovědu a ukončit program.

    Poznámka: příspěvek mohl vzniknout s pomocí AI a lidskou redakcí. Odpovědný: Dmytro Lomaka, Kaltenkirchen.