Jak wykonać mysqldump bez pytania o hasło?

229

Chciałbym poznać polecenie wykonania mysqldump bazy danych bez pytania o hasło.

POWÓD: Chciałbym uruchomić zadanie cron, które raz dziennie pobiera mysqldump bazy danych. Dlatego nie będę mógł wstawić hasła po wyświetleniu monitu.

Jak mogę to rozwiązać?

Prakash Raman
źródło

Odpowiedzi:

412

Ponieważ używasz Ubuntu, wystarczy tylko dodać plik do katalogu domowego, a to wyłączy monit o podanie hasła mysqldump. Odbywa się to poprzez utworzenie pliku ~/.my.cnf(uprawnienia muszą wynosić 600).

Dodaj to do pliku .my.cnf

[mysqldump]
user=mysqluser
password=secret

Pozwala to połączyć się jako użytkownik MySQL, który wymaga hasła bez konieczności jego wprowadzania. Nie potrzebujesz nawet -p lub --password.

Bardzo przydatny do pisania skryptów poleceń mysql i mysqldump.

Kroki prowadzące do osiągnięcia tego celu można znaleźć w tym linku .

Alternatywnie możesz użyć następującego polecenia:

mysqldump -u [user name] -p[password] [database name] > [dump file]

ale należy pamiętać, że jest on z natury niepewny, ponieważ całe polecenie (w tym hasło) może być przeglądane przez każdego innego użytkownika w systemie podczas działania zrzutu, za pomocą prostego ps axpolecenia.

Frankline
źródło
55
zanegował inne odpowiedzi przekazując -p w linii poleceń, ponieważ każdy użytkownik może ps aux zobaczyć hasło roota lub użytkownika. Korzystanie z powyższej sugestii pliku jest najbezpieczniejsze
Eddie
19
Jeśli ustawienie globalne nie jest opcją (jeśli nie masz tylko jednej instancji mysql, z którą chcesz się połączyć), możesz ustawić plik konfiguracyjny za pomocą --defaults-file. Jak `mysqldump --defaults-file = my_other.cnf --print-defaults`
dennis
3
@kante: jest bezpieczny. Jest dostępny tylko dla użytkowników, do których należy plik .my.cnf.
Yann Sagon
7
W systemie Windows plik konfiguracyjny nie znajduje się w ~/.my.cnf. Zobacz stackoverflow.com/a/14653239/470749 . MySql spodziewał się, że mój będzie c:\wamp\bin\mysql\mysql5.5.24\my.cnf. Więc stworzyłem tam plik. Ponowne uruchomienie MySQL nie było konieczne; zadziałało natychmiast dla mojego następnego mysqldump.
Ryan
6
aby dodać poziom bezpieczeństwa, należy użyć dedykowanego użytkownika, który nie jest specyficzny dla bazy danych, tylko do odczytu, aw żadnym wypadku nie jest użytkownikiem root. Można to zrobić w następujący sposób:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou
86

Dodanie do odpowiedzi @ Frankline:

-pOpcja musi być wykluczony z poleceniem, aby używać hasła w pliku konfiguracyjnym.

Poprawny:
mysqldump –u my_username my_db > my_db.sql

Źle:
mysqldump –u my_username -p my_db > my_db.sql



.my.cnf może pominąć nazwę użytkownika.

[mysqldump]
password=my_password

Jeśli .my.cnfplik nie znajduje się w domyślnej lokalizacji i mysqldumpgo nie widzi, określ go za pomocą --defaults-file.

mysqldump --defaults-file=/path-to-file/.my.cnf –u my_username my_db > my_db.sql

Nelu
źródło
Cholera, wiele samouczków XAMPP zawiera -p bez objaśnienia. NIE działa na ominięcie pustego hasła ...
Nelson
47

Kilka odpowiedzi wspomina o umieszczeniu hasła w pliku konfiguracyjnym.

Alternatywnie możesz to zrobić ze skryptu export MYSQL_PWD=yourverysecretpassword.

Zaletą tej metody w porównaniu z użyciem pliku konfiguracyjnego jest to, że nie potrzebujesz osobnego pliku konfiguracyjnego do synchronizacji ze skryptem. Masz tylko skrypt do utrzymania.

Nie ma wady tej metody.

Hasło nie jest widoczne dla innych użytkowników w systemie (byłoby widoczne, gdyby znajdowało się w wierszu poleceń). Zmienne środowiskowe są widoczne tylko dla użytkownika uruchamiającego komendę mysql i root.

Hasło będzie również widoczne dla każdego, kto może odczytać sam skrypt, więc upewnij się, że sam skrypt jest chroniony. Nie różni się to niczym od ochrony pliku konfiguracyjnego. Możesz nadal podać hasło z oddzielnego pliku, jeśli chcesz, aby skrypt był publicznie czytelny ( export MYSQL_PWD=$(cat /root/mysql_password)na przykład). Nadal łatwiej jest wyeksportować zmienną niż zbudować plik konfiguracyjny.

Na przykład,

$ export MYSQL_PWD=$(>&2 read -s -p "Input password (will not echo): "; echo "$REPLY")
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
chutz
źródło
Chociaż ta odpowiedź nie jest tak naprawdę „niepoprawna”, nie jest jeszcze bezpieczna, wyeksportowane zmienne środowiskowe są nadal dobrze widoczne, gdy program jest uruchomiony ...
MatheusOl
4
@MatheusOl: Zmienne środowiskowe są widoczne tylko dla użytkownika root i dla samego użytkownika - ci sami użytkownicy, którzy i tak mieliby dostęp do pliku konfiguracyjnego z hasłem.
chutz
1
@mniess Mylisz się. export MYSQL_PWD=...Czy nie pojawi się na liście procesów. Nawet przez ułamek sekundy. Wynika to z tego, że exportpolecenie jest (i musi być) wbudowane w powłokę. Zatem powłoka nie rozwidla / nie wykonuje procesu z argumentem polecenia, jeśli wykonasz go w swojej powłoce.
maxschlepzig
1
@maxschlepzig masz rację. W tym przypadku nie ma to znaczenia, ponieważ wpisanie hasła w ENV sprawia, że ​​jest ono widoczne dla innych użytkowników (jak ostrzegano w dokumentacji mysql)
mniess 27.10.2019
2
@mniess Jak powiedziałem, dokumentacja mysql jest bardzo słaba i wprowadza w błąd. „należy uważać za wyjątkowo niepewne i nie należy go używać” to po prostu zła i zła rada podczas korzystania z Linuksa i innych systemów. I to nie potwierdza twojego twierdzenia, które brzmiało: „ponieważ podanie hasła w ENV i tak czyni go widocznym dla innych użytkowników”. Uwaga dodatkowa: zabawne, że Oracle nie przestaje przekazywać hasła w wierszu poleceń, co w rzeczywistości jest bardzo niepewne.
maxschlepzig
42

Aby użyć pliku znajdującego się w dowolnym miejscu systemu operacyjnego, użyj --defaults-extra-filenp .:

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > [desiredoutput].sql

Uwaga: .sqlpwdto tylko przykładowa nazwa pliku. Możesz użyć, co chcesz.

Uwaga: MySQL automatycznie sprawdzi, ~/.my.cnfktórego można użyć zamiast--defaults-extra-file

Jeśli używasz CRON jak ja, spróbuj tego!

mysqldump --defaults-extra-file=/path/.sqlpwd [database] > "$(date '+%F').sql"

Wymagane pozwolenie i zalecana własność

sudo chmod 600 /path/.sqlpwd && sudo chown $USER:nogroup /path/.sqlpwd

.sqlpwd zawartość:

[mysqldump]
user=username
password=password

Inne przykłady do przekazania .cnflub.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Jeśli chcesz automatycznie zalogować się do bazy danych, potrzebujesz [mysql]na przykład wpisu.

Możesz teraz utworzyć alias, który automatycznie łączy cię z bazą danych

alias whateveryouwant="mysql --defaults-extra-file=/path/.sqlpwd [database]"

Możesz także wpisać hasło .sqlpwdi przekazać nazwę użytkownika za pomocą skryptu / cli. Nie jestem pewien, czy poprawi to bezpieczeństwo, czy nie, to zupełnie inne pytanie.

Dla kompletności stwierdzę, że możesz wykonać następujące czynności, ale jest to bardzo niepewne i nigdy nie powinno być używane w środowisku produkcyjnym:

mysqldump -u [user_name] -p[password] [database] > [desiredoutput].sql

Uwaga: NIE ma spacji między -p a hasłem.

Np. -pPassWordJest poprawny, podczas gdy -p Passwordjest niepoprawny.

FreeSoftwareServers
źródło
2
To najlepsza odpowiedź, szczególnie w przypadku wielu baz danych i użytkowników / haseł.
Hazok
BTW, długie opcje (np. --Defaults-file) powinny być umieszczone przed krótkimi opcjami (jak -u). Testowane na mysqldump w wersji 5.7.17.
Sysadmin
@Sysadmin Argument opcji zaczyna się od jednego myślnika lub dwóch myślników, w zależności od tego, czy jest to krótka, czy długa postać nazwy opcji. Wiele opcji ma zarówno krótkie, jak i długie formy. Na przykład, -? i --help to krótkie i długie formy opcji, która instruuje program MySQL, aby wyświetlał komunikat pomocy. dev.mysql.com/doc/refman/8.0/en/command-line-options.html
FreeSoftwareServers
29

Tak to jest bardzo proste .... tylko w jednym wierszu poleceń magicznym nie więcej

mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql

i zrobione :)

Tarek Kalaji
źródło
33
Ostrzeżenie: użycie hasła w interfejsie wiersza poleceń może być niepewne.
93196.93
6
@ Yottatron Może to być niepewne, szczególnie w czasach, gdy starożytne systemy uniksowe z łatwością zalogowały 10-15 osób przez większą część dnia i bardzo się zepsuły. Na nowoczesnym VPS, podczas gdy możesz mieć 10-15 osób ostrzeliwanych i korzystających z IRC, powszechne jest, że tylko administratorzy mają dostęp do powłoki.
Christos Hayward,
3
Dzięki za to, po prostu używam go w devbox Docker. Więc bezpieczeństwo nie jest problemem.
MikeiLL,
7

Dla mnie, używając MariaDB, musiałem to zrobić: dodaj plik ~/.my.cnfi zmień uprawnienia, wykonując chmod 600 ~/.my.cnf. Następnie dodaj swoje dane do pliku. Magicznym elementem, którego mi brakowało, było to, że hasło musi znajdować się pod blokiem klienta (ref: docs ), tak:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Jeśli zdarzy ci się tu przyjechać i szukać sposobu na wykonanie mysqldump z MariaDB. Umieść hasło pod blokiem [klienta], a następnie użytkownika pod blokiem [mysqldump].

Michael Johansen
źródło
Używam również MariaDB (konkretnie 10.4) i po prostu umieściłem hasło w tej [mysqldump]sekcji i zadziałało bez żadnych problemów. Ubuntu 18.04 LTS
Paul Davis
3

Oto rozwiązanie dla Dockera w skrypcie / bin / sh:

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]" > /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user=root" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "password=$MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'

docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump --defaults-extra-file=/root/mysql-credentials.cnf --all-databases'

Zamień [MYSQL_CONTAINER_NAME]i upewnij się, że zmienna środowiskowa MYSQL_ROOT_PASSWORDjest ustawiona w twoim kontenerze.

Mam nadzieję, że to ci pomoże, bo może mi pomóc!

pcmanprogrammeur
źródło
0

Mam następujące.

/ etc / mysqlpwd

[mysql]
user=root
password=password

Z następującym aliasem.

alias 'mysql -p'='mysql --defaults-extra-file=/etc/mysqlpwd'

Aby wykonać przywracanie, używam po prostu:

mysql -p [database] [file.sql]
jastrząb
źródło
-2

co z --password = "" działało dla mnie w wersji 5.1.51

mysqldump -h localhost -u <user> --password="<password>"
Joe Velez
źródło
w tym --password=xxxw wierszu poleceń spowoduje, że hasło widoczne dla każdego z umiejętnością czytania proc (czy pełną ps) - co jest dość domyślna.
Rafa
-11

Zdecydowanie myślę, że lepiej i bezpieczniej byłoby umieścić pełną linię cmd w głównym pliku crontab, z listami uwierzytelniającymi. Przynajmniej edycja crontab jest ograniczona (czytelna) dla kogoś, kto już zna hasło ... więc nie martw się, aby pokazać je zwykłym tekstem ...

Jeśli potrzebujesz czegoś więcej niż zwykłego mysqldump ... po prostu umieść skrypt bash, który akceptuje credentails jako parametry i wykonuje wszystkie udogodnienia wewnątrz ...

Plik bas w prosty sposób

#!/bin/bash
mysqldump -u$1 -p$2 yourdbname > /your/path/save.sql

W Crontab:

0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log
kante
źródło
3
Nie, nie byłoby bezpieczniej, gdy dodasz hasło do wiersza poleceń, będzie ono widoczne dla każdego, kto ma umiejętność czytania proc (lub pełnego ps) - co jest dość domyślne. Po dodaniu pliku .my.cnf i ustawieniu 600 praw jest on widoczny tylko dla Ciebie.
rombarcz
-21

Możesz określić hasło w wierszu poleceń w następujący sposób:

mysqldump -h <host> -u <user> -p<password> dumpfile

Opcje mysqldump uwzględniają wielkość liter!

jx12345
źródło
nie, to nie działa, nie sądzę, że rozumie, że -p to hasło
Prakash Raman
1
Nie jestem pewien, jak uzyskał 1 głos, głosuję za tym. Jak widać w innych odpowiedziach tutaj, pomiędzy -p a danym hasłem nie powinno być spacji. Powinieneś również przekierować dane wyjściowe do pliku zrzutu, a nie określać go w trakcie pracy, w przeciwnym razie zostanie przyjęta nazwa tabeli. @buzypi powiedział to najlepiej.
Neek
powinien działać (chociaż jest niepewny, ponieważ inni użytkownicy mogą łatwo zobaczyć hasło), musisz tylko upewnić się, że nie ma spacji między -p a hasłem, np.mysqldump -u root -pmypassword
jx12345