Як виконати mysqldump без запрошення пароля?


229

Я хотів би знати команду виконувати mysqldump бази даних без запиту пароля.

ПРИЧИНА: Я хотів би запустити роботу з крон, яка щодня щодня займає mysqldump бази даних. Тому я не зможу вставити пароль, коли буде запропоновано.

Як я міг це вирішити?

Відповіді:


412

Оскільки ви використовуєте Ubuntu, все, що вам потрібно зробити, це лише додати файл у домашній каталог, і це вимкне запит пароля mysqldump. Це робиться шляхом створення файлу ~/.my.cnf(дозволів має бути 600).

Додайте це до файлу .my.cnf

[mysqldump]
user=mysqluser
password=secret

Це дозволяє вам підключитися як користувач MySQL, якому потрібен пароль, не вводячи його фактично. Вам навіть не потрібен -p або --password.

Дуже зручно для написання команд mysql та mysqldump.

Етапи досягнення цього можна знайти за цим посиланням .

Крім того, ви можете використовувати таку команду:

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

але майте на увазі, що вона за своєю суттю небезпечна, оскільки всю команду (включаючи пароль) може переглядати будь-який інший користувач у системі під час роботи дампа за допомогою простої ps axкоманди.


55
відхилив інші відповіді, передаючи -p у командному рядку, оскільки будь-який користувач може ps aux побачити root або пароль користувача. Використання запропонованого файлу вище є найбільш безпечним
Едді,

19
Якщо глобальна настройка не є опцією (якщо у вас є не один екземпляр mysql для підключення), ви можете встановити файл конфігурації через --defaults-file. Як `mysqldump --defaults-file = my_other.cnf --print-defaults`
dennis

3
@kante: це безпечно. Він доступний лише тим користувачам, яким належить файл .my.cnf.
Янн Сагон

7
У Windows файл конфігурації відсутній ~/.my.cnf. Дивіться stackoverflow.com/a/14653239/470749 . MySql очікував, що мій буде c:\wamp\bin\mysql\mysql5.5.24\my.cnf. Тому я створив там файл. Перезапуск Mysql не був необхідним; він працював негайно для мого наступного mysqldump.
Райан

6
щоб додати рівень безпеки, ви повинні використовувати спеціальний користувач, не призначений для баз даних, лише користувач, який читається, і ні в якому разі не користувач root. Зробити це можна так:GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
gadjou

86

Додавання до відповіді @ Frankline:

-pВаріант повинен бути виключений з команди, щоб використовувати пароль в файлі конфігурації.

Правильно:
mysqldump –u my_username my_db > my_db.sql

Неправильно:
mysqldump –u my_username -p my_db > my_db.sql



.my.cnf може опустити ім'я користувача.

[mysqldump]
password=my_password

Якщо ваш .my.cnfфайл не знаходиться за замовчуванням і mysqldumpне бачить його, вкажіть його, використовуючи --defaults-file.

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


Чорт, багато навчальних посібників XAMPP включають -p, не пояснюючи це. Це НЕ працює для обходу порожнього пароля ...
Нельсон,

47

Кілька відповідей згадують про введення пароля у файл конфігурації.

Крім того, зі свого сценарію ви можете export MYSQL_PWD=yourverysecretpassword.

Перевагою цього методу в порівнянні з використанням файла конфігурації є те, що вам не потрібен окремий файл конфігурації, щоб підтримувати синхронізацію зі своїм сценарієм. У вас є лише сценарій для підтримки.

Немає недоліків у цього методу.

Пароль не видно іншим користувачам у системі (було б видно, якщо він знаходиться в командному рядку). Змінні середовища видно лише користувачеві, який виконує команду mysql та root.

Пароль також буде видимий для всіх, хто може сам прочитати сценарій, тому переконайтеся, що сам скрипт захищений. Це нічим не відрізняється від захисту файлу конфігурації. Ви все одно можете отримати джерело пароля з окремого файлу, якщо хочете, щоб сценарій був загальнодоступним ( export MYSQL_PWD=$(cat /root/mysql_password)наприклад). Все ж простіше експортувати змінну, ніж створити файл конфігурації.

Наприклад,

$ 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 */;

Хоча ця відповідь насправді не "неправильна", вона ще не захищена, експортовані змінні середовища все ще легко помітні під час роботи програми ...
MatheusOl

4
@MatheusOl: Змінні середовища бачать лише корінь, а сам користувач - ті самі користувачі, які б у будь-якому випадку мали доступ до файлу конфігурації, що містить пароль.
chutz

1
@mniess Ви неправі. export MYSQL_PWD=...Ніяк НЕ відображається в списку процесів. Навіть ні на частку секунди. Це тому, що exportкоманда є (і повинна бути) вбудованою оболонкою. Таким чином, оболонка не розщеплює / не виконує процес з аргументом команди, якщо ви виконуєте його у своїй оболонці.
maxschlepzig

1
@maxschlepzig ви праві. У цьому випадку це не має значення, оскільки введення пароля в ENV робить його видимим іншим користувачам у будь-якому випадку (про що попереджено в документації на mysql)
mniess

2
@mniess Як я вже говорив, документація на mysql дуже бідна і вводить в оману. "треба вважати надзвичайно небезпечним і не повинен використовуватися" - це просто неправильна та погана порада при використанні Linux та інших систем. І це не підтримує вашу претензію, яка була: "оскільки введення пароля в ENV робить його видимим для інших користувачів все одно". Побічна примітка: хоч смішно, як Oracle не заставляє передавати пароль у командному рядку, що насправді є надзвичайно небезпечним.
maxschlepzig

42

Щоб використовувати файл, який знаходиться в будь-якій точці ОС, використовуйте, --defaults-extra-fileнаприклад:

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

Примітка: .sqlpwdце лише приклад файлу. Ви можете використовувати все, що завгодно.

Примітка: MySQL автоматично перевіриться ~/.my.cnf що можна використовувати замість--defaults-extra-file

Якщо ви використовуєте CRON, як я, спробуйте це!

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

Необхідний дозвіл та рекомендована власність

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

.sqlpwd вміст:

[mysqldump]
user=username
password=password

Інші приклади для передачі .cnfабо.sqlpwd

[mysql]
user=username
password=password

[mysqldiff]
user=username
password=password

[client]
user=username
password=password

Якщо ви хочете авторизуватися в базі даних автоматично, вам знадобиться [mysql]запис, наприклад.

Тепер ви можете зробити псевдонім, який автоматично підключає вас до БД

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

Ви можете також вставити пароль всередину .sqlpwdта передати ім'я користувача через скрипт / кліп. Я не впевнений, покращить це безпека чи ні, це було б зовсім іншим питанням.

Для повноти я зазначу, що ви можете зробити наступне, але це надзвичайно небезпечно і ніколи не повинно використовуватися у виробничих умовах:

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

Примітка: між -p та паролем немає місця.

Наприклад -pPassWord, правильно, а -p Passwordневірно.


2
Це найкраща відповідь, особливо при розгляді декількох баз даних та користувачів / паролів.
Хазок

BTW, довгі параметри (наприклад, --defaults-file) повинні бути розміщені перед короткими параметрами (наприклад, -u). Тестовано на mysqldump версії 5.7.17.
Сисадмін

@Sysadmin Аргумент параметра починається з одного тире чи двох тире, залежно від того, чи це коротка форма чи довга форма імені параметра. Багато варіантів мають як короткі, так і довгі форми. Наприклад, -? та --help - це короткі та довгі форми опції, яка доручає програмі MySQL відображати її довідкове повідомлення. dev.mysql.com/doc/refman/8.0/uk/command-line-options.html
FreeSoftwareServers

29

Так, це дуже просто .... просто в одному магічному командному рядку більше немає

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

і готово :)


33
Попередження: Використання пароля в інтерфейсі командного рядка може бути небезпечним.
93196.93

6
@Yottatron Це може бути невпевнено, особливо в той час, коли в древніх системах Unix легко було ввійти в систему 10-15 людей протягом більшої частини дня і ви заграли. У сучасних VPS, хоча у вас може бути 10-15 людей, які обстрілюються та користуються IRC, доступ до оболонки звичайний лише для адміністраторів.
Крістос Хейвард

3
Дякую за це, я просто використовую його в розробнику Docker. Тож безпека не проблема.
MikeiLL

7

Для мене, використовуючи MariaDB, я повинен був зробити це: додати файл ~/.my.cnfі змінити дозволи, виконавши chmod 600 ~/.my.cnf. Потім додайте свої файли у файл. Чарівний фрагмент, який мені не вистачало, полягав у тому, що пароль повинен знаходитися під клієнтським блоком (ref: docs ), наприклад:

[client]
password = "my_password"

[mysqldump]
user = root
host = localhost

Якщо ви завітаєте сюди шукати, як зробити mysqldump з MariaDB. Помістіть пароль під блоком [client], а потім користувачем під блоком [mysqldump].


Я також використовую MariaDB (10.4, щоб бути конкретним), і я просто поклав пароль під [mysqldump]розділ, і він працював без проблем. Ubuntu 18.04 LTS
Пол Девіс

3

Ось рішення для Docker у скрипті / 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'

Замініть [MYSQL_CONTAINER_NAME]і переконайтеся, що змінна середовищеMYSQL_ROOT_PASSWORD встановлена ​​у вашому контейнері.

Сподіваюся, це допоможе тобі, як воно могло допомогти мені!


0

У мене є таке.

/ і т.д. / mysqlpwd

[mysql]
user=root
password=password

З наступним псевдонімом.

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

Для відновлення я просто використовую:

mysql -p [database] [file.sql]

-2

що про --password = "" працював для мене, працюючи 5.1.51

mysqldump -h localhost -u <user> --password="<password>"

в тому числі --password=xxxв командному рядку зробить пароль видимим для всіх, хто має можливість читати proc (або робити повний ps) - що досить за замовчуванням.
Рафа

-11

Безумовно, я вважаю, що було б краще і безпечніше розмістити повний cmd рядок у кореневому кронтабі, з обліковими записами. Принаймні, редагування crontab обмежене (читабельне) для того, хто вже знає пароль .. тому не хвилюйтеся показувати його у простому тексті ...

Якщо вам потрібно більше, ніж простий mysqldump ... просто поставте скрипт bash, який приймає облікові дані як парами і виконує всі зручності всередині ...

Файл bas в простому

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

У Crontab:

0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log

3
Ні, це не було б безпечніше, коли ви додаєте пароль до командного рядка, це видно для всіх, хто має можливість читати proc (або робити повний ps) - що досить за замовчуванням. Коли ви додасте файл .my.cnf і встановите 600 прав, він буде видимий лише ВАМ.
rombarcz

-21

Ви можете вказати пароль у командному рядку наступним чином:

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

Варіанти для mysqldump - це чутливий регістр!


Ні, це не працює, я не думаю, що він розуміє, що -p - пароль
Пракаш Раман

1
Не впевнений, як це отримав 1 голос, я спростовую це. Як видно з інших відповідей тут, між -p та заданим паролем не повинно бути місця. Також слід переспрямувати вихід на dumpfile, а не вказувати його як ви робите, інакше це буде вважати назвою таблиці. @buzypi сказав, що найкраще.
Neek

він повинен працювати (хоча це невпевнено в тому, що іншим користувачам досить просто бачити пароль), вам просто потрібно переконатися, що між -p та паролем немає місця, наприкладmysqldump -u root -pmypassword
jx12345
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.