Jakie są optymalne ustawienia mysqldump? [Zamknięte]

14

Po niektórych poszukiwaniach uzyskałem następujące ustawienia:

    mysqldump\
    --host=localhost\
    --port=3306\
    --databases ****\
    --user=****\
    --password=****\
    --default-character-set=utf8\
    --add-drop-database\
    --add-drop-table\
    --add-locks\
    --complete-insert\
    --extended-insert\
    --lock-all-tables\
    --create-options\
    --disable-keys\
    --quick\
    --order-by-primary\
    --set-charset\
    --tz-utc\
    > dump/test.sql

Jak dotąd tak dobrze, ale mam kilka pytań dotyczących parametrów, a także wykonania.

Jeśli chodzi o moją pierwszą troskę, chcę się upewnić, że wszystkie są wymagane i nie powodują żadnych konfliktów, gdy są używane razem. Ostatecznie chciałbym stworzyć bardzo solidny i spójny plik zrzutu, zawierający miliony rekordów, który tworzy tabele, bazy danych i wstawia dane. Dobrą rzeczą jest to, że brak dostępu do bazy danych przez jakiś czas nie stanowi dla mnie problemu. Moim jedynym celem jest stworzenie solidnego i spójnego pliku zrzutu.

Jeśli chodzi o mój drugi koncert, chciałbym wiedzieć, jak uzyskać informacje, kiedy polecenie się nie powiedzie, a jeśli tak, to rzuć wyjątek.

Jakieś pomysły?

EDYTOWAĆ

To jest moja zaktualizowana komenda mysqldump na podstawie opinii RolandoMySQLDBA.

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--default-character-set=utf8\
--opt\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
--add-drop-table\
--complete-insert\
--delayed-insert\
--tz-utc\
> dump/test.sql
użytkownik706838
źródło
Przeczytaj każdy argument i jego zalety i wybierz, który ci odpowiada. Poznaj także skrypty uruchamiające awarie.
Mannoj
Chłodny. Ale to tak naprawdę nie odpowiada na moje pytanie. Na przykład, którego z nich TY zawsze używasz?
user706838,
Wybacz mi moją ignorancję, to pytanie nie dotyczy polecania książki lub strony internetowej. Myślę więc, że nie powinno to być pytanie oparte na opiniach. To powiedziano, że niektóre odpowiedzi byłyby z pewnością lepszej jakości w zależności od wiedzy specjalistycznej i poparte testami. Moim zdaniem pytanie jest doskonale sformułowane z jasno określonym celem.
user10089632,

Odpowiedzi:

30

Będziesz uważał to za szokujące, ale potrzebujesz tylko jednej głównej opcji: --opt

Co to jest --opt ?

Ta opcja, domyślnie włączona, jest skrótem dla kombinacji --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables - quick - set-charset . Daje szybką operację zrzutu i tworzy plik zrzutu, który można szybko ponownie załadować na serwer MySQL.

Ponieważ opcja - -opt jest domyślnie włączona , określasz tylko jej odwrotność, --skip-opt wyłącza kilka domyślnych ustawień. Zobacz omówienie grup opcji mysqldump, aby uzyskać informacje na temat selektywnego włączania lub wyłączania podzbioru opcji, na które wpływa opcja --opt.

Ponieważ opcja --opt jest już włączona, nie trzeba określać opcji --opt . Niezależnie od tego możesz potrzebować kilku niezbędnych opcji, które nie zostały uwzględnione.

Uruchom to zapytanie w bazie danych

SELECT engine,COUNT(1) TableCount
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')
AND table_schema NOT IN ('information_schema','mysql','performance_schema')
GROUP BY engine;

Jeśli masz wszystkie tabele InnoDB, musisz podać opcję --single-transaction . Spowoduje to automatyczną dezaktywację opcji --lock-tables i pozwoli na zrzucenie wszystkich tabel w tym samym momencie i pozwoli na nadejście nowych zapisów w tym samym czasie.

Jeśli masz jedną lub więcej tabel MyISAM, musisz określić --lock-all-tables . Spowoduje to automatyczną dezaktywację --lock-tables , dezaktywację --single-transaction , zablokowanie wszystkich tabel we wszystkich bazach danych, a następnie utworzenie zrzutu. Zapisy do tabel InnoDB mogą nadal występować, ale będą one po prostu kolejkowane do momentu zwolnienia blokad. Każde połączenie DB, które próbuje zapisać do dowolnej tabeli MyISAM, zostanie zawieszone do momentu zwolnienia wszystkich blokad.

Uruchom to zapytanie: SELECT COUNT(1) Number_Of_Stored_Procedures FROM mysql.proc;

Jeśli Number_Of_Stored_Proceduresjest większa od zera, użyj --routines .

Uruchom to zapytanie: SELECT COUNT(1) Number_Of_Triggers FROM information_schema.triggers;

Jeśli Number_Of_Triggersjest większa od zera, użyj --triggers .

PRZESTROGA : Nie używaj opcji - uporządkuj według podstawowej do zrzucania wszystkich baz danych, ponieważ może to spowodować, że indeksy BTREE będą raczej krzywe przy ładowaniu. --porządkuj według podstawowego należy używać tylko podczas zrzutu indywidualnej tabeli, o której wiesz, że ma klucz główny liczby całkowitej i będzie zawierał wiele skanów zakresu z twojej aplikacji.

Jeśli potrzebujesz bardziej kreatywnych typów kopii zapasowych mysqldump, zobacz mój stary post Jak mogę zoptymalizować mysqldump dużej bazy danych? .

Proszę przeczytać wszystkie opcje mysqldump .

AKTUALIZACJA 29.12.2014 09:44 EST

Zaktualizowałem moje polecenie mysqldump (zobacz moją edycję). Mam jednak ostatnie pytanie. Czy uważasz, że warto również zastosować wszystkie poniższe argumenty? --add-drop-database \ --add-drop-table \ --complete-insert \ --delayed-insert \ --tz-utc

Patrząc na Twój komentarz i najnowszą edycję, spójrzmy na każdą z tych opcji i sprawdź, czy potrzebujesz którejkolwiek z nich

Dostosowując najnowszą edycję, jest to szczególnie potrzebne

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
> dump/test.sql

Ponownie mówię, proszę, przeczytaj wszystkie opcje mysqldump .

RolandoMySQLDBA
źródło
Informacje o --add-drop-database: czy nie gwarantuje to również, że nie ma żadnych innych losowych tabel w bazie danych, które nie znajdują się w twoim zrzutu? Jeśli ktoś ręcznie utworzył losową tabelę testową w bazie danych, nadal istniałaby po przeładowaniu ze zrzutu bez tej opcji. To zależy od tego, czy tego chcesz, czy nie. Dobrze?
jschultz410,
Co --add-drop-trigger?
lonix,