Crmgo Blog

mysqldump: tworzenie kopii zapasowych

mysqldump: tworzenie kopii zapasowych

Pobieranie zrzutów danych i struktury tabeli Narzędzie to umożliwia uzyskanie zrzutu („migawki”) zawartości bazy danych lub zbioru baz w celu utworzenia kopii zapasowej lub przesłania danych na inny serwer baz danych SQL (niekoniecznie serwer MySQL). Zrzut będzie zawierał zestaw poleceń SQL…

mysqldump: tworzenie kopii zapasowych

Pobieranie zrzutów danych i struktury tabeli

To narzędzie umożliwia uzyskanie zrzutu („migawki”) zawartości bazy danych lub zbioru baz w celu utworzenia kopii zapasowej lub przesyłania danych na inny serwer baz danych SQL (niekoniecznie serwer MySQL). Zrzut będzie zawierał zestaw poleceń SQL służących do tworzenia i/lub wypełniania tabel.

Jeśli kopia zapasowa tworzona jest na serwerze, zamiast opisywanego narzędzia należy użyć mysqlhotcopy. Patrz rozdział See Rozdział 4.8.6, „mysqlhotcopy, Kopia zapasowa baz danych i tabel MySQL”.

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

Jeśli nie podano nazw tabel lub użyto parametrów --databases lub --all-databases, zostanie uzyskany zrzut całej bazy danych (odpowiednio – wszystkich baz danych).

Listę opcji obsługiwanych przez Twoją konkretną wersję narzędzia mysqldump można uzyskać, wykonując polecenie mysqldump --help.

Należy pamiętać, że narzędzie mysqldump, używane bez opcji --quick lub --opt, przed wykonaniem zrzutu wyniku zapytania załaduje cały wynik do pamięci. Może to spowodować problemy przy tworzeniu zrzutu dużej bazy danych.

Pamiętaj, że nie należy stosować parametrów --opt lub -e, jeśli planujesz użyć nowej kopii programu mysqldump do uzyskania zrzutu, a następnie odtworzyć go na bardzo starym serwerze MySQL.

Narzędzie mysqldump obsługuje następujące opcje:

  • --add-locksDodaj polecenia LOCK TABLES przed wykonaniem oraz UNLOCK TABLE po wykonaniu każdego eksportu tabeli (w celu przyspieszenia dostępu do MySQL).
  • --add-drop-tableDodaj polecenie DROP TABLE przed każdym poleceniem CREATE TABLE.
  • -A, --all-databasesWykonaj eksport wszystkich baz danych. Odpowiada opcji --databases z podaniem wszystkich nazw baz danych.
  • -a, --allWłącz wszystkie opcje tworzenia obiektów specyficzne dla MySQL.
  • --allow-keywordsZezwalaj na tworzenie nazw kolumn, które pokrywają się ze słowami kluczowymi. Brak konfliktów jest zapewniany poprzez dodanie nazwy tabeli jako prefiksu do nazwy każdej kolumny.
  • -c, --complete-insertUżywaj pełnych poleceń INSERT (z nazwami kolumn).
  • -C, --compressUżywaj kompresji wszystkich danych między klientem a serwerem, jeśli oba obsługują kompresję.
  • -B, --databasesWykonaj eksport wielu baz danych. Zwróć uwagę na różnicę w użyciu: w tym przypadku nie podaje się tabel. Wszystkie nazwy argumentów są traktowane jako nazwy baz danych. Instrukcja USE db_name; jest dołączana do wyjścia przed każdą nową bazą danych.
  • --delayedUżywaj polecenia INSERT DELAYED podczas wstawiania wierszy.
  • -e, --extended-insertUżywaj polecenia INSERT z nowym, wielowierszowym składnią (zwiększa zwięzłość i wydajność instrukcji ładowania).
  • -#, --debug[=option_string]Śledź przebieg programu (w celu debugowania).
  • --helpWyświetl informacje pomocnicze i zakończ działanie programu.
  • --fields-terminated-by=... , --fields-enclosed-by=... , --fields-optionally-enclosed-by=... , --fields-escaped-by=... , --lines-terminated-by=...Te opcje są używane wraz z parametrem -T i mają to samo znaczenie, co odpowiednie instrukcje dla LOAD DATA INFILE. Zobacz sekcję Sekcja 6.4.9, „Składnia instrukcji LOAD DATA INFILE”.
  • -F, --flush-logsZapisz na dysku dane dziennika systemowego z bufora serwera MySQL przed rozpoczęciem eksportu.
  • -f, --force,Kontynuuj działanie nawet po wystąpieniu błędu SQL podczas eksportu tabeli.
  • -h, --host=..Wykonaj eksport danych serwera MySQL na wskazanym hoście. Domyślna wartość hosta to localhost.
  • -l, --lock-tables.Zablokuj wszystkie tabele przed rozpoczęciem eksportu. Tabele są blokowane instrukcją READ LOCAL, aby umożliwić równoległe zapisy dla tabel MyISAM. Należy zauważyć, że podczas eksportu zbioru baz danych opcja --lock-tables blokuje tabele każdej bazy osobno. W związku z tym użycie tego parametru nie gwarantuje, że tabele będą spójne logicznie w ramach tych baz danych. W różnych bazach danych tabele podczas eksportu mogą znajdować się w zupełnie różnych stanach.
  • -K, --disable-keysDodaje wyrażenia /*!40000 ALTER TABLE tb_name DISABLE KEYS */; i /*!40000 ALTER TABLE tb_name ENABLE KEYS */; do wyjścia. Przyspieszy to ładowanie danych na serwer MySQL 4.0, ponieważ indeksy są tworzone po wprowadzeniu wszystkich danych.
  • -n, --no-create-dbW wyjściu wyrażenie CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name; nie będzie obecne. Ten wiersz zostanie dodany w każdym przypadku przy użyciu opcji --databases lub --all-databases.
  • -t, --no-create-infoNie zapisuj informacji o tworzeniu tabeli (polecenie CREATE TABLE).
  • -d, --no-dataNie zapisuj informacji z wierszy tabeli. Jest to bardzo przydatne do uzyskania eksportu struktury tabeli!
  • --optTo samo co --quick --add-drop-table --add-locks --extended-insert --lock-tables. Powinno zapewnić najszybszy eksport do odczytu na serwerze MySQL.
  • -pyour_pass, --password[=your_pass]Hasło używane podczas łączenia się z serwerem. Jeśli argument =your_pass nie zostanie podany, mysqldump poprosi o wprowadzenie hasła.
  • -P port_num, --port=port_numNumer portu TCP/IP używanego do łączenia się z hostem.
  • --protocol=(TCP | SOCKET | PIPE | MEMORY)Określa protokół połączenia, który należy użyć. Nowość w MySQL 4.1.0.
  • -q, --quickWyświetlaj eksport bezpośrednio na standardowym wyjściu stdout bez buforowania zapytania. Do tego celu używana jest funkcja mysql_use_result().
  • -Q, --quote-namesZamykaj nazwy tabel i kolumn w cudzysłowach bez znaków '`'.
  • -r, --result-file=...Bezpośrednie wypisywanie do określonego pliku. Opcję tę należy używać w systemie MS DOS, ponieważ zapobiega ona konwersji znaku nowej linii '\n' na sekwencję '\n\r' (nowa linia + powrót karetki).
  • --single-transactionTa opcja wydaje instrukcję SQL BEGIN przed wykonaniem eksportu danych z serwera. Najczęściej jest używana z tabelami InnoDB i poziomem izolacji transakcji READ_COMMITTED, ponieważ tylko w tym trybie można uzyskać eksport o spójnym stanie bazy danych po wykonaniu instrukcji BEGIN bez blokowania jakichkolwiek aplikacji. Korzystając z tej opcji, należy pamiętać, że podczas eksportu tylko tabele transakcyjne będą w spójnym stanie, tj. niektóre tabele MyISAM lub HEAP przy użyciu tej opcji mogą nadal zmieniać swój stan. Opcja --single-transaction została dodana w wersji 4.0.2. Jest wzajemnie wykluczająca się z opcją --lock-tables, ponieważ instrukcja LOCK TABLES już przyjmuje otwartą transakcję.
  • -S /path/to/socket, --socket=/path/to/socketPlik gniazda do łączenia się z localhost (domyślna wartość hosta).
  • --tablesNadpisuje parametr --databases (-B).
  • -T, --tab=path-to-some-directoryDla każdej podanej tabeli tworzy plik a table_name.sql, zawierający instrukcję SQL CREATE tworzącą tabelę, oraz plik table_name.txt z danymi tabeli. Plik .txt ma format zgodny z parametrami --fields-xxx i --lines--xxx. Uwaga: Ten parametr działa tylko pod warunkiem, że narzędzie mysqldump jest uruchomione na tym samym komputerze co demon mysqld, a użytkownik/grupa, która uruchomiła ten proces mysqld (zazwyczaj jest to użytkownik mysql i grupa mysql), musi mieć prawo do tworzenia/zapisu pliku pod podanym adresem.
  • -u user_name, --user=user_nameNazwa użytkownika serwera MySQL używana podczas łączenia się z serwerem. Domyślną wartością jest nazwa użytkownika systemu Unix.
  • -O var=option, --set-variable var=optionUstaw wartości zmiennych. Dostępne do użycia zmienne wymieniono poniżej. W MySQL 4.0 wystarczy użyć --var=option.
  • -v, --verboseTryb rozszerzony wyjścia. Wyświetlanie bardziej szczegółowych informacji o działaniu programu.
  • -V, --versionWyświetl informacje o wersji i zakończ działanie programu.
  • -w, --where='where-condition'Wykonaj eksport tylko wybranych rekordów. Należy pamiętać, że cudzysłowy są obowiązkowe.
    "--where=user='jimf'" "-wuserid>1" "-wuserid<1"

 

  • -X, --xmlZapisuje zrzut bazy danych w formacie XML.
  • -x, --first-slaveBlokuje wszystkie tabele we wszystkich bazach danych.
  • -O net_buffer_length=#, where # < 16MPodczas tworzenia wielowierszowych instrukcji wejściowych (tak jak w przypadkach użycia parametrów --extended-insert lub --opt) narzędzie mysqldump będzie generować wiersze o długości do wartości określonej w net_buffer_length. Przy zwiększaniu wartości tej zmiennej należy również upewnić się, że w serwerze MySQL dla zmiennej max_allowed_packet ustawiono wartość większą niż wielkość net_buffer_length.
  • Najczęściej narzędzie mysqldump jest używane do uzyskania kopii zapasowej wszystkich baz danych. Zobacz Rozdział 4.4.1, „Tworzenie kopii zapasowych baz danych”.

    mysqldump --opt database > backup-file.sql

    Można natomiast odczytać ten plik na serwerze MySQL za pomocą polecenia:

    mysql database < backup-file.sql

    lub

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

     

    To narzędzie jest również często używane do przenoszenia danych z bazy danych na inny serwer MySQL:

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

    Możliwe jest również uzyskanie zrzutu kilku baz danych za pomocą jednego polecenia:

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

    Jeśli potrzebny jest zrzut wszystkich baz danych, można użyć:

    mysqldump --all-databases > all_databases.sql

    Przeanalizujmy przykład najprostszego użycia, wykonajmy zrzut bazy danych „database” poprzez przekierowanie strumienia do pliku „database.sql”:

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

    gdzie:

    • -u lub --user=... — nazwa użytkownika
    • -h lub --host=... — zdalny host (dla hosta lokalnego można pominąć ten parametr)
    • -p lub --password — poproś o hasło
    • database — nazwa bazy danych
    • database.sql — plik do zrzutu

    Aby wykonać zrzut kilku baz danych, należy użyć parametru --databases (lub skróconego -B), przykład:

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

    Aby wykonać zrzut wszystkich baz danych, należy użyć parametru --all-databases (lub skróconego -A), przykład:

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

    Przywracanie zrzutu

    Kierujemy strumień w przeciwnym kierunku i przywracamy bazę danych:

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

    Lub przez konsolę mysql:

    mysql> use database; mysql> source database.sql

    A jeśli mamy archiwum gz, na przykład, to:

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

    Przykład użycia niektórych parametrów

    Na przykład, potrzebujemy danych z „wersji produkcyjnej bazy” dla „wersji deweloperskiej”, czyli potrzebujemy „piaskownicy”. Wybieramy nie więcej niż 100 rekordów:

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

    Lub potrzebujemy tylko struktury, bez danych:

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

    Przykłady inspirowane postem Aleksandra Makarowa – http://rmcreative.ru/blog/post/ljogkiy-damp-mysql

    Tworzymy dump tylko triggerów, procedur i zdarzeń:

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

    Skrót do parametrów

    Poniżej przedstawiam niektóre parametry, które mogą być potrzebne podczas pracy z narzędziem mysqldump.

    --add-drop-database
    Dodaje instrukcję DROP DATABASE przed każdą instrukcją CREATE DATABASE.
    --add-drop-table
    Dodaje instrukcję DROP TABLE przed każdą instrukcją CREATE TABLE.
    --add-locks
    Dodaje instrukcję LOCK TABLES przed wykonaniem oraz UNLOCK TABLE po wykonaniu zrzutu każdej tabeli (w celu przyspieszenia dostępu do MySQL).
    --all-databases, -A
    Zapisuje wszystkie tabele ze wszystkich baz danych zarządzanych przez bieżący serwer.
    --allow-keywords
    Pozwala na tworzenie nazw kolumn, które pokrywają się ze słowami kluczowymi. Unikanie konfliktów jest zapewniane poprzez dodanie nazwy tabeli jako prefiksu do nazwy każdej kolumny.
    --comments, -i
    Opcja ta umożliwia dodanie do zrzutu dodatkowych informacji, takich jak wersja mysqldump, wersja MySQL, nazwa hosta, na którym znajduje się serwer MySQL.
    --compact
    Opcja ta wymusza na mysqldump utworzenie zrzutu w jak najbardziej zwartym formacie. Opcja ta jest przeciwieństwem --comments.
    --compatible=name
    Opcja generuje wyjście zgodne z innymi systemami zarządzania bazami danych (RDBMS) lub starszymi wersjami MySQL. Zamiast słowa kluczowego name można użyć: «ansi», «mysql323», «mysql40», «postgresql», «oracle», «mssql», «db2», «maxdb», «no_key_options», «no_table_options», «no_field_options». Można użyć wielu wartości, oddzielając je przecinkami.
    --complete-insert, -c
    Używa pełnej formy instrukcji INSERT (z nazwami kolumn).
    --create-options
    Dodaje dodatkowe informacje do instrukcji CREATE TABLE. Może to być typ tabeli, początkowa wartość AUTO_INCREMENT oraz inne parametry.
    --databases, -B
    Opcja ta pozwala podać nazwy wielu baz danych, dla których należy utworzyć zrzut.
    --delayed
    Używa polecenia INSERT DELAYED podczas wstawiania wierszy.
    --delete-master-logs
    Na głównym serwerze replikacji automatycznie usuwane są logi binarne (logbin) po pomyślnym utworzeniu zrzutu przy użyciu mysqldump. Opcja ta automatycznie włącza opcję „--master-data”.
    --disable-keys, -K
    Dla każdej tabeli otacza instrukcję INSERT wyrażeniami /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; i /*!40000 ALTER TABLE tbl_name ENABLE KEYS */; w wyjściu zrzutu. Przyspieszy to ładowanie danych na serwer dla tabel typu MyISAM, ponieważ indeksy są tworzone po wprowadzeniu wszystkich danych.
    --extended-insert, -e
    Używa polecenia INSERT z nowym składnią wielowierszową (zwiększa zwartość i wydajność instrukcji wprowadzania).
    --flush-logs, -F
    Zapisuje na dysk dane dziennika systemowego z bufora serwera MySQL przed rozpoczęciem tworzenia zrzutu.
    --force, -f
    Kontynuuj nawet jeśli podczas tworzenia zrzutu wystąpił błąd.
    --hex-blob
    Opcja ta umożliwia przedstawienie danych binarnych w polach typu BINARY, VARBINARY, BLOB i BIT w formacie szesnastkowym. W ten sposób sekwencja „abc” zostanie zastąpiona przez 0×616263.
    --ignore-table=db_name.tbl_name
    Pozwala zignorować tabelę tbl_name bazy danych db_name podczas tworzenia zrzutu. Jeśli z zrzutu należy wykluczyć wiele tabel, należy użyć wielu opcji „--ignore-table”, podając po jednej tabeli w każdej z nich.
    --insert-ignore
    Dodaje słowo kluczowe IGNORE do instrukcji INSERT.
    --lock-all-tables, -x
    Użycie tej opcji powoduje zablokowanie wszystkich tabel we wszystkich bazach danych na czas tworzenia pełnego zrzutu wszystkich baz danych.
    --lock-tables, -l
    Użycie tej opcji powoduje zablokowanie tabel bazy danych, dla której tworzony jest zrzut.
    --no-autocommit
    Włącza wszystkie instrukcje INSERT dotyczące jednej tabeli do jednej transakcji, co prowadzi do zwiększenia szybkości ładowania danych.
    --no-create-db, -n
    Wyłącza tworzenie w zrzucie instrukcji CREATE DATABASE, które są automatycznie dodawane przy użyciu opcji --databases i --all-databases.
    --no-data, -d
    Wyłącza tworzenie instrukcji INSERT w zrzucie, co może być przydatne przy tworzeniu zrzutu struktury bazy danych bez samych danych.
    --opt
    Opcja ta służy do optymalizacji szybkości tworzenia kopii zapasowych i jest skrótem obejmującym następujące opcje: --quick --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --set-charset. Począwszy od MySQL 4.1, opcja --opt jest używana domyślnie, tzn. wszystkie powyższe parametry są włączone domyślnie, nawet jeśli nie są podane. Aby wykluczyć takie zachowanie, należy użyć opcji --skip-opt
    --order-by-primary
    Użycie tej opcji powoduje, że każda tabela jest sortowana według klucza głównego lub pierwszego unikalnego indeksu.
    --port, -P
    Numer portu TCP używanego do łączenia się z hostem.
    --protocol={TCP|SOCKET|PIPE|MEMORY}
    Opcja ta pozwala określić protokół łączenia się z serwerem.
    --quick, -q
    Pozwala rozpocząć tworzenie zrzutu, nie czekając na pełne załadowanie danych z serwera, oszczędzając tym samym pamięć.
    --quote-names, -Q
    Otacza nazwy baz danych, tabel i kolumn apostrofami odwrotnymi `. Począwszy od MySQL 4.1, ta opcja jest włączona domyślnie.
    --replace
    Dodaje słowo kluczowe REPLACE do instrukcji INSERT. Opcja ta po raz pierwszy pojawiła się w MySQL 5.1.3.
    --result-file=/path/to/file, -r /path/to/file
    Opcja ta kieruje zrzut do pliku file. Opcja ta jest szczególnie wygodna w systemie Windows, bez użycia wiersza poleceń, gdy można przekierować wynik do pliku za pomocą sekwencji > i >>.
    --routines, -R
    Opcja ta tworzy zrzut procedur i funkcji przechowywanych. Dostępna od MySQL 5.1.2.
    --single-transaction
    Opcja ta tworzy zrzut w postaci jednej transakcji.
    --skip-comments
    Opcja ta pozwala wyłączyć wyświetlanie dodatkowych informacji w zrzucie.
    --socket=/path/to/socket, -S /path/to/socket
    Plik gniazda do połączenia z localhost.
    --tab=/path/, -T /path/
    Podczas używania tej opcji w katalogu path dla każdej tabeli tworzone są dwa osobne pliki: tbl_name.sql, zawierający instrukcję CREATE TABLE, oraz tbl_name.txt, który zawiera dane tabeli rozdzielone znakiem tabulacji. Format danych może być jawnie nadpisany za pomocą opcji --fields-xxx i --lines-xxx.
    --tables
    Nadpisuje działanie opcji --databases (-B). Wszystkie argumenty następujące po tej opcji są traktowane jako nazwy tabel.
    --triggers
    Tworzony jest zrzut wyzwalaczy. Opcja ta jest włączona domyślnie. Aby ją wyłączyć, należy użyć opcji --skip-triggers.
    --events, -E
    Tworzony jest zrzut zdarzeń. Zobacz MySQL Event Scheduler lub wbudowany menedżer zdarzeń w MySQL.
    --tz-utc
    Podczas używania tej opcji do zrzutu zostanie dodana instrukcja w rodzaju SET TIME_ZONE='+00:00', co pozwoli na wymianę zrzutów w różnych strefach czasowych.
    --verbose, -v
    Tryb szczegółowego wyjścia. Wyświetlanie bardziej szczegółowych informacji o działaniu programu.
    --version, -V
    Wyświetl informacje o wersji programu.
    --where='where-condition', -w 'where-condition'
    Wykonaj zrzut tylko wybranych rekordów. Należy pamiętać, że cudzysłowy są obowiązkowe.
    --xml, -X
    Prezentuje zrzut bazy danych w formacie XML.
    --first-slave, -x
    Blokuje wszystkie tabele we wszystkich bazach danych.
    --debug=..., -#
    Śledź przebieg programu (do celów debugowania).
    --help
    Wyświetl informacje o pomocy i zakończ działanie programu.

    Uwaga: wpis mógł powstać z pomocą AI i redakcji. Odpowiedzialny: Dmytro Lomaka, Kaltenkirchen.